bbsman.c
来自「bbs server linux平台下软件源码」· C语言 代码 · 共 271 行
C
271 行
/* * $Id: bbsman.c,v 1.31 2003/05/16 06:29:11 stiger Exp $ */#include "bbslib.h"char genbuf[1024];char currfile[STRLEN];char im_path[MAXPATH];int main(){ int i, total = 0, mode, num; char board[80], *ptr; char buf[STRLEN]; bcache_t *brd; init_all(); if (!loginok) http_fatal("请先登录"); strsncpy(board, getparm("board"), 60); mode = atoi(getparm("mode")); brd = getbcache(board); if (brd == 0) http_fatal("错误的讨论区"); strcpy(board, brd->filename); if (!has_BM_perm(currentuser, board)) http_fatal("你无权访问本页"); if (mode <= 0 || mode > 6) http_fatal("错误的参数"); if (mode == 6) { char *i_path[ANNPATH_NUM]; char *i_title[ANNPATH_NUM]; int i_time = 0; int i_select = 0; num = atoi(getparm("num")); if (num < 0 || num >= ANNPATH_NUM) http_fatal("丝路参数错误"); load_import_path(i_path, i_title, &i_time, &i_select); strcpy(im_path, i_path[num]); free_import_path(i_path, i_title, &i_time); if (strncmp(im_path, "0Announce/groups/", 17)) http_fatal("丝路错误"); } printf("<table>"); for (i = 0; i < parm_num && i < 40; i++) { if (!strncmp(parm_name[i], "box", 3)) { total++; if (mode == 1) do_del(board, atoi(parm_name[i] + 3)); if (mode == 2) do_set(board, atoi(parm_name[i] + 3), FILE_MARK_FLAG); if (mode == 3) do_set(board, atoi(parm_name[i] + 3), FILE_DIGEST_FLAG); if (mode == 4) do_set(board, atoi(parm_name[i] + 3), FILE_NOREPLY_FLAG); if (mode == 5) do_set(board, atoi(parm_name[i] + 3), FILE_DING_FLAG); if (mode == 6) do_import(board, atoi(parm_name[i] + 3)); } else if (!strncmp(parm_name[i], "boz", 3)) { total++; if (mode == 1) do_del_zd(board, atoi(parm_name[i] + 3)); if (mode == 2) do_set_zd(board, atoi(parm_name[i] + 3), FILE_MARK_FLAG); if (mode == 3) do_set_zd(board, atoi(parm_name[i] + 3), FILE_DIGEST_FLAG); if (mode == 4) do_set_zd(board, atoi(parm_name[i] + 3), FILE_NOREPLY_FLAG); if (mode == 5) do_del_zd(board, atoi(parm_name[i] + 3)); if (mode == 6) do_import(board, atoi(parm_name[i] + 3)); } } printf("</table>"); if (total <= 0) printf("请先选定文章<br>\n"); printf("<br><a href=\"/bbsmdoc.php?board=%s\">返回管理模式</a>", encode_url(buf, board, sizeof(buf))); http_quit();}/* modified by stiger,20030414 */int do_del(char *board, int id){ int fd; int ent; char dir[256]; struct fileheader f; sprintf(dir, "boards/%s/.DIR", board); fd = open(dir, O_RDWR, 0644); if (fd < 0) http_fatal("错误的参数"); if (get_records_from_id(fd, id, &f, 1, &ent)) { close(fd); switch (del_post(ent, &f, dir, board)) { case DONOTHING: http_fatal("你无权删除该文"); break; default: printf("<tr><td>%s </td><td>标题:%s </td><td>删除成功.</td></tr>\n", f.owner, nohtml(f.title)); } return; } close(fd); printf("<tr><td></td><td></td><td>文件不存在.</td></tr>\n");}int bbsman_import(int ent, char *board, struct fileheader *f, char *dirdir){ MENU pm; char buf[PATHLEN], bname[PATHLEN]; char fname[STRLEN]; int ret; int i; bzero(&pm, sizeof(pm)); pm.path = im_path; a_loadnames(&pm); ann_get_postfilename(fname, f, &pm); sprintf(bname, "%s/%s", pm.path, fname); sprintf(buf, "%-38.38s %s", f->title, currentuser->userid); a_additem(&pm, buf, fname, NULL, 0, f->attachment); if (a_savenames(&pm) == 0) { sprintf(buf, "boards/%s/%s", board, f->filename); f_cp(buf, bname, 0); /* * change flag */ ret = 1; } else ret = 0; for (i = 0; i < pm.num; i++) free(pm.item[i]); if (ret) { if (change_post_flag("", currentuser, 0, board, ent, f, dirdir, FILE_IMPORT_FLAG, 0) != DONOTHING) ret = 1; else ret = 0; } return ret;}int do_import(char *board, int id){ struct fileheader f; int ent; int fd; char dir[256]; sprintf(dir, "boards/%s/.DIR", board); fd = open(dir, O_RDWR, 0644); if (fd < 0) http_fatal("打开文件错误"); if (get_records_from_id(fd, id, &f, 1, &ent)) { close(fd); if (bbsman_import(ent, board, &f, dir)) printf("<tr><td>%s </td><td>标题:%s </td><td>收录成功.</td></tr>\n", f.owner, nohtml(f.title)); else printf("<tr><td>%s </td><td>标题:%s </td><td>收录不成功.</td></tr>\n", f.owner, nohtml(f.title)); } else { close(fd); printf("<tr><td></td><td></td><td>文件不存在.</td></tr>\n"); }}int do_del_zd(char *board, int id){ FILE *fp; int ffind = 0; int ent = 1; char dir[256]; struct fileheader f; sprintf(dir, "boards/%s/" DING_DIR, board); fp = fopen(dir, "r+"); if (fp == 0) http_fatal("错误的参数"); while (1) { if (fread(&f, sizeof(struct fileheader), 1, fp) <= 0) break; if (f.id == id) { ffind = 1; break; } ent++; } fclose(fp); if (ffind) { switch (del_post(ent, &f, dir, board)) { case DONOTHING: http_fatal("你无权删除该文"); break; default: printf("<tr><td>%s </td><td>标题:%s </td><td>删除成功.</td></tr>\n", f.owner, nohtml(f.title)); } return; } printf("<tr><td></td><td></td><td>文件不存在.</td></tr>\n");}/* 加 G 时并没有 post 到文摘区 *//* modified by stiger,20030414 */int do_set(char *board, int id, int flag){ int fd; char dir[256]; struct fileheader f; int ent; setbdir(DIR_MODE_NORMAL, dir, board); fd = open(dir, O_RDWR, 0644); if (fd >= 0 && get_records_from_id(fd, id, &f, 1, &ent)) { close(fd); if (change_post_flag(NULL, currentuser, 0, board, ent, &f, dir, flag, 0) != DONOTHING) printf("<tr><td>%s</td><td>标题:%s</td><td>标记成功.</td></tr>\n", f.owner, nohtml(f.title)); else printf("<tr><td>%s</td><td>标题:%s</td><td>标记不成功.</td></tr>\n", f.owner, nohtml(f.title)); } else { close(fd); printf("<tr><td></td><td></td><td></td><td>文件不存在.</td></tr>\n"); }}int do_set_zd(char *board, int id, int flag){ FILE *fp; char dir[256]; struct fileheader f; int ent = 1; int ffind = 0; sprintf(dir, "boards/%s/" DING_DIR, board); fp = fopen(dir, "r+"); if (fp == 0) http_fatal("错误的参数"); while (1) { if (fread(&f, sizeof(struct fileheader), 1, fp) <= 0) break; if (f.id == id) { ffind = 1; break; } ent++; } fclose(fp); if (ffind) { if (change_post_flag(NULL, currentuser, 0, board, ent, &f, dir, flag, 0) != DONOTHING) printf("<tr><td>%s</td><td>标题:%s</td><td>标记成功.</td></tr>\n", f.owner, nohtml(f.title)); else printf("<tr><td>%s</td><td>标题:%s</td><td>标记不成功.</td></tr>\n", f.owner, nohtml(f.title)); } else { printf("<tr><td></td><td></td><td></td><td>文件不存在.</td></tr>\n"); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?