コード例 #1
0
ファイル: miscd.c プロジェクト: phoenixgao/fdubbs
int main(int argc, char *argv[]) {
	chdir(BBSHOME); //进入BBS用户主目录
	setuid(BBSUID); //将进程的 用户ID
	setgid(BBSGID); //组ID设置成BBS
	setreuid(BBSUID, BBSUID); //设置有效用户ID	
	setregid(BBSGID, BBSGID); //有效组ID为BBS

	if (argc <= 1) {
		printf("usage: daemon | flushed | reload\n");
		exit(0);
	}
	if ( !strcasecmp(argv[1], "daemon") ) { // miscd daemon
		switch (fork()) { //后台程序:需要创建一个子进程,由子进程杀死父进程
			case -1: //
				printf("cannot fork\n");
				exit(0);
				break;
			case 0: // 子进程
				break;
			default:
				exit(0); //父进程
				break;
		}

		if (load_ucache() != 0) { //将用户的数据映射到内存
			printf("load ucache error\n");
			exit(-1);
		}

		if (resolve_boards() < 0)
			exit(-1);
		atexit(do_exit); //注册退出前运行的函数.正常退出前须执行此函数

		while (1) { //循环
			refresh_utmp(); //刷新用户临时数据
			b_closepolls(); //关闭投票
			flush_ucache(); //将用户在内存中的数据写回.PASSWDS
			flush_bcache();
			sleep(60 * 15); //睡眠十分钟,即每十五分钟同步一次.        
		}
	} else if ( !strcasecmp(argv[1], "flushed") ) { //miscd flushed
		if (resolve_ucache() == -1)
			exit(1);
		flush_ucache();
		flush_bcache();
	} else if ( !strcasecmp(argv[1], "reload") ) { //miscd reload
		if (load_ucache() != 0) {
			printf("load ucache error\n");
			exit(-1);
		}
	} else {
		printf("usage: daemon | flushed | reload\n");
		exit(0);
	}

	return 0;
}
コード例 #2
0
ファイル: cnv_fh.c プロジェクト: loverabbit/kbs-redis
int main(int argc, char* argv[]) {
	
	int mode;
	
	chdir(BBSHOME);
	resolve_boards();
	load_ucache();
	
	mode = 0;
	if(argc > 1) {
		if(strcmp(argv[1], "-u") == 0)
			mode = 1;
        else {
            cnv_index(argv[1]);
            printf("%s is done.\n", argv[1]);
            return 0;
        }
	}
	
	if(mode == 0) {
		apply_boards(cnv_board, NULL);
		apply_users(cnv_mail, NULL);
	}
	else {
		apply_boards(undo_board, NULL);
		apply_users(undo_mail, NULL);
	}

	return 0;
}
コード例 #3
0
ファイル: bootstrap.c プロジェクト: zhouqt/kbs
void bootstrap(void)
{
    int ret;
    char *prompt[] = {
        "Input SYSOP's passwd: ",
        "Input SYSOP's passwd again: ",
    };
    char *pw[2];        /* store SYSOP's password */

    /*
     * About function getpass():
     * lots of codes still use the function, so we use it,
     * though it is obsolete.
     * XXX: memory leak here is harmless.
     */
    while (1) {
        pw[0] = strdup(getpass(prompt[0]));
        if (strlen(pw[0]) > PASSLEN) {
            fprintf(stderr, "password too long, reinput\n");
            continue;
        }
        if (strlen(pw[0]) < 4) {
            fprintf(stderr, "password too short, reinput\n");
            continue;
        }
        if (!strcmp(pw[0], "SYSOP")) {
            fprintf(stderr, "password same as BBS ID, reinput\n");
            continue;
        }
        pw[1] = strdup(getpass(prompt[1]));
        if (strcmp(pw[0], pw[1])) {
            fprintf(stderr, "passwords don't match, reinput\n");
            continue;
        }
        break;
    }

    clean_ipc();
    clean_ids_boards();

    if ((ret = system(BBSHOME "/bin/miscd daemon")) != 0)
        error("error running miscd, return value = %d", ret);
    if ((ret = system(BBSHOME "/bin/bbslogd")) != 0)
        error("error running bbslogd, return value = %d", ret);

    chdir(BBSHOME);
    resolve_boards();
    resolve_utmp();
    load_ucache();

    add_bbsid("SYSOP", pw[0]);
    add_bbsid("guest", "anypassword");
    add_allboards();

    clean_ipc();
}
コード例 #4
0
ファイル: fixuhash.c プロジェクト: startmenu/ythtbbs
int
main(void)
{
    int i;
    if (initbbsinfo(&bbsinfo) < 0)
        goto quit;
    if (load_ucache() < 0)
        goto quit;
    for (i = 0; i < 4; i++) {
        getrandomint(&(bbsinfo.ucachehashshm->regkey[i]));
        getrandomint(&(bbsinfo.ucachehashshm->oldregkey[i]));
    }
    bbsinfo.ucachehashshm->keytime = time(NULL);
    bbsinfo.ucachehashshm->uptime = time(NULL);
    return 0;

quit:
    printf("E!\n");
    return -1;
}
コード例 #5
0
ファイル: strip_fh.c プロジェクト: loverabbit/kbs-redis
int main(int argc, char **argv)
{
    chdir(BBSHOME);
#undef time
    bbssettime(time(0));
    sleep(1);
    resolve_boards();
    load_ucache();
    if (argc == 2 && strcmp(argv[1], "--all") == 0) {
		printf("Transfering Board....\n");
        apply_boards(strip_board, NULL);
		printf("Transfering user mail....\n");
        apply_users(strip_mail, NULL);
    } else if (argc == 2 && strcmp(argv[1], "--mail") == 0) {
        apply_users(strip_mail, NULL);
    } else if (argc == 2 && strcmp(argv[1], "--board") == 0) {
        apply_boards(strip_board, NULL);
    } else if (argc == 2 && strcmp(argv[1], "--rollback") == 0) {
        //apply_boards(rollback_board, NULL);
        apply_users(rollback_mail, NULL);
    } else if (argc == 3 && strcmp(argv[1], "-b") == 0) {
        struct boardheader *bh;

        if ((bh = getbcache(argv[2])) == NULL) {
            fprintf(stderr, "Board <%s> not found!\n", argv[2]);
            exit(-1);
        }
        strip_board(bh, NULL);
    } else if (argc == 3 && strcmp(argv[1], "-m") == 0) {
        struct userec *user;

        if (!getuser(argv[2], &user)) {
            fprintf(stderr, "User <%s> not found!\n", argv[2]);
            exit(-1);
        }
        strip_mail(user, NULL);
    } else if (argc == 3 && strcmp(argv[1], "--rollback-board") == 0) {
        struct boardheader *bh;

        if ((bh = getbcache(argv[2])) == NULL) {
            fprintf(stderr, "Board <%s> not found!\n", argv[2]);
            exit(-1);
        }
        rollback_board(bh, NULL);
    } else if (argc == 3 && strcmp(argv[1], "--rollback-mail") == 0) {
        struct userec *user;

        if (!getuser(argv[2], &user)) {
            fprintf(stderr, "User <%s> not found!\n", argv[2]);
            exit(-1);
        }
        rollback_mail(user, NULL);
    } else {
        fprintf(stderr, "Usage:\n", argv[0]);
        fprintf(stderr, "  %s --all                  Strip all fileheaders.\n", argv[0]);
        fprintf(stderr, "  %s --mail                 Strip mail fileheaders.\n", argv[0]);
        fprintf(stderr, "  %s --board                Strip board fileheaders.\n", argv[0]);
        fprintf(stderr, "  %s --rollback             Rollback all fileheaders.\n", argv[0]);
        fprintf(stderr, "  %s -b board               Strip fileheaders of a board.\n", argv[0]);
        fprintf(stderr, "  %s -m user                Strip fileheaders of a user's mailbox.\n", argv[0]);
        fprintf(stderr, "  %s --rollback-board board Rollback fileheaders of a board.\n", argv[0]);
        fprintf(stderr, "  %s --rollback-mail user   Rollback fileheaders of a user's mailbox.\n", argv[0]);
        exit(-1);
    }

    return 0;
}
コード例 #6
0
ファイル: miscd.c プロジェクト: wyat/kbs
static int miscd_dodaemon(char *argv1, char *daemon)
{
    struct sigaction act;
    char *commandline;
    char commbuf[10];
    char ch;

    if (!check_file_writable(PASSFILE))
    {
        fprintf(stderr, "Error! File %s is not writable.\n", PASSFILE);
        exit(-1);
    }
    if (!check_file_writable(BOARDS))
    {
        fprintf(stderr, "Error! File %s is not writable.\n", BOARDS);
        exit(-1);
    }
    truncate(BOARDS, MAXBOARD * sizeof(struct boardheader));

    if (load_ucache() != 0) {
        printf("ft,load ucache error!");
        exit(-1);
    }

    /* init tmpfs */
    sprintf(genbuf1,"%s/home",TMPFSROOT);
    mkdir(genbuf1,0700);
    sprintf(genbuf1,"%s/boards",TMPFSROOT);
    mkdir(genbuf1,0700);
    for (ch='A';ch<='Z';ch++) {
    sprintf(genbuf1,"%s/home/%c",TMPFSROOT,ch);
    mkdir(genbuf1,0700);
    }

    resolve_boards();
    resolve_utmp();
    resolve_guest_table();

    if (argv1 != NULL) {
        switch (fork()) {
        case -1:
            printf("faint, i can't fork.\n");
            exit(0);
            break;
        case 0:
            break;
        default:
            exit(0);
            break;
        }
        commandline = argv1;
    } else {
        commandline = commbuf;
    }
    setsid();
#if defined(FREEBSD) || defined(MACOSX)
    setpgid(0, 0);
#else
    // by zixia setpgrp(0, 0);
    setpgrp();
#endif
#ifdef AIX
    act.sa_handler = NULL;
    act.sa_flags = SA_RESTART | SA_NOCLDWAIT;
    sigaction(SIGCHLD, &act, NULL);
#else
    act.sa_handler = reaper;
    act.sa_flags = SA_RESTART;
    sigaction(SIGCHLD, &act, NULL);
#endif
    if (((daemon == NULL) || (!strcmp(daemon, "timed"))) && ((argv1 == NULL) || fork())) {
        strcpy(commandline, "timed");
        timed();
        exit(0);
    }

    if (((daemon == NULL) || (!strcmp(daemon, "killd"))) && ((argv1 == NULL) || fork())) {
        strcpy(commandline, "killd");
        char line[20];
        const char *path = "var/killd.pid";
        int pidfd = open(path, O_RDWR | O_CREAT, 0660);
        if (write_lock(pidfd, 0, SEEK_SET, 0) < 0) {
            bbslog("3error", "killd had already been started!");
            exit(-1);
        }
        snprintf(line, sizeof(line), "%ld\n", (long)getpid());
        ftruncate(pidfd, 0);
        write(pidfd, line, strlen(line));

        while (1) {
            time_t ft;

            ft = getnextday4am();
            do {
                sleep(ft - time(0));
            } while (ft > time(0));

            if (argv1 == NULL) {
                dokilluser();
                //doupdategiveupuser();
            } else {
                switch (fork()) {
                case -1:
                    bbslog("3error", "fork failed\n");
                    break;
                case 0:
                    dokilluser();
                    //doupdategiveupuser();
                    exit(0);
                    break;
                default:
                    break;
                }
            }
            switch (fork()) {
                case -1:
                    bbslog("3error", "fork failed\n");
                    break;
                case 0:
                    dokillalldir();
                    exit(0);
                    break;
                default:
                    break;
            }
        };
        exit(0);
    }
    if (((daemon == NULL) || (!strcmp(daemon, "userd"))) && ((argv1 == NULL) || fork())) {
        strcpy(commandline, "userd");
        userd();
        exit(0);
    }
    if ((daemon == NULL) || (!strcmp(daemon, "flushd"))) {
        strcpy(commandline, "flushd");
        flushd();
        exit(0);
    }
    return 0;
}