|
|
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 ((tp = cttyname()) == 0) ! 30: goto trypasswd; ! 31: if (strncmp(tp, "/dev/", 5) == 0) ! 32: tp += 5; ! 33: if ((ufd = open("/etc/utmp", 0)) < 0) ! 34: goto trypasswd; ! 35: while (read(ufd, (char *) &ub, sizeof(ub)) == sizeof(ub)) { ! 36: if (strncmp(ub.ut_line, tp, sizeof(ub.ut_line))) ! 37: continue; ! 38: strncpy(logbuf, ub.ut_name, sizeof(ub.ut_name)); ! 39: logbuf[sizeof(ub.ut_name)] = '\0'; ! 40: /* begin trim of padded blanks (old systems) */ ! 41: for (tp=logbuf; *tp != 0 && *tp != ' '; tp++) ! 42: ; ! 43: *tp = '\0'; ! 44: /* end trim */ ! 45: break; ! 46: } ! 47: close(ufd); ! 48: trypasswd: ! 49: uid = getuid(); ! 50: if (logbuf[0]) { ! 51: pwp = getpwnam(logbuf); ! 52: if (pwp && pwp->pw_uid==uid) ! 53: return(logbuf); ! 54: } ! 55: if ((pwp = getpwuid(uid)) == 0) ! 56: return(0); ! 57: strcpy(logbuf, pwp->pw_name); ! 58: return(logbuf); ! 59: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.