bbslib.c
来自「bbs server linux平台下软件源码」· C语言 代码 · 共 2,630 行 · 第 1/5 页
C
2,630 行
/* * $Id: bbslib.c,v 1.179 2003/08/29 08:04:42 stiger Exp $ */#include "types.h"#include "bbslib.h"#include <assert.h>time_t update_time = 0;int showexplain = 0, freshmode = 0;int mailmode, numf;int friendmode = 0;int usercounter, real_user_names = 0;int range, page, readplan, num;struct user_info *user_record[USHM_SIZE];struct userec *user_data;time_t set_idle_time(struct user_info *uentp, time_t t);int loginok = 0;friends_t bbb[MAXREJECTS];int badnum = 0;struct user_info *u_info;/*struct UTMPFILE *shm_utmp;*//*struct UCACHE *shm_ucache;*/char fromhost[IPLEN + 1];char parm_name[256][80], *parm_val[256];int parm_num = 0;struct favbrd_struct { int flag; char *title; int father;};extern struct favbrd_struct favbrd_list[FAVBOARDNUM];extern int favbrd_list_t;extern int favnow;friends_t fff[200];int friendnum = 0;int file_has_word(char *file, char *word){ FILE *fp; char buf[256], buf2[256]; fp = fopen(file, "r"); if (fp == 0) return 0; while (1) { bzero(buf, 256); if (fgets(buf, 255, fp) == 0) break; sscanf(buf, "%s", buf2); if (!strcasecmp(buf2, word)) { fclose(fp); return 1; } } fclose(fp); return 0;}int f_append(char *file, char *buf){ FILE *fp; char *ptr; fp = fopen(file, "a"); if (fp == 0) return -1; ptr = buf; while (*ptr != '\0') { if (*ptr == '\x09') /* horizontal tab */ fprintf(fp, " "); else fputc(*ptr, fp); ptr++; } fclose(fp); return 0;}time_t file_time(char *file){ struct stat st; if (stat(file, &st) == -1) return 0; return st.st_mtime;}struct stat *f_stat(char *file){ static struct stat buf; bzero(&buf, sizeof(buf)); if (stat(file, &buf) == -1) bzero(&buf, sizeof(buf)); return &buf;}char *wwwCTime(time_t t){ static char s[80]; sprintf(s, "%24.24s", ctime(&t)); return s;}char *noansi(char *s){ static char buf[1024]; int i = 0, mode = 0; while (s[0] && i < 1023) { if (mode == 0) { if (s[0] == 27) { mode = 1; } else { buf[i] = s[0]; i++; } } else { if (!strchr(";[0123456789", s[0])) mode = 0; } s++; } buf[i] = 0; return buf;}char *nohtml(char *s){ char *buf = calloc(strlen(s) + 1, 1); int i = 0, mode = 0; while (s[0] && i < 1023) { if (mode == 0) { if (s[0] == '<') { mode = 1; } else { buf[i] = s[0]; i++; } } else { if (s[0] == '>') mode = 0; } s++; } buf[i] = 0; return buf;}char *strright(char *s, int len){ int l = strlen(s); if (len <= 0) return ""; if (len >= l) return s; return s + (l - len);}#ifndef FREEBSDchar *strcasestr(char *s1, char *s2){ int l; l = strlen(s2); while (s1[0]) { if (!strncasecmp(s1, s2, l)) return s1; s1++; } return 0;}#endif /* not FREEBSD */int strsncpy(char *s1, char *s2, int n){ int l = strlen(s2); if (n < 0) return; if (n > l + 1) n = l + 1; strncpy(s1, s2, n - 1); s1[n - 1] = 0;}char *ltrim(char *s){ char *ptr; char *ptr2; if (s[0] == '\0') return s; ptr = ptr2 = s; while (*ptr != '\0') { if ((*ptr != ' ') && (*ptr != '\t') && (*ptr != '\r') && (*ptr != '\n')) { break; } ptr++; } if (ptr == s) return s; if (*ptr == '\0') { s[0] = '\0'; return s; } while (*ptr != '\0') { *ptr2 = *ptr; ptr++; ptr2++; } *ptr2 = '\0'; return s;}char *rtrim(char *s){ char *ptr; char *ptr2; if (s[0] == '\0') return s; ptr = s; ptr2 = s + strlen(s) - 1; while (ptr2 != ptr) { if ((*ptr2 == ' ') || (*ptr2 == '\t') || (*ptr2 == '\r') || (*ptr2 == '\n')) { *ptr2 = '\0'; ptr2--; continue; } break; } return s;}char *getsenv(char *s){ char *t = getenv(s); if (t) return t; return "";}int http_quit(){ printf("\n</html>\n"); exit(0);}int http_fatal(char *fmt, ...){ char buf[1024]; va_list ap; va_start(ap, fmt); vsnprintf(buf, 1023, fmt, ap); va_end(ap); buf[1023] = 0; printf("错误! %s! <br><br>\n", buf); printf("<a href=\"javascript:history.go(-1)\">快速返回</a>"); http_quit();}int strnncpy(char *s, int *l, char *s2){ strncpy(s + (*l), s2, strlen(s2)); (*l) += strlen(s2);}int hsprintf(char *s, char *fmt, ...){ char buf[1024], ansibuf[80], buf2[80]; char *tmp; int c, bold, m, i, l, len; va_list ap; va_start(ap, fmt); vsnprintf(buf, 1023, fmt, ap); va_end(ap); s[0] = 0; l = strlen(buf); len = 0; bold = 0; for (i = 0; i < l; i++) { c = buf[i]; if (c == '&') { strnncpy(s, &len, "&"); } else if (c == '<') { strnncpy(s, &len, "<"); } else if (c == '>') { strnncpy(s, &len, ">"); } else if (c == 27) { if (buf[i + 1] != '[') continue; for (m = i + 2; m < l && m < i + 24; m++) if (strchr("0123456789;", buf[m]) == 0) break; strsncpy(ansibuf, &buf[i + 2], m - (i + 2) + 1); i = m; if (buf[i] != 'm') continue; if (strlen(ansibuf) == 0) { bold = 0; strnncpy(s, &len, "<font class=\"c37\">"); } tmp = strtok(ansibuf, ";"); while (tmp) { c = atoi(tmp); tmp = strtok(0, ";"); if (c == 0) { strnncpy(s, &len, "<font class=\"c37\">"); bold = 0; } if (c >= 30 && c <= 37) { if (bold == 1) sprintf(buf2, "<font class=\"d%d\">", c); if (bold == 0) sprintf(buf2, "<font class=\"c%d\">", c); strnncpy(s, &len, buf2); } } } else { s[len] = c; len++; } } s[len] = 0;}int hprintf(char *fmt, ...){ char buf[8096], buf2[1024]; va_list ap; va_start(ap, fmt); vsnprintf(buf2, 1023, fmt, ap); va_end(ap); hsprintf(buf, "%s", buf2); printf("%s", buf);}int hhprintf(char *fmt, ...){ char buf0[1024], buf[1024], *s, *getparm(); int len = 0; int my_link_mode; va_list ap; va_start(ap, fmt); vsnprintf(buf, 1023, fmt, ap); va_end(ap); buf[1023] = 0; s = buf; my_link_mode = atoi(getparm("my_link_mode")); if (my_link_mode == 1) return hprintf("%s", buf); if (!strcasestr(s, "http://") && !strcasestr(s, "ftp://") && !strcasestr(s, "mailto:")) return hprintf("%s", buf); while (s[0]) { if (!strncasecmp(s, "http://", 7) || !strncasecmp(s, "mailto:", 7) || !strncasecmp(s, "ftp://", 6)) { char *tmp; if (len > 0) { buf0[len] = 0; hprintf("%s", buf0); len = 0; } tmp = strtok(s, "\'\" \r\t)(,;\n"); if (tmp == 0) break; /* * if(1) { * if(strstr(tmp, ".gif") || strstr(tmp, ".jpg") || strstr(tmp, ".bmp")) { * printf("<img src=\"%s\">", nohtml(tmp)); * tmp=strtok(0, ""); * if(tmp==0) return -1; * return hhprintf("%s",tmp); * } * } */ printf("<a target=\"_blank\" href=\"%s\">%s</a>", nohtml(tmp), nohtml(tmp)); tmp = strtok(0, ""); if (tmp == 0) return printf("\n"); return hhprintf("%s", tmp); } else { buf0[len] = s[0]; if (len < 1000) len++; s++; } } return 0;}int parm_add(char *name, char *val){ int len = strlen(val); if (parm_num >= 255) http_fatal("too many parms."); parm_val[parm_num] = calloc(len + 1, 1); if (parm_val[parm_num] == 0) http_fatal("memory overflow2 %d %d", len, parm_num); strsncpy(parm_name[parm_num], name, 78); strsncpy(parm_val[parm_num], val, len + 1); parm_num++;}void html_init(){ int style; printf("Content-type: text/html; charset=%s\n\n\n", CHARSET); printf("<html>\n"); printf("<head>\n"); printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n", CHARSET); style = atoi(getparm("STYLE")); switch (style) { case 1: /* default color, big font */ printf("<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\">\n", CSS_FILE_BIGFONT); printf("<link rel=\"stylesheet\" type=\"text/css\" href=\"/ansi-web-middle.css\">\n"); break; case 0: default: /* default color, small font */ printf("<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\">\n", CSS_FILE); printf("<link rel=\"stylesheet\" type=\"text/css\" href=\"/ansi-web-small.css\">\n"); } printf("</head>");}int http_init(){ char *buf, buf2[1024], *t2, *t3; int n; n = atoi(getsenv("CONTENT_LENGTH")); if (n > 5000000) n = 5000000; buf = calloc(n + 1, 1); if (buf == 0) http_fatal("memory overflow"); fread(buf, 1, n, stdin); buf[n] = 0; t2 = strtok(buf, "&"); while (t2) { t3 = strchr(t2, '='); if (t3 != 0) { t3[0] = 0; t3++; __unhcode(t3); __unhcode(trim(t2)); parm_add(t2, t3); } t2 = strtok(0, "&"); } strsncpy(buf2, getsenv("QUERY_STRING"), 1024); t2 = strtok(buf2, "&"); while (t2) { t3 = strchr(t2, '='); if (t3 != 0) { t3[0] = 0; t3++; __unhcode(t3); __unhcode(trim(t2)); parm_add(t2, t3); } t2 = strtok(0, "&"); } strsncpy(buf2, getsenv("HTTP_COOKIE"), 1024); /* * printf("HTTP_COOKIE = %s\n", buf2); */ t2 = strtok(buf2, ";"); while (t2) { t3 = strchr(t2, '='); if (t3 != 0) { t3[0] = 0; t3++; parm_add(trim(t2), t3); } t2 = strtok(0, ";"); }/*#ifdef SQUID_ACCL*/ { char *ptr, *p; ptr = getsenv("HTTP_X_FORWARDED_FOR"); p = strrchr(ptr, ','); if (p != NULL) { while (!isdigit(*p) && *p) p++; if (*p) strncpy(fromhost, p, IPLEN); else strncpy(fromhost, ptr, IPLEN); } else strncpy(fromhost, ptr, IPLEN); fromhost[IPLEN] = 0; } if (fromhost[0] == '\0')/*#endif*/ strsncpy(fromhost, getsenv("REMOTE_ADDR"), IPLEN);}int __to16(char c){ if (c >= 'a' && c <= 'f')
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?