|
|
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.