/* * utmp extender 0.1b, by Krzysztof Rusocki * (c) 2005, GPL v2 * * made especially for the G.I.L.D.R.O. project */ #include #include #include #include #include #include #define DEV "/dev/" #ifndef UTMP_FILE #warning UTMP_FILE was not defined! #define UTMP_FILE "/var/run/utmp" #endif int main(int ac, char ** av) { char * ssh_tty = getenv("SSH_TTY"); char * term; struct utmp u; struct utmp * up; char * ruser = getenv("REALUSER"); int rlen; char * beg; if (!ruser || !ssh_tty || (rlen = strlen(ruser) + 1) <= 1) return 1; utmpname(UTMP_FILE); setutent(); term = strstr(ssh_tty, DEV); if (term) term += strlen(DEV); strncpy(u.ut_line, term, UT_LINESIZE); up = getutline(&u); if (!up) { fprintf(stderr, "ut entry with line: '%s' not found\n", u.ut_line); return 1; } memcpy(&u, up, sizeof(u)); setutent(); /* ? */ beg = strchr(u.ut_host, '@'); if (!beg) beg = u.ut_host; else beg++; memmove(u.ut_host + rlen, beg, UT_HOSTSIZE - (beg - u.ut_host)); memcpy(u.ut_host, ruser, rlen); u.ut_host[rlen - 1] = '@'; pututline(&u); endutent(); return 0; }