[PATCH] mkpasswd.c - allows selection of specific user

Christopher Faylor cgf@redhat.com
Fri Jan 11 21:09:00 GMT 2002


On Fri, Jan 11, 2002 at 08:59:47PM -0500, Mark Bradshaw wrote:
>Corinna,
>  You probably don't remember this, but I had volunteered back in December
>to make the error messages in mkpasswd a bit more user friendly.  Well, I
>finally took a few free moments to take a stab at it.  I sprinkled a liberal
>dose of FormatMessage wherever error reporting was going on.  So before,
>where there'd be a message that basically said, "You got error number
>12345", now it'll print out the corresponding text.

These are nice changes, but I have a few observations:

1) The ChangeLog needs work.  See http://cygwin.com/contrib.html .

2) I don't think there is any reason to report the number if you
   are translating the text, so, I'd prefer:

   mkpasswd: The user name could not be found

3) Rather than sprinkle FormatMessage throughout the code, couldn't
   a single function be used instead.  It looks like mkpasswd just
   needs some kind of generic error function which takes an argument
   indicating whether to translate the Windows error or not.

I look forward to getting these into cygwin.  Translating the errors
will reduce a lot of user confusion.

Btw, do you have an assignment on file with Red Hat?  I can't remember.
If not, you'll need to send in an assignment as referenced in the above
URL.

cgf

>When I pulled my network cable and tried to get a user from the domain I
>got...
>$ ./mkpasswd -d -u bradshaw
>mkpasswd: error 2453.
>Could not find domain controller for this domain.
>
>Asking for a bogus user...
>$ ./mkpasswd -d -u bradshaj
>mkpasswd: error 2221.
>The user name could not be found.
>
>------------------------------------------
>
>2002-01-11  Mark Bradshaw  <bradshaw@staff.crosswalk.com>
>
>      * mkpasswd.c: (enum_users): Use FormatMessage to print text error
>messages.
>                    (enum_local_groups): Use FormatMessage to print text
>error messages.
>                    (main): Use FormatMessage to print text error messages.
>
>------------------------------------------
>
>--- mkpasswd.c	Fri Jan 11 19:40:57 2002
>+++ mkpasswd.new.c	Fri Jan 11 20:34:18 2002
>@@ -114,9 +114,10 @@ enum_users (LPWSTR servername, int print
>   DWORD entriesread = 0;
>   DWORD totalentries = 0;
>   DWORD resume_handle = 0;
>-  DWORD rc;
>+  DWORD rc, er;
>   char ansi_srvname[256];
>   WCHAR uni_name[512];
>+  char buf[4096];
> 
>   if (servername)
>     uni2ansi (servername, ansi_srvname, sizeof (ansi_srvname));
>@@ -147,9 +148,14 @@ enum_users (LPWSTR servername, int print
> 	  break;
> 
> 	default:
>-	  fprintf (stderr, "NetUserEnum() failed with error %ld.\n", rc);
>-	  if (rc == NERR_UserNotFound) 
>-	    fprintf (stderr, "That user doesn't exist.\n");
>+	  fprintf (stderr, "mkpasswd: error %ld.\n", rc);
>+	  if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      rc,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+	    fprintf (stderr, "%s", buf);
> 	  exit (1);
> 	}
> 
>@@ -206,7 +212,14 @@ enum_users (LPWSTR servername, int print
> 			   "LookupAccountName(%s,%s) failed with error
>%ld\n",
> 			   servername ? ansi_srvname : "NULL",
> 			   username,
>-			   GetLastError ());
>+			   er = GetLastError ());
>+		  if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      er,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+		    fprintf (stderr, "%s", buf);
> 		  continue;
> 		}
> 	      else if (acc_type == SidTypeDomain)
>@@ -228,7 +241,14 @@ enum_users (LPWSTR servername, int print
> 			       "LookupAccountName(%s,%s) failed with error
>%ld\n",
> 			       servername ? ansi_srvname : "NULL",
> 			       domname,
>-			       GetLastError ());
>+			       er = GetLastError ());
>+		      if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      er,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+		        fprintf (stderr, "%s", buf);
> 		      continue;
> 		    }
> 		}
>@@ -266,7 +286,8 @@ enum_local_groups (int print_sids)
>   DWORD entriesread = 0;
>   DWORD totalentries = 0;
>   DWORD resume_handle = 0;
>-  DWORD rc ;
>+  DWORD rc, er;
>+  char buf[4096];
> 
>   do
>     {
>@@ -285,7 +306,14 @@ enum_local_groups (int print_sids)
> 	  break;
> 
> 	default:
>-	  fprintf (stderr, "NetLocalGroupEnum() failed with %ld\n", rc);
>+	  fprintf (stderr, "mkpasswd: error %ld.\n", rc);
>+	  if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      rc,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+	    fprintf (stderr, "%s", buf);
> 	  exit (1);
> 	}
> 
>@@ -306,7 +334,14 @@ enum_local_groups (int print_sids)
> 				  &acc_type))
> 	    {
> 	      fprintf (stderr, "LookupAccountName(%s) failed with %ld\n",
>-		       localgroup_name, GetLastError ());
>+		       localgroup_name, er = GetLastError ());
>+	      if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      er,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+	        fprintf (stderr, "%s", buf);
> 	      continue;
> 	    }
> 	  else if (acc_type == SidTypeDomain)
>@@ -325,7 +360,14 @@ enum_local_groups (int print_sids)
> 		{
> 		  fprintf (stderr,
> 			   "LookupAccountName(%s) failed with error %ld\n",
>-			   localgroup_name, GetLastError ());
>+			   localgroup_name, er = GetLastError ());
>+		  if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      er,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+		    fprintf (stderr, "%s", buf);
> 		  continue;
> 		}
> 	    }
>@@ -432,6 +474,7 @@ main (int argc, char **argv)
> {
>   LPWSTR servername = NULL;
>   DWORD rc = ERROR_SUCCESS;
>+  DWORD er;
>   WCHAR domain_name[200];
>   int print_local = 0;
>   int print_domain = 0;
>@@ -442,6 +485,7 @@ main (int argc, char **argv)
>   int id_offset = 10000;
>   int i;
>   char *disp_username = NULL;
>+  char buf[4096];
> 
>   char name[256], passed_home_path[MAX_PATH];
>   DWORD len;
>@@ -534,7 +578,14 @@ main (int argc, char **argv)
>   if (!load_netapi ())
>     {
>       fprintf (stderr, "Failed loading symbols from netapi32.dll "
>-		       "with error %lu\n", GetLastError ());
>+		       "with error %lu\n", er = GetLastError ());
>+      if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      er,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+        fprintf (stderr, "%s", buf);
>       return 1;
>     }
> 
>@@ -571,7 +622,14 @@ main (int argc, char **argv)
> 
>       if (rc != ERROR_SUCCESS)
> 	{
>-	  fprintf (stderr, "Cannot get DC, code = %ld\n", rc);
>+	  fprintf (stderr, "mkpasswd: error %ld.\n", rc);
>+	  if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
>+			      | FORMAT_MESSAGE_IGNORE_INSERTS,
>+			      NULL,
>+			      rc,
>+			      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
>+			      (LPTSTR) buf, sizeof (buf), NULL))
>+	    fprintf (stderr, "%s", buf);
> 	  exit (1);
> 	}
> 
>



-- 
cgf@redhat.com                        Red Hat, Inc.
http://sources.redhat.com/            http://www.redhat.com/



More information about the Cygwin-patches mailing list