static void update_utmp(const char *username, const char *hostname, char *tty, char *ttyn) { /* * Update the utmp files, both BSD and SYSV style. */ if (utmpx_login(tty, username, hostname) != 0 && !f_flag) { printf("No utmpx entry. You must exec \"login\" from the " "lowest level shell.\n"); exit(1); } utmp_login(ttyn, username, hostname); }
char * wwwlogin(struct userec *user, int ipmask) { FILE *fp1; int fd; int n, uid; struct user_info u; char *urlbase, fname[80]; char buf[20]; uid = getuser(user->userid, NULL); fd = open(MY_BBS_HOME "/" ULIST_BASE "." MY_BBS_DOMAIN, O_WRONLY); flock(fd, LOCK_EX); if ((urlbase = check_multi(user->userid, uid))) { flock(fd, LOCK_UN); close(fd); return urlbase; } if (strcasecmp(user->userid, "guest") && count_uindex(uid) >= 3) { flock(fd, LOCK_UN); close(fd); http_fatal("您已经登录了三个帐号,不能再登录了"); } bzero(&u, sizeof (struct user_info)); u.active = 1; u.uid = uid; u.pid = 1; u.mode = LOGIN; u.userlevel = user->userlevel; u.lasttime = now_t; u.curboard = 0; if (user_perm(user, PERM_LOGINCLOAK) && (user->flags[0] & CLOAK_FLAG)) u.invisible = YEA; u.pager = 0; if (user->userdefine & DEF_FRIENDCALL) u.pager |= FRIEND_PAGER; if (user->flags[0] & PAGER_FLAG) { u.pager |= ALL_PAGER; u.pager |= FRIEND_PAGER; } if (user->userdefine & DEF_FRIENDMSG) u.pager |= FRIENDMSG_PAGER; if (user->userdefine & DEF_ALLMSG) { u.pager |= ALLMSG_PAGER; u.pager |= FRIENDMSG_PAGER; } strsncpy(u.from, fromhost, sizeof (u.from)); u.fromIP = from_addr.s_addr; strsncpy(u.username, user->username, NAMELEN); strsncpy(u.userid, user->userid, IDLEN + 1); getrandomstr(u.sessionid); n = utmp_login(&u); if (n > MAXACTIVERUN || n <= 0) { flock(fd, LOCK_UN); close(fd); http_fatal ("抱歉,目前在线用户数已达上限%d,无法登录。请稍后再来。", MAXACTIVERUN); } flock(fd, LOCK_UN); close(fd); n--; urlbase = makeurlbase(n, uid); u_info = &(shm_utmp->uinfo[n]); w_info = &(u_info->wwwinfo); w_info->login_start_time = now_t; w_info->ipmask = ipmask; if (strcasecmp(user->userid, "guest")) { u_info->unreadmsg = get_unreadcount(user->userid); initfriends(u_info); sethomefile(fname, user->userid, "clubrights"); if ((fp1 = fopen(fname, "r")) == NULL) { memset(u_info->clubrights, 0, CLUB_SIZE * sizeof (int)); } else { fread(&(u_info->clubrights), sizeof (int), CLUB_SIZE, fp1); fclose(fp1); } if (readuservalue(user->userid, "signature", buf, sizeof (buf)) >= 0) u_info->signature = atoi(buf); w_info->edit_mode = 1; set_my_cookie(); } else { u_info->unreadmsg = 0; memset(u_info->friend, 0, sizeof (u.friend)); memset(u_info->clubrights, 0, CLUB_SIZE * sizeof (int)); w_info->t_lines = 20; w_info->att_mode = 0; w_info->doc_mode = 1; } if ((user->userlevel & PERM_BOARDS)) setbmstatus(user, 1); return urlbase; }