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 + -
显示快捷键?