]> git.saurik.com Git - apple/system_cmds.git/blobdiff - chpass.tproj/edit.c
system_cmds-336.13.tar.gz
[apple/system_cmds.git] / chpass.tproj / edit.c
index e6a16caf7372f1dab8ba5aeedf9142948110cb70..855300f471e5545d3273bc8204f94d9557a88490 100644 (file)
@@ -3,22 +3,21 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.0 (the 'License').  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License."
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
 #include <pw_util.h>
 
 #include "chpass.h"
+#ifdef DIRECTORY_SERVICE
+#include "directory_service.h"
+
+extern int dswhere;
+#endif /* DIRECTORY_SERVICE */
 
 extern char *tempname;
 
@@ -109,12 +113,68 @@ display(fd, pw)
 {
        FILE *fp;
        char *bp, *p, *ttoa();
+#ifdef DIRECTORY_SERVICE
+       ENTRY *ep;
+       struct display d;
+       int ndisplayed = 0;
+#endif /* DIRECTORY_SERVICE */
 
        if (!(fp = fdopen(fd, "w")))
                pw_error(tempname, 1, 1);
 
        (void)fprintf(fp,
-           "#Changing user database information for %s.\n", pw->pw_name);
+           "# Changing user database information for %s.\n"
+           "#\n"
+           "# (use \"passwd\" to change the password)\n"
+           "##\n",
+           pw->pw_name);
+            
+#ifdef DIRECTORY_SERVICE
+       switch (dswhere) {
+       case WHERE_FILES:
+           (void)fprintf(fp,
+               "# Flat file: /etc/master.passwd\n"
+               "##\n");
+           break;
+       case WHERE_LOCALNI:
+           (void)fprintf(fp,
+               "# Local NetInfo Database\n"
+               "##\n");
+           break;
+       }
+       d.pw = pw;
+       bp = pw->pw_gecos;
+       p = strsep(&bp, ",");
+       d.fullname =  (p ? p : "");
+       p = strsep(&bp, ",");
+       d.location = (p ? p : "");
+       p = strsep(&bp, ",");
+       d.officephone = (p ? p : "");
+       p = strsep(&bp, ",");
+       d.homephone = ( p ? p : "");
+
+       for (ep = list; ep->prompt; ep++)
+               if (!ep->restricted) {
+                       ep->display(&d, fp);
+                       ndisplayed++;
+               }
+       if(!ndisplayed) {
+               (void)fprintf(fp, "###################################\n");
+               (void)fprintf(fp, "# No fields are available to change\n");
+               (void)fprintf(fp, "###################################\n");
+       }
+#else /* DIRECTORY_SERVICE */
+        (void)fprintf(fp,
+           "##\n"
+            "# User Database\n"
+            "# \n"
+            "# Note:  This program edits the /etc/master.passwd file which is only \n"
+            "# consulted when the system is running in single-user mode.  At other times \n"
+            "# this information is handled by lookupd.  By default, lookupd gets \n"
+            "# information from NetInfo, so this file will not be consulted unless you \n"
+            "# have changed lookupd's configuration.\n"
+            "##\n");
+
        if (!uid) {
                (void)fprintf(fp, "Login: %s\n", pw->pw_name);
                (void)fprintf(fp, "Password: %s\n", pw->pw_passwd);
@@ -148,6 +208,7 @@ display(fd, pw)
        (void)fprintf(fp, "Office Phone: %s\n", p ? p : "");
        p = strsep(&bp, ",");
        (void)fprintf(fp, "Home Phone: %s\n", p ? p : "");
+#endif /* DIRECTORY_SERVICE */
 
        (void)fchown(fd, getuid(), getgid());
        (void)fclose(fp);
@@ -162,7 +223,7 @@ verify(pw)
        struct stat sb;
        FILE *fp;
        int len;
-       char buf[LINE_MAX];
+       static char buf[LINE_MAX];
 
        if (!(fp = fopen(tempname, "r")))
                pw_error(tempname, 1, 1);
@@ -214,12 +275,22 @@ bad:                                      (void)fclose(fp);
        (void)fclose(fp);
 
        /* Build the gecos field. */
+#ifdef DIRECTORY_SERVICE
+       if (list[E_NAME].save) {
+               if (list[E_LOCATE].save) {
+#endif /* DIRECTORY_SERVICE */
        len = strlen(list[E_NAME].save) + strlen(list[E_BPHONE].save) +
            strlen(list[E_HPHONE].save) + strlen(list[E_LOCATE].save) + 4;
        if (!(p = malloc(len)))
                err(1, NULL);
        (void)sprintf(pw->pw_gecos = p, "%s,%s,%s,%s", list[E_NAME].save,
            list[E_LOCATE].save, list[E_BPHONE].save, list[E_HPHONE].save);
+#ifdef DIRECTORY_SERVICE
+               } else
+                       pw->pw_gecos = list[E_NAME].save;
+       } else
+               pw->pw_gecos = "";
+#endif /* DIRECTORY_SERVICE */
 
        if (snprintf(buf, sizeof(buf),
            "%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s",
@@ -229,5 +300,5 @@ bad:                                        (void)fclose(fp);
                warnx("entries too long");
                return (0);
        }
-       return (pw_scan(buf, pw));
+       return (pw_scan(buf, pw, NULL));
 }