]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/pwupd.c
Grammar and spelling fixes
[pw-darwin.git] / pw / pwupd.c
index e13ce5f74cc2cad552331e19709d564d9e7eaeef..8e5fb324a61ddeadd4a60e6a74c4ad094364a719 100644 (file)
@@ -1,26 +1,20 @@
 /*-
 /*-
- * Copyright (c) 1996 by David L. Nugent <davidn@blaze.net.au>.
- * All rights reserved.
+ * Copyright (C) 1996
+ *     David L. Nugent.  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
  *
  * 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 as
- *    the first lines of this file unmodified.
+ *    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.
  * 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 David L. Nugent.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
  *
- * THIS SOFTWARE IS PROVIDED BY THE DAVID L. NUGENT ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY DAVID L. NUGENT 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
  * 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 DAVID L. NUGENT BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL DAVID L. NUGENT 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)
  * 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)
  * 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.
  * 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.
- *
- *     $Id$
  */
 
  */
 
+#ifndef lint
+static const char rcsid[] =
+       "$Id: pwupd.c,v 1.7 1998/02/11 23:31:24 wosch Exp $";
+#endif /* not lint */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/param.h>
 #include <sys/wait.h>
 #include <sys/wait.h>
-#include <stdarg.h>
 
 #include "pwupd.h"
 
 
 #include "pwupd.h"
 
-static int
+#define HAVE_PWDB_C    1
+
+static char pathpwd[] = _PATH_PWD;
+static char * pwpath = pathpwd;
+int
+setpwdir(const char * dir)
+{
+       if (dir == NULL)
+               return -1;
+       else {
+               char * d = malloc(strlen(dir)+1);
+               if (d == NULL)
+                       return -1;
+               pwpath = strcpy(d, dir);
+       }
+       return 0;
+}
+
+char *
+getpwpath(char const * file)
+{
+       static char pathbuf[MAXPATHLEN];
+
+       snprintf(pathbuf, sizeof pathbuf, "%s/%s", pwpath, file);
+       return pathbuf;
+}
+
+int
 pwdb(char *arg,...)
 {
        int             i = 0;
        pid_t           pid;
        va_list         ap;
 pwdb(char *arg,...)
 {
        int             i = 0;
        pid_t           pid;
        va_list         ap;
-       char           *args[8];
+       char           *args[10];
 
        args[i++] = _PATH_PWD_MKDB;
        va_start(ap, arg);
 
        args[i++] = _PATH_PWD_MKDB;
        va_start(ap, arg);
@@ -59,7 +84,11 @@ pwdb(char *arg,...)
                args[i++] = arg;
                arg = va_arg(ap, char *);
        }
                args[i++] = arg;
                arg = va_arg(ap, char *);
        }
-       args[i++] = _PATH_MASTERPASSWD;
+       if (pwpath != pathpwd) {
+               args[i++] = "-d";
+               args[i++] = pwpath;
+       }
+       args[i++] = getpwpath(_MASTERPASSWD);
        args[i] = NULL;
 
        if ((pid = fork()) == -1)       /* Error (errno set) */
        args[i] = NULL;
 
        if ((pid = fork()) == -1)       /* Error (errno set) */
@@ -110,14 +139,19 @@ pw_update(struct passwd * pwd, char const * user, int mode)
 {
        int             rc = 0;
 
 {
        int             rc = 0;
 
-       endpwent();
+       ENDPWENT();
 
        /*
         * First, let's check the see if the database is alright
 
        /*
         * First, let's check the see if the database is alright
+        * Note: -C is only available in FreeBSD 2.2 and above
         */
         */
-       if (pwdb("-c", NULL) == 0) {    /* Check only */
+#ifdef HAVE_PWDB_C
+       if (pwdb("-C", NULL) == 0) {    /* Check only */
+#else
+       {                               /* No -C */
+#endif
                char            pfx[32];
                char            pfx[32];
-               char            pwbuf[MAXPWLINE];
+               char            pwbuf[PWBUFSZ];
                int             l = sprintf(pfx, "%s:", user);
 
                /*
                int             l = sprintf(pfx, "%s:", user);
 
                /*
@@ -127,14 +161,14 @@ pw_update(struct passwd * pwd, char const * user, int mode)
                        *pwbuf = '\0';
                else
                        fmtpwentry(pwbuf, pwd, PWF_PASSWD);
                        *pwbuf = '\0';
                else
                        fmtpwentry(pwbuf, pwd, PWF_PASSWD);
-               if ((rc = fileupdate(_PATH_PASSWD, 0644, pwbuf, pfx, l, mode)) != 0) {
+               if ((rc = fileupdate(getpwpath(_PASSWD), 0644, pwbuf, pfx, l, mode)) != 0) {
 
                        /*
                         * Then the master.passwd file
                         */
                        if (pwd != NULL)
                                fmtpwentry(pwbuf, pwd, PWF_MASTER);
 
                        /*
                         * Then the master.passwd file
                         */
                        if (pwd != NULL)
                                fmtpwentry(pwbuf, pwd, PWF_MASTER);
-                       if ((rc = fileupdate(_PATH_MASTERPASSWD, 0644, pwbuf, pfx, l, mode)) != 0)
+                       if ((rc = fileupdate(getpwpath(_MASTERPASSWD), 0644, pwbuf, pfx, l, mode)) != 0)
                                rc = pwdb(NULL) == 0;
                }
        }
                                rc = pwdb(NULL) == 0;
                }
        }