mkpasswd & mkgroup

Pierre A. Humblet Pierre.Humblet@ieee.org
Tue Feb 25 04:30:00 GMT 2003


Corinna,

Earlier I have added a -c switch to mkpasswd & mkgroup. 
It prints the current user (if a domain account), without 
contacting the PDC. 
That was meant for use in postinstall scripts.

However until setup.exe is upgraded, only mkpasswd -l will
be run by passwd-grp.bat, which causes recurring problems with
domain users. 

Thus, at least until setup.exe is upgraded, I suggest that
-c be implied by -l, unless -d is also specified.
This is implemented by the attached patch.
It pretty much insure that the main users will have proper entries.
 
Also, to support arbitrary uid's on Win95, mkpasswd prints both
a default line with uid 500, and a line for the current user 
with a pseudorandom uid. Other users can be added with -u.
Cygwin uses the default line for users that do not have an entry.

I will update the documentation if you apply this patch.

Pierre
 
2003-02-25  Pierre Humblet  <pierre.humblet@ieee.org>

	* mkpasswd.cc (usage): Explain -l, remove -c.
	(main): -c behavior is implied by -l without -d.
	On Win95, output both a default line and a line for the current
	user with a pseudorandom uid.
	* mkgroup.cc (usage): Explain -l, remove -c.
	(main): -c behavior is implied by -l without -d.
	On Win95 change the group name from "unknown" to "all". 

 
-------------- next part --------------
Index: mkpasswd.c
===================================================================
RCS file: /cvs/src/src/winsup/utils/mkpasswd.c,v
retrieving revision 1.28
diff -u -p -r1.28 mkpasswd.c
--- mkpasswd.c	15 Jan 2003 10:08:37 -0000	1.28
+++ mkpasswd.c	25 Feb 2003 02:16:43 -0000
@@ -491,8 +491,8 @@ usage (FILE * stream, int isNT)
 	           "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"
+    fprintf (stream, "   -l,--local              print local user accounts and the current\n"
+	             "                           account, if a domain account and -d is absent\n"
                      "   -d,--domain             print domain accounts (from current domain\n"
                      "                           if no domain specified)\n"
                      "   -o,--id-offset offset   change the default offset (10000) added to uids\n"
@@ -632,21 +632,32 @@ main (int argc, char **argv)
   if (!isNT)
     {
       /* This takes Windows 9x/ME into account. */
+      unsigned long uid = 0;
+      int i;
+
+      if (passed_home_path[0] == '\0')
+	strcpy (passed_home_path, "/home/");
       if (!disp_username)
         {
+	  printf ("Administrator:*:%lu:%lu:Administrator:%sAdministrator:/bin/bash\n",
+		  DOMAIN_USER_RID_ADMIN,
+		  DOMAIN_ALIAS_RID_ADMINS,
+		  passed_home_path);
 	  if (GetUserName (name, (len = 256, &len)))
 	    disp_username = name;
 	  else
 	    /* Same behaviour as in cygwin/shared.cc (memory_init). */
 	    disp_username = (char *) "unknown";
 	}
-
-      if (passed_home_path[0] == '\0')
-	strcpy (passed_home_path, "/home/");
-
-      printf ("%s:*:%ld:%ld:%s:%s%s:/bin/bash\n", disp_username,
-					        DOMAIN_USER_RID_ADMIN,
-					        DOMAIN_ALIAS_RID_ADMINS,
+      /* Create a pseudo random uid */
+      for (i = 0; disp_username[i]; i++)
+	uid += tolower (disp_username[i]) << ((7 * i) % 25);
+      uid = (uid % (65535 - DOMAIN_USER_RID_ADMIN - 1))
+	+ DOMAIN_USER_RID_ADMIN + 1;
+
+      printf ("%s:*:%lu:%lu:%s:%s%s:/bin/bash\n", disp_username,
+	                                        uid,
+	                                        DOMAIN_ALIAS_RID_ADMINS,
 	                                        disp_username,
 					        passed_home_path,
 					        disp_username);
@@ -721,7 +732,7 @@ main (int argc, char **argv)
     enum_users (NULL, print_sids, print_cygpath, passed_home_path, 0,
     		disp_username);

-  if (print_current && !print_domain)
+  if (print_local && !print_domain)
     current_user(print_sids, print_cygpath, passed_home_path,
 		 id_offset, disp_username);

Index: mkgroup.c
===================================================================
RCS file: /cvs/src/src/winsup/utils/mkgroup.c,v
retrieving revision 1.19
diff -u -p -r1.19 mkgroup.c
--- mkgroup.c	15 Jan 2003 10:08:37 -0000	1.19
+++ mkgroup.c	25 Feb 2003 02:27:01 -0000
@@ -488,8 +488,8 @@ usage (FILE * stream, int isNT)
 	           "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"
+    fprintf (stream, "   -l,--local             print local group information and the group of the\n"
+	             "                          current account, if a domain account and -d is absent\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"
@@ -612,7 +612,7 @@ main (int argc, char **argv)
   /* This takes Windows 9x/ME into account. */
   if (!isNT)
     {
-      printf ("unknown::%ld:\n", DOMAIN_ALIAS_RID_ADMINS);
+      printf ("all::%ld:\n", DOMAIN_ALIAS_RID_ADMINS);
       return 0;
     }

@@ -718,7 +718,7 @@ main (int argc, char **argv)
   if (print_local)
     enum_local_groups (print_sids, print_users);

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

   return 0;


More information about the Cygwin-patches mailing list