X-Git-Url: https://git.cameronkatri.com/pw-darwin.git/blobdiff_plain/e3d97c779d907e3556a40a69b84f001d95cf4d6a..6f9e060eaafec4d7157f90f32e8d2d580fd73a71:/pw/fileupd.c?ds=sidebyside diff --git a/pw/fileupd.c b/pw/fileupd.c index d76259b..7df4bb1 100644 --- a/pw/fileupd.c +++ b/pw/fileupd.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id: fileupd.c,v 1.6 1998/07/16 17:18:24 nate Exp $"; + "$FreeBSD$"; #endif /* not lint */ #include @@ -66,132 +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, 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); - - /* - * 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 - * Unfortunately, it will lose the inode - * and hence the lock. - */ - if (fflush(infp) == EOF || ferror(infp)) { - rc = errno; /* Preserve errno for return */ - rename(file, filename); - } - else - ftruncate(infd, ftell(infp)); - } - } - free(line); - fclose(outfp); - } - remove(file); - } - fclose(infp); - } - } - } - return rc; -}