version 1.32, 2007/03/27 03:40:44 |
version 1.33, 2007/03/27 04:15:00 |
|
|
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; |