]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/fileupd.c
Simplify copying of group members by using memcpy
[pw-darwin.git] / pw / fileupd.c
index 9dd63c954dea3d1c3717568a9377a70d72e9e863..7df4bb190cbb024b8ba75a1bb95661dfc4d30228 100644 (file)
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- *     $FreeBSD$
  */
 
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
 #include <stdio.h>
 #include <fcntl.h>
 #include <stdlib.h>
@@ -63,126 +66,3 @@ extendarray(char ***buf, int * buflen, int needed)
        }
        return *buflen;
 }
-
-
-int
-fileupdate(char const * filename, mode_t fmode, char const * newline, char const * prefix, int pfxlen, int updmode)
-{
-       int             rc = 0;
-
-       if (pfxlen <= 1)
-               errno = EINVAL;
-       else {
-               int             infd = open(filename, O_RDWR | O_CREAT | O_EXLOCK, fmode);
-
-               if (infd != -1) {
-                       FILE           *infp = fdopen(infd, "r+");
-
-                       if (infp == NULL)
-                               close(infd);
-                       else {
-                               int             outfd;
-                               char            file[MAXPATHLEN];
-
-                               strcpy(file, filename);
-                               strcat(file, ".new");
-                               outfd = open(file, O_RDWR | O_CREAT | O_TRUNC | O_EXLOCK, fmode);
-                               if (outfd != -1) {
-                                       FILE           *outfp = fdopen(outfd, "w+");
-
-                                       if (outfp == NULL)
-                                               close(outfd);
-                                       else {
-                                               int             updated = UPD_CREATE;
-                                               int             linesize = PWBUFSZ;
-                                               char           *line = malloc(linesize);
-
-                                       nextline:
-                                               while (fgets(line, linesize, infp) != NULL) {
-                                                       char           *p = strchr(line, '\n');
-
-                                                       while ((p = strchr(line, '\n')) == NULL) {
-                                                               int     l;
-                                                               if (extendline(&line, &linesize, linesize + PWBUFSZ) == -1) {
-                                                                       int     ch;
-                                                                       fputs(line, outfp);
-                                                                       while ((ch = fgetc(infp)) != EOF) {
-                                                                               fputc(ch, outfp);
-                                                                               if (ch == '\n')
-                                                                                       break;
-                                                                       }
-                                                                       goto nextline;
-                                                               }
-                                                               l = strlen(line);
-                                                               if (fgets(line + l, linesize - l, infp) == NULL)
-                                                                       break;
-                                                       }
-                                                       if (*line != '#' && *line != '\n') {
-                                                               if (!updated && strncmp(line, prefix, pfxlen) == 0) {
-                                                                       updated = updmode == UPD_REPLACE ? UPD_REPLACE : UPD_DELETE;
-
-                                                                       /*
-                                                                        * Only actually write changes if updating
-                                                                        */
-                                                                       if (updmode == UPD_REPLACE)
-                                                                               strcpy(line, newline);
-                                                                       else if (updmode == UPD_DELETE)
-                                                                               continue;
-                                                               }
-                                                       }
-                                                       fputs(line, outfp);
-                                               }
-
-                                               /*
-                                                * Now, we need to decide what to do: If we are in
-                                                * update mode, and no record was updated, then error If
-                                                * we are in insert mode, and record already exists,
-                                                * then error
-                                                */
-                                               if (updmode != updated)
-                                                       errno = (updmode == UPD_CREATE) ? EEXIST : ENOENT;
-                                               else {
-
-                                                       /*
-                                                        * If adding a new record, append it to the end
-                                                        */
-                                                       if (updmode == UPD_CREATE)
-                                                               fputs(newline, outfp);
-
-                                                       /*
-                                                        * Flush the file and check for the result
-                                                        */
-                                                       rc = fflush(outfp) != EOF;
-                                                       if (rc) {
-
-                                                               /*
-                                                                * Copy data back into the
-                                                                * original file and truncate
-                                                                */
-                                                               rewind(infp);
-                                                               rewind(outfp);
-                                                               while (fgets(line, linesize, outfp) != NULL)
-                                                                       fputs(line, infp);
-
-                                                               /*
-                                                                * This is a gross hack, but we may have
-                                                                * corrupted the original file
-                                                                * Unfortunately, it will lose the inode.
-                                                                */
-                                                               if (fflush(infp) == EOF || ferror(infp))
-                                                                       rc = rename(file, filename) == 0;
-                                                               else
-                                                                       ftruncate(infd, ftell(infp));
-                                                       }
-                                               }
-                                               free(line);
-                                               fclose(outfp);
-                                       }
-                                       remove(file);
-                               }
-                               fclose(infp);
-                       }
-               }
-       }
-       return rc;
-}