]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/fileupd.c
Fix pw(8) deletion of group "username" on userdel even if group "username"
[pw-darwin.git] / pw / fileupd.c
index b88f4fa8539f5eb778959f39ce680ee7657fa79d..7df4bb190cbb024b8ba75a1bb95661dfc4d30228 100644 (file)
@@ -66,138 +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)
-               rc = EINVAL;
-       else {
-               int    infd = open(filename, O_RDWR | O_CREAT | O_EXLOCK, fmode);
-
-               if (infd == -1)
-                       rc = errno;
-               else {
-                       FILE   *infp = fdopen(infd, "r+");
-
-                       if (infp == NULL) {
-                               rc = errno;             /* Assumes fopen(3) sets errno from open(2) */
-                               close(infd);
-                       } else {
-                               int       outfd;
-                               char      file[MAXPATHLEN];
-
-                               strcpy(file, filename);
-                               strcat(file, ".new");
-                               outfd = open(file, O_RDWR | O_CREAT | O_TRUNC, fmode);
-                               if (outfd == -1)
-                                       rc = errno;
-                               else {
-                                       FILE    *outfp = fdopen(outfd, "w+");
-
-                                       if (outfp == NULL) {
-                                               rc = errno;
-                                               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)
-                                                       /* -1 return means:
-                                                        * update,delete=no user entry
-                                                        * create=entry exists
-                                                        */
-                                                       rc = -1;
-                                               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
-                                                        */
-                                                       if (fflush(outfp) == EOF)
-                                                               rc = errno;     /* Failed to update */
-                                                       else {
-                                                               /*
-                                                                * Copy data back into the
-                                                                * original file and truncate
-                                                                */
-                                                               rewind(infp);
-                                                               rewind(outfp);
-                                                               while (fgets(line, linesize, outfp) != NULL)
-                                                                       fputs(line, infp);
-
-                                                               /*
-                                                                * If there was a problem with copying
-                                                                * we will just rename 'file.new' 
-                                                                * to 'file'.
-                                                                * This is a gross hack, but we may have
-                                                                * corrupted the original file
-                                                                */
-                                                               if (fflush(infp) == EOF || ferror(infp))
-                                                                       rename(file, filename);
-                                                               else
-                                                                       ftruncate(infd, ftell(infp));
-                                                       }
-                                               }
-                                               free(line);
-                                               fclose(outfp);
-                                       }
-                                       remove(file);
-                               }
-                               fclose(infp);
-                       }
-               }
-       }
-       return rc;
-}