]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/fileupd.c
Revert the libcrypt/libmd stuff back to how it was. This should not have
[pw-darwin.git] / pw / fileupd.c
index 9dd63c954dea3d1c3717568a9377a70d72e9e863..a846513dbea3e15050a26aa0c65d08a939b80cf8 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>
@@ -68,38 +71,44 @@ extendarray(char ***buf, int * buflen, int needed)
 int
 fileupdate(char const * filename, mode_t fmode, char const * newline, char const * prefix, int pfxlen, int updmode)
 {
-       int             rc = 0;
+       int     rc = 0;
 
        if (pfxlen <= 1)
-               errno = EINVAL;
+               rc = EINVAL;
        else {
-               int             infd = open(filename, O_RDWR | O_CREAT | O_EXLOCK, fmode);
+               int    infd = open(filename, O_RDWR | O_CREAT, fmode);
 
-               if (infd != -1) {
-                       FILE           *infp = fdopen(infd, "r+");
+               if (infd == -1)
+                       rc = errno;
+               else {
+                       FILE   *infp = fdopen(infd, "r+");
 
-                       if (infp == NULL)
+                       if (infp == NULL) {
+                               rc = errno;             /* Assumes fopen(3) sets errno from open(2) */
                                close(infd);
-                       else {
-                               int             outfd;
-                               char            file[MAXPATHLEN];
+                       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 (outfd == -1)
+                                       rc = errno;
+                               else {
+                                       FILE    *outfp = fdopen(outfd, "w+");
 
-                                       if (outfp == NULL)
+                                       if (outfp == NULL) {
+                                               rc = errno;
                                                close(outfd);
-                                       else {
-                                               int             updated = UPD_CREATE;
+                                       else {
+                                               int   updated = UPD_CREATE;
                                                int             linesize = PWBUFSZ;
-                                               char           *line = malloc(linesize);
+                                               char  *line = malloc(linesize);
 
                                        nextline:
                                                while (fgets(line, linesize, infp) != NULL) {
-                                                       char           *p = strchr(line, '\n');
+                                                       char  *p = strchr(line, '\n');
 
                                                        while ((p = strchr(line, '\n')) == NULL) {
                                                                int     l;
@@ -140,7 +149,11 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const
                                                 * then error
                                                 */
                                                if (updmode != updated)
-                                                       errno = (updmode == UPD_CREATE) ? EEXIST : ENOENT;
+                                                       /* -1 return means:
+                                                        * update,delete=no user entry
+                                                        * create=entry exists
+                                                        */
+                                                       rc = -1;
                                                else {
 
                                                        /*
@@ -152,9 +165,9 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const
                                                        /*
                                                         * Flush the file and check for the result
                                                         */
-                                                       rc = fflush(outfp) != EOF;
-                                                       if (rc) {
-
+                                                       if (fflush(outfp) == EOF)
+                                                               rc = errno;     /* Failed to update */
+                                                       else {
                                                                /*
                                                                 * Copy data back into the
                                                                 * original file and truncate
@@ -165,12 +178,16 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const
                                                                        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.
+                                                                * Unfortunately, it will lose the inode
+                                                                * and hence the lock.
                                                                 */
                                                                if (fflush(infp) == EOF || ferror(infp))
-                                                                       rc = rename(file, filename) == 0;
+                                                                       rename(file, filename);
                                                                else
                                                                        ftruncate(infd, ftell(infp));
                                                        }