//FB 用 shared mem来记录最大在线人数,也就是每次重启都是从零开始
//可以改写代码bbsd.c 来用一个文件记录历史最大人数,不过.......
//我喜欢作弊,所以....
//kring wrote it to change max_login_num @2001-5-21
#include "../include/bbs.h"
#include <sys/ipc.h>
#include <sys/shm.h>
struct UTMPFILE *utmpshm;
char genbuf[1024];
void
attach_err(shmkey, name, err)
int shmkey;
char *name;
int err;
{
sprintf(genbuf, "Error! %s error #%d! key = %x.\n", name, err,
shmkey)
;
write(1, genbuf, strlen(genbuf));
exit(1);
}
int
search_shmkey(char *keyname)
{
int i = 0, found = 0;
while (shmkeys[i].key != NULL) {
if (strcmp(shmkeys[i].key, keyname) == 0) {
found = shmkeys[i].value;
break;
}
i++;
}
if (found == 0) {
sprintf(genbuf, "search_shmkey(): cannot found %s SHMKEY
entry
!", keyname);
}
return found;
}
void *
attach_shm(shmstr, defaultkey, shmsize)
char *shmstr;
int defaultkey, shmsize;
{
void *shmptr;
int shmkey, shmid;
shmkey = search_shmkey(shmstr);
if (shmkey < 1024)
shmkey = defaultkey;
shmid = shmget(shmkey, shmsize, 0);
if (shmid < 0) {
shmid = shmget(shmkey, shmsize, IPC_CREAT | 0640);
if (shmid < 0)
attach_err(shmkey, "shmget", errno);
shmptr = (void *) shmat(shmid, NULL, 0);
if (shmptr == (void *) -1)
attach_err(shmkey, "shmat", errno);
memset(shmptr, 0, shmsize);
} else {
shmptr = (void *) shmat(shmid, NULL, 0);
if (shmptr == (void *) -1)
attach_err(shmkey, "shmat", errno);
}
return shmptr;
}
void
resolve_utmp()
{
if (utmpshm == NULL) {
utmpshm = attach_shm("UTMP_SHMKEY", 3699,
sizeof(*utmpshm));
}
}
main(int argc,char **argv)
{
if(argc==2){
resolve_utmp();
utmpshm->max_login_num=atoi(argv[1]);
printf("Succesed!\n");
}
else printf("cheat <num>\n");
}
--
FROM 166.111.174.182