cgi_functions.c

来自「这是我自己写的用于嵌入式设备的CGI程序」· C语言 代码 · 共 1,932 行 · 第 1/4 页

C
1,932
字号
    if (users_list == NULL)    {        if (add_to_file(&user_add, sizeof(USER_CONF), conf_path)== -1)            return -2;        return 0;    }    else    {        if (users_num >= USERS_NUM_MAX)            return -3;        for (i=0; i<users_num; i++)        {            if (strcmp(users_list[i].username, user_add.username) == 0)                return -1;        }        if (add_to_file(&user_add, sizeof(USER_CONF), conf_path)== -1)            return -2;        return 0;    }}/*--------------------------------------------------------------------------*//*--------------------------------------------------------------------------*    验证帐号和密码,返回0则OK,用户不存在返回-2,用户列表为空返回-3,密码验证未通过返回-1,另外user_matched_num传回匹配帐号的记录序号 *--------------------------------------------------------------------------*/ int match_usr_pwd(char * username, char * password, int * user_matched_num, char * conf_path) {    USER_CONF * users_list;    int i, users_num, user_exsit;    users_list = read_records(sizeof(USER_CONF), &users_num, conf_path);    if (users_list == NULL)    {        return -3;    }    else    {        for (i=0; i<users_num; i++)        {            if (strcmp(users_list[i].username, username) == 0)            {                if (strcmp(users_list[i].password, password) == 0)                {                    * user_matched_num = i+1;                    return 0;                }                else                    return -1;                user_exsit =1;            }            else                user_exsit = 0;        }        if (user_exsit ==0 )            return -2;    } }/*--------------------------------------------------------------------------*    一组读Ini配置文件的相关函数,移自B2的cm_Common.c    ini文件的格式为:    [Section1]    Ident1=Value1    Ident2=Value2    ...    Added by Kevin 08.31 2007 *--------------------------------------------------------------------------*/#define MAX_FILE_SIZE   1024*16#define LEFT_BRACE      '['#define RIGHT_BRACE     ']'static int IsNewLine(char c){    return ('\n' == c ||  '\r' == c )? 1 : 0;}static int IsEnd(char c){    return '\0'==c? 1 : 0;}static int IsLeftBarce(char c){    return LEFT_BRACE == c? 1 : 0;}static int IsRightBrace(char c ){    return RIGHT_BRACE == c? 1 : 0;}static int LoadIniFile(char* file, char* buf,int *file_size){    FILE *in = NULL;    int i=0;    *file_size =0;    if (file ==NULL) return 0;    if (buf ==NULL) return 0;    in = fopen(file,"r");    if( NULL == in)    {        return 0;    }    buf[i]=fgetc(in);    while( buf[i]!= (char)EOF)    {        i++;        if (!( i < MAX_FILE_SIZE)) return 0;        buf[i]=fgetc(in);    }    buf[i]='\0';    *file_size = i;    fclose(in);    return 1;}static int ParseFile(char* Section, char* key, char* buf, int *sec_s, int *sec_e, int *key_s,                     int *key_e, int *value_s, int *value_e){    char* p = buf;    int i=0;    if (buf==NULL) return 0;    if  (!(Section != NULL && strlen(Section))) return 0;    if (!(key != NULL && strlen(key))) return 0;    *sec_e = *sec_s = *key_e = *key_s = *value_s = *value_e = -1;    while( !IsEnd(p[i]) )    {        if( ( 0==i ||  IsNewLine(p[i-1]) ) && IsLeftBarce(p[i]) )        {            int Section_start=i+1;            do            {                i++;            } while( !IsRightBrace(p[i]) && !IsEnd(p[i]));            if( 0 == strncmp(p+Section_start,Section, i-Section_start))            {                int newline_start=0;                i++;                //while(isspace(p[i]))                while ((p[i]==0x09)||(p[i]==0x20)||(p[i]==0x0D)||(p[i]==0x0A))                {                    i++;                }                *sec_s = Section_start;                *sec_e = i;                while( ! (IsNewLine(p[i-1]) && IsLeftBarce(p[i])) && !IsEnd(p[i]) )                {                    int j=0;                    newline_start = i;                    while( !IsNewLine(p[i]) &&  !IsEnd(p[i]) )                    {                        i++;                    }                    j = newline_start;                    if(';' != p[j])                    {                        while(j < i && p[j]!='=')                        {                            j++;                            if('=' == p[j])                            {                                if(strncmp(key,p+newline_start,j-newline_start)==0)                                {                                    *key_s = newline_start;                                    *key_e = j-1;                                    *value_s = j+1;                                    *value_e = i;                                    return 1;                                }                            }                        }                    }                    i++;                }            }        }        else        {i++;}    }    return 0;}int _IniReadStr(char* Section,char* Ident, char* DefValue,char* file, char* Result,int ResultSize){    char buf[MAX_FILE_SIZE]={0};    int file_size;    int sec_s,sec_e,key_s,key_e, value_s, value_e;    int size =ResultSize;// strlen(Result);    if (!(Section != NULL && strlen(Section))) return 0;    if (!(Ident != NULL && strlen(Ident))) return 0;    if (Result == NULL) return 0;    if (!(size > 0)) return 0;    if (!(file !=NULL &&strlen(Ident))) return 0;    if(!LoadIniFile(file,buf,&file_size))    {        if(DefValue!=NULL)        {            strncpy(Result,DefValue, size);        }        return 0;    }    if(!ParseFile(Section,Ident,buf,&sec_s,&sec_e,&key_s,&key_e,&value_s,&value_e))    {        if(DefValue!=NULL)        {            strncpy(Result,DefValue, size);        }        return 0;    }    else    {        int cpcount = value_e -value_s;        if( size-1 < cpcount)        {            cpcount =  size-1;        }        memset(Result, 0, size);        memcpy(Result,buf+value_s, cpcount );        Result[cpcount] = '\0';        return 1;    }}/*--------------------------------------------------------------------------*    一组检查字符串的函数    Writed by Kevin 09.04 2007*--------------------------------------------------------------------------*//*--------------------------------------------------------------------------*    检查字符串中是否含有非法字符。如有,返回1,否则返回0,出错返回-1    此处的非法字符指:不可见的控制字符以及空格 *--------------------------------------------------------------------------*/int check_str_all ( char* str ){    register x;    if ( NULL == str )        return -1;    for (x=0; str[x]; x++)        if ( (str[x] <= 32) || ( str[x]>126 ) )            return 1;    return 0;}/*--------------------------------------------------------------------------*    检查字符串中是否含有非法字符。如有,返回1,否则返回0,出错返回-1    此处的非法字符指:除大小写字母、数字、'_'、'-'、'.'、'~'、'@'、'/'、'?'、'#'、'&'、'='之外的字符 *--------------------------------------------------------------------------*/int check_str_normal ( char* str ){    register x;    if ( NULL == str )        return -1;    for (x=0; str[x]; x++)        if (!(((str[x] >= '0') && (str[x] <= '9')) ||              ((str[x] >= 'A') && (str[x] <= 'Z')) ||              ((str[x] >= 'a') && (str[x] <= 'z')) ||              ( str[x] == '_') ||              ( str[x] == '-') ||              ( str[x] == '.') ||              ( str[x] == '~') ||              ( str[x] == '@') ||              ( str[x] == '/') ||              ( str[x] == '?') ||              ( str[x] == '#') ||              ( str[x] == '&') ||              ( str[x] == '=') ))            return 1;    return 0;}/*--------------------------------------------------------------------------*    检查字符串中是否含有非法字符。如有,返回1,否则返回0,出错返回-1    此处的非法字符指:除大小写字母、数字、_之外的字符 *--------------------------------------------------------------------------*/int check_str_common ( char* str ){    register x;    if ( NULL == str )        return -1;    for (x=0; str[x]; x++)        if (!(((str[x] >= '0') && (str[x] <= '9')) ||              ((str[x] >= 'A') && (str[x] <= 'Z')) ||              ((str[x] >= 'a') && (str[x] <= 'z')) ||              (str[x] =='_')))            return 1;    return 0;}/*--------------------------------------------------------------------------*    检查字符串中是否含有非法字符。如有,返回1,否则返回0,出错返回-1    此处的非法字符指:除数字之外的字符 *--------------------------------------------------------------------------*/int check_str_num ( char* str ){    register x;    if ( NULL == str )        return -1;    for (x=0; str[x]; x++)        if (!((str[x] >= '0') && (str[x] <= '9')))            return 1;    return 0;}/*--------------------------------------------------------------------------*    将字符串转换成不含空格的字符串,字符串中的空格用一个+代替,原有的+号用@+代替,原有的@用@@代替。    char* str_enc返回编码后的字符串,必须在调用前分配空间并最好清零,如果编码后字符串长于分配str_enc长度,编码字符串会截断。    函数出错返回-1,正常则返回0 *--------------------------------------------------------------------------*/int enc_str ( char* str, char* str_enc, int str_len){    register x, x_=0, y, count=0;    char* str_;    if ( NULL == str )        return -1;    for (x=0; str[x]; x++)        if (( str[x] == '@' )||(( str[x] == '+' )))            count++;    y = x + count + 1;    str_ = (char *) malloc ( y * sizeof(char));    if (str_ != NULL)        memset (str_, '\0', y);    else        return -1;    for (x=0; str[x]; x++)    {        if ( str[x] != '+' )        {            if ( str[x] != '@')            {                str_[x_] = str[x];                x_ = x_+1;            }            else            {                str_[x_] = str[x];                str_[x_ +1] = str[x];                x_ = (x_ +1) +1;            }        }        else        {            str_[x_] = '@';            str_[x_ +1] = str[x];            x_ = (x_ +1) +1;        }    }    for (x_=0; str_[x_]; x_++)    {        if (str_[x_] == 32)            str_[x_] = '+';    }    strncpy( str_enc, str_, str_len);    str_enc[str_len-1]='\0';    free(str_);    return 0;}/*--------------------------------------------------------------------------*    将上述编码的字符串还原    char* str返回还原后的字符串,必须在调用前分配空间并最好清零,如果还原编码字符串长于分配str长度,返回的字符串会截断。 *--------------------------------------------------------------------------*/int dec_str ( char* str_dec, char* str, int str_len ){    register x, x_=0, y, count=0, mark=1;    char* str_;    if ( NULL == str_dec )        return -1;    str_ = (char *)malloc(str_len * sizeof( char));    if (NULL == str_)        return -1;    else        memset (str_, '\0', str_len);    for (x=0; str_dec[x]; x++)    {        if ( mark ==1 )        {            if (str_dec[x] == '@')            {                if (str_dec[x+1] == '@')                {                    str_[x_] = '@';                    x_ ++;                    mark = 0;                }                else if (str_dec[x+1] == '+')                {                    str_[x_] = '+';                    x_ ++;                    mark =0;                }                else if (str_dec[x+1] =='\0')                {                    str_[x_] = str_dec[x];                    str_[x_+1] = '\0';                    mark =0;                }                else                {                    str_[x_] = str_dec[x];                    x_ ++;                    mark =1;                }            }            else if (str_dec[x] == '+')            {                str_[x_] = 32;                x_ ++;                mark = 1;            }            else            {                str_[x_] = str_dec[x];                x_ ++;                mark =1;            }        }        else        {            mark =1;        }    }    strncpy( str, str_, str_len);    str[str_len-1]='\0';    free ( str_);    return 0;}/*--------------------------------------------------------------------------*    一组操作配置文件的函数。    说明:配置文件格式为文本文件,每行格式为[var_name+空格+var_value+\n]          var_name和var_value均为不包含空格以及tab等不可见控制字符的字符串。    Writed by Kevin 09.03.2007 *--------------------------------------------------------------------------*//*--------------------------------------------------------------------------*    从文件中读取名字的值

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?