int apply_utmpuid(APPLY_UTMP_FUNC fptr, int uid, void *arg) { char userid[IDLEN + 1]; if (uid <= 0) return 0; strcpy(userid, getuserid2(uid)); return apply_utmp(fptr, 0, userid, arg); }
/* stiger: 获得一个用户的在线状态string */ static int get_userstatusstr(char *userid, char *buf) { int tuid=0; struct userec *lookupuser; if(!(tuid = getuser(userid, &lookupuser))) return 0; buf[0]='0'; buf[1]=0; return apply_utmp((APPLY_UTMP_FUNC) printstatusstr, 10, lookupuser->userid, buf); }
/* uentp == NULL means to kick all logins */ int kick_user_utmp(int uid, struct user_info *uentp, int signal) { int i, currsave; struct kickuser_save s; s.count = 0; signal = signal ? signal: SIGHUP; if (!uentp) { struct userec *u = getuserbynum(uid); apply_utmp((APPLY_UTMP_FUNC) kickuser_count, 0, u->userid, &s); } else { s.entp[0] = uentp; s.pid[0] = uentp->pid; s.count = 1; } currsave = -1; for (i=0;i<s.count;i++) { struct user_info *enp = s.entp[i]; if (enp->active) { if (enp -> pid == getpid() && s.count > 1) { currsave = i; continue; } else if (enp->pid != 1) kill(enp->pid, signal); clear_utmp(get_utmpent_num(enp), uid , s.pid[i]); } } if (currsave != -1) { struct user_info *enp = s.entp[currsave]; if (enp -> active) { if (enp -> pid != 1) kill(enp -> pid, signal); clear_utmp(get_utmpent_num(enp), uid, s.pid[currsave]); } } return s.count; }
int update_username(const char *userid,const char *o_name,const char *n_name) { const char *arg[2]={o_name,n_name}; return apply_utmp(update_username_proc,0,userid,arg); }