[BACK]Return to sendbug.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / sendbug

Diff for /src/usr.bin/sendbug/sendbug.c between version 1.32 and 1.33

version 1.32, 2007/03/27 03:40:44 version 1.33, 2007/03/27 04:15:00
Line 285 
Line 285 
 void  void
 init(void)  init(void)
 {  {
         size_t amp, len, namelen;          size_t amp, len, gecoslen, namelen;
         const char *src;  
         int sysname[2];          int sysname[2];
         char *dst, *cp;          char ch, *cp;
   
         if ((pw = getpwuid(getuid())) == NULL)          if ((pw = getpwuid(getuid())) == NULL)
                 err(1, "getpwuid");                  err(1, "getpwuid");
         namelen = strlen(pw->pw_name);          namelen = strlen(pw->pw_name);
   
         /* Count number of '&'. */          /* Count number of '&'. */
         for (amp = 0, src = pw->pw_gecos; *src && *src != ','; ++src)          for (amp = 0, cp = pw->pw_gecos; *cp && *cp != ','; ++cp)
                 if (*src == '&')                  if (*cp == '&')
                         ++amp;                          ++amp;
   
           /* Truncate gecos to full name. */
           gecoslen = cp - pw->pw_gecos;
           pw->pw_gecos[gecoslen] = '\0';
   
         /* Expanded str = orig str - '&' chars + concatenated logins. */          /* Expanded str = orig str - '&' chars + concatenated logins. */
         len = (src - pw->pw_gecos) - amp + (amp * namelen);          len = gecoslen - amp + (amp * namelen) + 1;
         if ((fullname = malloc(len + 1)) == NULL)          if ((fullname = malloc(len)) == NULL)
                 err(1, "malloc");                  err(1, "malloc");
   
         dst = fullname;          /* Upper case first char of login. */
         src = pw->pw_gecos;          ch = pw->pw_name[0];
         while (*src != ',' && *src != '\0') {          pw->pw_name[0] = toupper((unsigned char)pw->pw_name[0]);
                 /* Copy text up to ',' or '&' and skip. */  
                 len = strcspn(src, ",&");          cp = pw->pw_gecos;
                 memcpy(dst, src, len);          fullname[0] = '\0';
                 dst += len;          while (cp != NULL) {
                 src += len;                  char *token;
                 /* Replace '&' with login. */  
                 if (*src == '&') {                  token = strsep(&cp, "&");
                         memcpy(dst, pw->pw_name, namelen);                  if (token != pw->pw_gecos &&
                         *dst = toupper((unsigned char)*dst);                      strlcat(fullname, pw->pw_name, len) >= len)
                         dst += namelen;                          errx(1, "truncated string");
                         ++src;                  if (strlcat(fullname, token, len) >= len)
                 }                          errx(1, "truncated string");
         }          }
         *dst = '\0';          /* Restore case of first char of login. */
           pw->pw_name[0] = ch;
   
         sysname[0] = CTL_KERN;          sysname[0] = CTL_KERN;
         sysname[1] = KERN_OSTYPE;          sysname[1] = KERN_OSTYPE;

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.33