|
|
1.1 root 1: /*
2: * on success:
3: * returns the login name of the invoker.
4: * bug: returns pointer to static area.
5: * on failure:
6: * returns 0.
7: */
8:
9: #include <utmp.h>
10: #include <pwd.h>
11:
12: char *strcpy();
13: char *strncpy();
14: char *cttyname();
15: struct passwd *getpwuid();
16: struct passwd *getpwnam();
17:
18: char *
19: getlogin()
20: {
21: register int ufd;
22: register char *tp;
23: register struct passwd *pwp;
24: struct utmp ub;
25: static char logbuf[sizeof(ub.ut_name)+1];
26: int uid;
27:
28: logbuf[0] = '\0';
29: if (getlogname(logbuf) >= 0 && logbuf[0] != '\0')
30: return (logbuf);
31: if ((tp = cttyname()) == 0)
32: goto trypasswd;
33: if (strncmp(tp, "/dev/", 5) == 0)
34: tp += 5;
35: if ((ufd = open("/etc/utmp", 0)) < 0)
36: goto trypasswd;
37: while (read(ufd, (char *) &ub, sizeof(ub)) == sizeof(ub)) {
38: if (strncmp(ub.ut_line, tp, sizeof(ub.ut_line)))
39: continue;
40: strncpy(logbuf, ub.ut_name, sizeof(ub.ut_name));
41: logbuf[sizeof(ub.ut_name)] = '\0';
42: /* begin trim of padded blanks (old systems) */
43: for (tp=logbuf; *tp != 0 && *tp != ' '; tp++)
44: ;
45: *tp = '\0';
46: /* end trim */
47: break;
48: }
49: close(ufd);
50: trypasswd:
51: uid = getuid();
52: if (logbuf[0]) {
53: pwp = getpwnam(logbuf);
54: if (pwp && pwp->pw_uid==uid)
55: return(logbuf);
56: }
57: if ((pwp = getpwuid(uid)) == 0)
58: return(0);
59: strcpy(logbuf, pwp->pw_name);
60: return(logbuf);
61: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.