📄 cgi.c
字号:
#include "cgi.h"
/******************** 链表头 *******************/
INPUT *input_head=NULL;
UserData *userdata_head=NULL;
OnlineList *onlinelist_head=NULL;
BPMSG *bpmsg_head=NULL;
unsigned long int nowtime;
char nowtimestr[64];
int Input_mode;
char *Decode(char *str);
char *FilterHtml(char *str);
void Set_ValueToName(char *name,char *value);
void ErrorMsg(char *str);
/********************** from perl to c **********************
char *s : split char or string;
char *in : be split string;
INPUT *out : split string into ...
************************************************************/
STRLIST * split(char *s,char *in)
{
STRLIST *head, *out;
char *p;
unsigned int size;
if( in==NULL || s==NULL ) return( NULL );
head=out=(STRLIST *)malloc(sizeof(STRLIST));
do
{
if((p=strstr(in,s))==NULL) break;
size = p-in;
if( size )
{
out->str=(char *)malloc(size+1); /* include '\0' so add 1 */
strncpy(out->str,in,size);
out->str[size]='\0';
}
else
{
out->str=malloc(1);
out->str[0]='\0';
}
out->next=(STRLIST *)malloc(sizeof(STRLIST));
out=out->next;
for(size=0;size<strlen(s);size++) p++;
in=p;
}while(1);
size = strlen(in);
if( size )
{
out->str=(char *)malloc(size+1); /* include '\0' so add 1 */
strncpy(out->str,in,size);
out->str[size]='\0';
}
else
{
out->str=malloc(1);
out->str[0]='\0';
}
out->next=NULL;
return(head);
}
STRLIST * FreeStrList(STRLIST *p)
{
if( p!=NULL )
{
p->next=FreeStrList( p->next );
if(p->str!=NULL) free(p->str);
free(p);
}
return(NULL);
}
/*********************************************
find str1 in str, use str2 exchange str1
return a str
*********************************************/
char * ExChange(char *str,char *str1,char *str2)
{
char *p;
int size,size1,size2,i;
char *buf,*strbuf;
if( str==NULL || str1==NULL) return(str);
size1=strlen(str1);
if( str2==NULL ) size2=0;
else size2=strlen(str2);
while(1)
{
if((p=strstr(str,str1))==NULL) break;
size=p-str;
strbuf=(char *)malloc(strlen(str)-size);
p+=size1; strcpy(strbuf,p);
str=(char *)realloc(str,strlen(str)-size1+size2+1);
sprintf(&str[size],"%s%s",(str2==NULL)?"":str2,strbuf);
}
return(str);
}
void Get_Input(void)
{
STRLIST *querys,*tmp;
STRLIST *name_value;
unsigned int len;
char *buf;
Input_mode=2;
buf=getenv("QUERY_STRING");
if(buf!=NULL && strlen(buf) )
{
querys = split("&",buf);
tmp=querys;
while( querys!=NULL )
{
name_value=split("=",querys->str);
if( name_value )
{
name_value->str=Decode(name_value->str);
if(name_value->next!=NULL)
{
name_value->next->str=Decode(name_value->next->str);
name_value->next->str=FilterHtml(name_value->next->str);
Set_ValueToName(name_value->str,name_value->next->str);
}
else
{
Set_ValueToName(name_value->str,"");
}
}
FreeStrList(name_value);
querys=querys->next;
}
FreeStrList(tmp);
}
Input_mode=1;
buf=getenv("CONTENT_LENGTH");
if(buf!=NULL)
{
len=atoi(buf);
if(len)
{
buf=(char *)malloc(len+1);
if(fread(buf,1,len,stdin)!=len) ErrorMsg("读取表单数据错");
querys = split("&",buf);
tmp=querys;
while( querys!=NULL )
{
name_value=split("=",querys->str);
if( name_value )
{
name_value->str=Decode(name_value->str);
if(name_value->next!=NULL)
{
name_value->next->str=Decode(name_value->next->str);
name_value->next->str=FilterHtml(name_value->next->str);
Set_ValueToName(name_value->str,name_value->next->str);
}
else
{
Set_ValueToName(name_value->str,"");
}
}
querys=querys->next;
}
FreeStrList(tmp); FreeStrList(name_value);
free(buf);
}
}
Input_mode=3;
buf=getenv("HTTP_COOKIE");
if(buf!=NULL)
{
buf=ExChange(buf," ","");
querys = split(";",buf);
while( querys!=NULL )
{
name_value=split("=",querys->str);
if( name_value )
{
name_value->str=Decode(name_value->str);
if(name_value->next!=NULL)
{
name_value->next->str=Decode(name_value->next->str);
name_value->next->str=FilterHtml(name_value->next->str);
Set_ValueToName(name_value->str,name_value->next->str);
}
else
{
Set_ValueToName(name_value->str,"");
}
}
querys=querys->next;
}
}
}
char x2c(char *what)
{
register char digit;
digit = (what[0]>='A'?((what[0]&0xdf)-'A')+10:(what[0]-'0'));
digit<<= 4;
digit|=(what[1]>='A'?((what[1]&0xdf)-'A')+10:(what[1]-'0'));
return (digit);
}
void unescape_url(char *url)
{
register int x,y;
for(x=0,y=0;url[y];++x,++y)
{
if((url[x]=url[y])=='%')
{
url[x]=x2c(&url[y+1]);
y+=2;
}
}
url[x]='\0';
}
char *Decode(char *str)
{
str=ExChange(str,"+"," ");
unescape_url(str);
return(str);
}
char * FilterHtml(char *str)
{
char *p1,*p2;
p1=strstr(str,"<!--");
if( p1 != NULL )
{
p2=strstr(str,"-->");
if( p2 != NULL )
{
p2+=3;
strcpy(p1,p2);
}
}
if( AllowHTML == 0 )
{
str=ExChange(str,"<","<");
str=ExChange(str,">",">");
}
return(str);
}
void Set_ValueToName(char *name,char *value)
{
INPUT *p;
if( input_head!=NULL )
{
p=input_head;
while( p->next!=NULL )
{
if( !strcmp(p->name,name) )
{
p->value=(char *)realloc(p->value,strlen(value)+1);
strcpy(p->value,value);
return;
}
p=p->next;
}
p->next=(INPUT *)malloc(sizeof(INPUT));
p=p->next;
}
else
{
input_head=p=(INPUT *)malloc(sizeof(INPUT));
}
p->name=(char *)malloc(strlen(name)+1); strcpy(p->name,name);
p->value=(char *)malloc(strlen(value)+1); strcpy(p->value,value);
p->mode=Input_mode;
p->next=NULL;
}
char *Get_Value(char *name)
{
INPUT *p;
p=input_head;
while(p!=NULL)
{
if(!strcmp(p->name,name)) return(p->value);
p=p->next;
}
return(NULL);
}
void Set_Cookie(char *name,char *value)
{
struct tm today;
time_t now;
long cookietime;
char *wday[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Unknow"};
char *mon[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
cookietime=time(&now);
today=*gmtime(&cookietime);
printf("Set-cookie: %s=%s; path=/%s; expires=%s, %2d-%s-%4d %d:%d:%d GMT\n",name,value,pagefilepath,wday[today.tm_wday],today.tm_mday,mon[today.tm_mon],today.tm_year+1900+1,today.tm_hour,today.tm_min,today.tm_sec);
}
/********************************************************************************************/
void ErrorMsg(char *str)
{
printf("Content-type: text/html\n\n");
printf("<html><body><title>错误</title>\n");
printf("<body>%s</body></html>\n",str);
exit(0);
}
void NowTime()
{
time(&nowtime);
sprintf(nowtimestr,"%ld",nowtime);
}
char * ShortTime(unsigned long int *t)
{
char *buf,*tmp,*tmp1;
char *b;
buf=ctime((time_t *)t);
tmp=&buf[11];
tmp1=strstr(tmp," "); *tmp1='\0';
b=malloc(strlen(tmp)+1);
sprintf(b,"%s",tmp);
return(b);
}
void e_space(char *str)
{
int i,j;
i=strlen(str)-1;
while( i && str[i]==' ' ) i--;
str[i+1]='\0';
for(i=0,j=0;i<=strlen(str);i++,j++)
{
while(str[i]!='\0' && str[i]==' ') i++;
str[j]=str[i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -