[BACK]Return to pw_copy.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / chpass

Diff for /src/usr.bin/chpass/Attic/pw_copy.c between version 1.1 and 1.2

version 1.1, 1995/10/18 08:44:59 version 1.2, 1996/05/22 11:35:22
Line 1 
Line 0 
 /*      $NetBSD: pw_copy.c,v 1.3 1995/03/26 04:55:30 glass Exp $        */  
   
 /*-  
  * Copyright (c) 1990, 1993, 1994  
  *      The Regents of the University of California.  All rights reserved.  
  *  
  * Redistribution and use in source and binary forms, with or without  
  * modification, are permitted provided that the following conditions  
  * are met:  
  * 1. Redistributions of source code must retain the above copyright  
  *    notice, this list of conditions and the following disclaimer.  
  * 2. Redistributions in binary form must reproduce the above copyright  
  *    notice, this list of conditions and the following disclaimer in the  
  *    documentation and/or other materials provided with the distribution.  
  * 3. All advertising materials mentioning features or use of this software  
  *    must display the following acknowledgement:  
  *      This product includes software developed by the University of  
  *      California, Berkeley and its contributors.  
  * 4. Neither the name of the University nor the names of its contributors  
  *    may be used to endorse or promote products derived from this software  
  *    without specific prior written permission.  
  *  
  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND  
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE  
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  
  * 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.  
  */  
   
 #ifndef lint  
 #if 0  
 static char sccsid[] = "@(#)pw_copy.c   8.4 (Berkeley) 4/2/94";  
 #else  
 static char rcsid[] = "$NetBSD: pw_copy.c,v 1.3 1995/03/26 04:55:30 glass Exp $";  
 #endif  
 #endif /* not lint */  
   
 /*  
  * This module is used to copy the master password file, replacing a single  
  * record, by chpass(1) and passwd(1).  
  */  
   
 #include <err.h>  
 #include <pwd.h>  
 #include <stdio.h>  
 #include <string.h>  
   
 #include <pw_util.h>  
 #include "pw_copy.h"  
   
 extern char *tempname;  
   
 void  
 pw_copy(ffd, tfd, pw)  
         int ffd, tfd;  
         struct passwd *pw;  
 {  
         FILE *from, *to;  
         int done;  
         char *p, buf[8192];  
   
         if (!(from = fdopen(ffd, "r")))  
                 pw_error(_PATH_MASTERPASSWD, 1, 1);  
         if (!(to = fdopen(tfd, "w")))  
                 pw_error(tempname, 1, 1);  
   
         for (done = 0; fgets(buf, sizeof(buf), from);) {  
                 if (!strchr(buf, '\n')) {  
                         warnx("%s: line too long", _PATH_MASTERPASSWD);  
                         pw_error(NULL, 0, 1);  
                 }  
                 if (done) {  
                         (void)fprintf(to, "%s", buf);  
                         if (ferror(to))  
                                 goto err;  
                         continue;  
                 }  
                 if (!(p = strchr(buf, ':'))) {  
                         warnx("%s: corrupted entry", _PATH_MASTERPASSWD);  
                         pw_error(NULL, 0, 1);  
                 }  
                 *p = '\0';  
                 if (strcmp(buf, pw->pw_name)) {  
                         *p = ':';  
                         (void)fprintf(to, "%s", buf);  
                         if (ferror(to))  
                                 goto err;  
                         continue;  
                 }  
                 (void)fprintf(to, "%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s\n",  
                     pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid,  
                     pw->pw_class, pw->pw_change, pw->pw_expire, pw->pw_gecos,  
                     pw->pw_dir, pw->pw_shell);  
                 done = 1;  
                 if (ferror(to))  
                         goto err;  
         }  
         if (!done)  
                 (void)fprintf(to, "%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s\n",  
                     pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid,  
                     pw->pw_class, pw->pw_change, pw->pw_expire, pw->pw_gecos,  
                     pw->pw_dir, pw->pw_shell);  
   
         if (ferror(to))  
 err:            pw_error(NULL, 1, 1);  
         (void)fclose(to);  
 }  

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2