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, "&amp;");        } else if (c == '<') {            strnncpy(s, &len, "&lt;");        } else if (c == '>') {            strnncpy(s, &len, "&gt;");        } 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 + -
显示快捷键?