⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi.c

📁 一个C语言的聊天室源代码
💻 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,"<","&lt");
  str=ExChange(str,">","&gt");
 }
 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 + -