$NetBSD: patch-ap,v 1.1.1.1.10.1 2005/06/08 01:29:22 snj Exp $ Expand & in the gecos field to a capitalized login name. --- lib/util_getent.c.orig 2005-04-09 19:27:42.000000000 +0200 +++ lib/util_getent.c 2005-04-09 19:35:09.000000000 +0200 @@ -155,6 +155,11 @@ struct sys_pwent *plist; struct sys_pwent *pent; struct passwd *pwd; +#ifdef BSD +# define BUFLEN 1024 + char *bp, *gecos, *p, buf[BUFLEN]; + int buflen; +#endif pent = SMB_MALLOC_P(struct sys_pwent); if (pent == NULL) { @@ -178,9 +183,38 @@ pent->pw_uid = pwd->pw_uid; pent->pw_gid = pwd->pw_gid; if (pwd->pw_gecos) { +#ifdef BSD + gecos = pwd->pw_gecos; + if (*gecos == '*') + gecos++; + bp = buf; + + /* copy gecos, interpolating & to be full name */ + for (p = gecos; *p != '\0'; p++) { + if (bp >= &buf[BUFLEN - 1]) + /* buffer overflow */ + goto gecos_done; + if (*p == '&') { + /* interpolate full name */ + snprintf(bp, BUFLEN - (bp - buf), + "%s", pwd->pw_name); + *bp = toupper(*bp); + bp += strlen(bp); + } + else + *bp++ = *p; + } + *bp = '\0'; + if ((pent->pw_name = SMB_STRDUP(buf)) == NULL) + goto err; +#else if ((pent->pw_name = SMB_STRDUP(pwd->pw_gecos)) == NULL) goto err; +#endif } +#ifdef BSD + gecos_done: +#endif if (pwd->pw_dir) { if ((pent->pw_name = SMB_STRDUP(pwd->pw_dir)) == NULL) goto err;