Use GECOS field a bit better to produce default human readable name.
authorJunio C Hamano <junkio@cox.net>
Mon, 19 Sep 2005 23:06:56 +0000 (16:06 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 20 Sep 2005 22:07:52 +0000 (15:07 -0700)
This updates the default human readable name we generate from GECOS
field.  We assume the "full-name, followed by additional information
separated by commas" format, with an & expanding to the capitalized
login name.

Signed-off-by: Junio C Hamano <junkio@cox.net>
ident.c

diff --git a/ident.c b/ident.c
index a2d241fba025f82fa4c77aeb345103db66168fa9..562f5f18160166506e99aa4f6b5b417cbdc847d8 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -15,6 +15,40 @@ static char real_email[1000];
 static char real_name[1000];
 static char real_date[50];
 
+static void copy_gecos(struct passwd *w, char *name, int sz)
+{
+       char *src, *dst;
+       int len, nlen;
+
+       nlen = strlen(w->pw_name);
+
+       /* Traditionally GECOS field had office phone numbers etc, separated
+        * with commas.  Also & stands for capitalized form of the login name.
+        */
+
+       for (len = 0, dst = name, src = w->pw_gecos; len < sz; src++) {
+               int ch = *src;
+               if (ch != '&') {
+                       *dst++ = ch;
+                       if (ch == 0 || ch == ',')
+                               break;
+                       len++;
+                       continue;
+               }
+               if (len + nlen < sz) {
+                       /* Sorry, Mr. McDonald... */
+                       *dst++ = toupper(*w->pw_name);
+                       memcpy(dst, w->pw_name + 1, nlen - 1);
+                       dst += nlen - 1;
+               }
+       }
+       if (len < sz)
+               name[len] = 0;
+       else
+               die("Your parents must have hated you!");
+
+}
+
 int setup_ident(void)
 {
        int len;
@@ -24,10 +58,7 @@ int setup_ident(void)
                die("You don't exist. Go away!");
 
        /* Get the name ("gecos") */
-       len = strlen(pw->pw_gecos);
-       if (len >= sizeof(real_name))
-               die("Your parents must have hated you!");
-       memcpy(real_name, pw->pw_gecos, len+1);
+       copy_gecos(pw, real_name, sizeof(real_name));
 
        /* Make up a fake email address (name + '@' + hostname [+ '.' + domainname]) */
        len = strlen(pw->pw_name);