Corinna,

Following remarks made on the list this patch
- allows to specify several domains at once with -d
- only prints SYSTEM and specials when the -l switch is given
- prints all uids and gids as unsigned
- limits the uid values to < 1000 on Win9x (for lastlog)

mkpasswd had a pesky bug where memory was freed twice without 
netapibufferfree complaining, but subsequent net calls failed.

Pierre

2003-04-05  Pierre Humblet  <[EMAIL PROTECTED]>

        * mkpasswd.c (current_user): print uid and gid as unsigned.
        (enum_users): Ditto. Do not free servername.
        (usage): Update to allow several domains and improve -p.
        (main): On Win9x limit uids to 1000. Only print specials
        when -l is specified. Add a loop to allow several domains
        and free servername in the loop.
        * mkgroup.c (enum_groups): Do not free servername.
        (usage): Update to allow several domains. Change uid to gid.
        (main): Only print specials when -l is specified. Add a 
        loop to allow several domains and free servername in the loop.
Index: mkpasswd.c
===================================================================
RCS file: /cvs/src/src/winsup/utils/mkpasswd.c,v
retrieving revision 1.29
diff -u -p -r1.29 mkpasswd.c
--- mkpasswd.c  1 Mar 2003 16:38:26 -0000       1.29
+++ mkpasswd.c  4 Apr 2003 01:44:53 -0000
@@ -199,7 +199,7 @@ current_user (int print_sids, int print_
       strlcat (homedir_psx, envname, sizeof (homedir_psx));
     }

-  printf ("%s:unused_by_nt/2000/xp:%d:%d:%s%s%s%s%s%s%s%s:%s:/bin/bash\n",
+  printf ("%s:unused_by_nt/2000/xp:%u:%u:%s%s%s%s%s%s%s%s:%s:/bin/bash\n",
          envname,
          uid + id_offset,
          gid + id_offset,
@@ -331,7 +331,7 @@ enum_users (LPWSTR servername, int print
                    }
                }
            }
-         printf ("%s:unused_by_nt/2000/xp:%d:%d:%s%s%s%s%s%s%s%s:%s:/bin/bash\n",
+         printf ("%s:unused_by_nt/2000/xp:%u:%u:%s%s%s%s%s%s%s%s:%s:/bin/bash\n",
                  username,
                  uid + id_offset,
                  gid + id_offset,
@@ -351,9 +351,6 @@ enum_users (LPWSTR servername, int print
     }
   while (rc == ERROR_MORE_DATA);

-  if (servername)
-    netapibufferfree (servername);
-
   return 0;
 }

@@ -487,14 +484,14 @@ print_special (int print_sids,
 int
 usage (FILE * stream, int isNT)
 {
-  fprintf (stream, "Usage: mkpasswd [OPTION]... [domain]\n\n"
+  fprintf (stream, "Usage: mkpasswd [OPTION]... [domain]...\n\n"
                   "This program prints a /etc/passwd file to stdout\n\n"
                   "Options:\n");
   if (isNT)
     fprintf (stream, "   -l,--local              print local user accounts\n"
                     "   -c,--current            print current account, if a domain 
account\n"
                      "   -d,--domain             print domain accounts (from current 
domain\n"
-                     "                           if no domain specified)\n"
+                     "                           if no domains specified)\n"
                      "   -o,--id-offset offset   change the default offset (10000) 
added to uids\n"
                      "                           in domain accounts.\n"
                      "   -g,--local-groups       print local group information too\n"
@@ -502,7 +499,7 @@ usage (FILE * stream, int isNT)
                      "   -m,--no-mount           don't use mount points for home 
dir\n"
                      "   -s,--no-sids            don't print SIDs in GCOS field\n"
                     "                           (this affects ntsec)\n");
-  fprintf (stream, "   -p,--path-to-home path  use specified path instead of user 
account home dir\n"
+  fprintf (stream, "   -p,--path-to-home path  use specified path and not user 
account home dir or /home\n"
                    "   -u,--username username  only return information for the 
specified user\n"
                    "   -h,--help               displays this message\n"
                   "   -v,--version            version information and exit\n\n");
@@ -649,7 +646,7 @@ main (int argc, char **argv)
          unsigned long uid = 0, i;
          for (i = 0; disp_username[i]; i++)
            uid += toupper (disp_username[i]) << ((6 * i) % 25);
-         uid = (uid % (65535 - DOMAIN_USER_RID_ADMIN - 1))
+         uid = (uid % (1000 - DOMAIN_USER_RID_ADMIN - 1))
            + DOMAIN_USER_RID_ADMIN + 1;

          printf ("%s:use_crypt:%lu:%lu:%s:%s%s:/bin/bash\n",
@@ -675,7 +672,6 @@ main (int argc, char **argv)
                   "when `-d' is given.\n", argv[0]);
          return 1;
        }
-      mbstowcs (domain_name, argv[optind], (strlen (argv[optind]) + 1));
       domain_name_specified = 1;
     }
   if (!load_netapi ())
@@ -686,57 +682,62 @@ main (int argc, char **argv)

   if (disp_username == NULL)
     {
+      if (print_local)
+        {
 #if 0
-      /*
-       * Get `Everyone' group
-      */
-      print_special (print_sids, &sid_world_auth, 1, SECURITY_WORLD_RID,
-                    0, 0, 0, 0, 0, 0, 0);
+         /*
+          * Get `Everyone' group
+          */
+         print_special (print_sids, &sid_world_auth, 1, SECURITY_WORLD_RID,
+                        0, 0, 0, 0, 0, 0, 0);
 #endif
-      /*
-       * Get `system' group
-      */
-      print_special (print_sids, &sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
-                    0, 0, 0, 0, 0, 0, 0);
-      /*
-       * Get `administrators' group
-      */
-      if (!print_local_groups)
-       print_special (print_sids, &sid_nt_auth, 2, SECURITY_BUILTIN_DOMAIN_RID,
-                      DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0);
-
+         /*
+          * Get `system' group
+          */
+         print_special (print_sids, &sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
+                        0, 0, 0, 0, 0, 0, 0);
+         /*
+          * Get `administrators' group
+          */
+         if (!print_local_groups)
+           print_special (print_sids, &sid_nt_auth, 2, SECURITY_BUILTIN_DOMAIN_RID,
+                          DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0);
+       }
       if (print_local_groups)
        enum_local_groups (print_sids);
     }

-  if (print_domain)
-    {
-      if (domain_name_specified)
-       rc = netgetdcname (NULL, domain_name, (LPBYTE *) & servername);
-
-      else
-       rc = netgetdcname (NULL, NULL, (LPBYTE *) & servername);
-
-      if (rc != ERROR_SUCCESS)
-       {
-         print_win_error(rc);
-         return 1;
-       }
-
-      enum_users (servername, print_sids, print_cygpath, passed_home_path,
-                 id_offset, disp_username);
-    }
-
   if (print_local)
     enum_users (NULL, print_sids, print_cygpath, passed_home_path, 0,
                disp_username);

+  i = 1;
+  if (print_domain)
+    do
+      {
+       if (domain_name_specified)
+         {
+           mbstowcs (domain_name, argv[optind], (strlen (argv[optind]) + 1));
+           rc = netgetdcname (NULL, domain_name, (LPBYTE *) & servername);
+         }
+       else
+         rc = netgetdcname (NULL, NULL, (LPBYTE *) & servername);
+
+       if (rc != ERROR_SUCCESS)
+         {
+           print_win_error(rc);
+           return 1;
+         }
+
+       enum_users (servername, print_sids, print_cygpath, passed_home_path,
+                   id_offset * i++, disp_username);
+       netapibufferfree (servername);
+      }
+    while (++optind < argc);
+
   if (print_current && !print_domain)
     current_user(print_sids, print_cygpath, passed_home_path,
                 id_offset, disp_username);
-
-  if (servername)
-    netapibufferfree (servername);

   return 0;
 }
Index: mkgroup.c
===================================================================
RCS file: /cvs/src/src/winsup/utils/mkgroup.c,v
retrieving revision 1.20
diff -u -p -r1.20 mkgroup.c
--- mkgroup.c   1 Mar 2003 16:38:26 -0000       1.20
+++ mkgroup.c   4 Apr 2003 01:45:02 -0000
@@ -372,9 +372,6 @@ enum_groups (LPWSTR servername, int prin

     }
   while (rc == ERROR_MORE_DATA);
-
-  if (servername)
-    netapibufferfree (servername);
 }

 void
@@ -484,16 +481,15 @@ current_group (int print_sids, int print
 int
 usage (FILE * stream, int isNT)
 {
-  fprintf (stream, "Usage: mkgroup [OPTION]... [domain]\n\n"
+  fprintf (stream, "Usage: mkgroup [OPTION]... [domain]...\n\n"
                   "This program prints a /etc/group file to stdout\n\n"
                   "Options:\n");
   if (isNT)
     fprintf (stream, "   -l,--local             print local group information\n"
                     "   -c,--current           print current group, if a domain 
account\n"
-                    "   -d,--domain            print global group information from 
the domain\n"
-                    "                          specified (or from the current domain 
if there is\n"
-                    "                          no domain specified)\n"
-                    "   -o,--id-offset offset  change the default offset (10000) 
added to uids\n"
+                    "   -d,--domain            print global group information (from 
current\n"
+                    "                          domain if no domains specified)\n"
+                    "   -o,--id-offset offset  change the default offset (10000) 
added to gids\n"
                     "                          in domain accounts.\n"
                     "   -s,--no-sids           don't print SIDs in pwd field\n"
                     "                          (this affects ntsec)\n"
@@ -629,7 +625,6 @@ main (int argc, char **argv)
                   "when `-d' is given.\n", argv[0]);
          return 1;
        }
-      mbstowcs (domain_name, argv[optind], (strlen (argv[optind]) + 1));
       domain_specified = 1;
     }
   if (!load_netapi ())
@@ -639,22 +634,14 @@ main (int argc, char **argv)
       return 1;
     }

-#if 0
-  /*
-   * Get `Everyone' group
-  */
-  print_special (print_sids, &sid_world_auth, 1, SECURITY_WORLD_RID,
-                            0, 0, 0, 0, 0, 0, 0);
-#endif
-
-  /*
-   * Get `system' group
-  */
-  print_special (print_sids, &sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
-                            0, 0, 0, 0, 0, 0, 0);
   if (print_local)
     {
       /*
+       * Get `system' group
+       */
+      print_special (print_sids, &sid_nt_auth, 1, SECURITY_LOCAL_SYSTEM_RID,
+                    0, 0, 0, 0, 0, 0, 0);
+      /*
        * Get `None' group
       */
       len = 256;
@@ -696,27 +683,32 @@ main (int argc, char **argv)
                                   0,
                                   0,
                                   0);
-    }
-
-  if (print_domain)
-    {
-      if (domain_specified)
-       rc = netgetdcname (NULL, domain_name, (LPBYTE *) & servername);
-
-      else
-       rc = netgetdcname (NULL, NULL, (LPBYTE *) & servername);
-
-      if (rc != ERROR_SUCCESS)
-       {
-         fprintf (stderr, "Cannot get PDC, code = %ld\n", rc);
-         return 1;
-       }

-      enum_groups (servername, print_sids, print_users, id_offset);
+      enum_local_groups (print_sids, print_users);
     }

-  if (print_local)
-    enum_local_groups (print_sids, print_users);
+  i = 1;
+  if (print_domain)
+    do
+      {
+       if (domain_specified)
+          {
+           mbstowcs (domain_name, argv[optind], (strlen (argv[optind]) + 1));
+           rc = netgetdcname (NULL, domain_name, (LPBYTE *) & servername);
+         }
+       else
+         rc = netgetdcname (NULL, NULL, (LPBYTE *) & servername);
+
+       if (rc != ERROR_SUCCESS)
+         {
+           fprintf (stderr, "Cannot get PDC, code = %ld\n", rc);
+           return 1;
+         }
+
+       enum_groups (servername, print_sids, print_users, id_offset * i++);
+       netapibufferfree (servername);
+      }
+    while (++optind < argc);

   if (print_current && !print_domain)
     current_group (print_sids, print_users, id_offset);

Reply via email to