?? main.c
字號(hào):
sprintf(wheader,"HTTP/1.1 %s\nContent-type: %s\nContent-Length: %d\nMini Web Server 1.0\n\n",codestr,contenttype,contentsize); //printf("%s\n",wheader); send(socket,(void *)wheader,strlen(wheader),0); return 0;}int runbin(char * file_name,int socket) { //srand(time(0)); char output[100]; pid_t pid; FILE * fp=NULL; FILE * tp=NULL; char tmpfilename[20]; char command[1024]; pid=getpid(); sprintf(tmpfilename,"./%d.tmp",pid); memset(command,0,1024); snprintf(command,512,"%s",file_name); system(command); fp = popen(command,"r"); if(fp==NULL) { log("Error open cgi file!"); return 0; } if((tp=fopen(tmpfilename,"w"))==NULL) { log("Error open tmpfile"); return 0; } while(fgets((char *)output,100,fp)) { fputs(output,tp); } fclose(tp); pclose(fp); if((tp=fopen(tmpfilename,"r"))==NULL) { log("Error open tmpfile"); return 0; } fseek(tp,0L,SEEK_END); contentsize=ftell(tp); writeheader(socket,200,"text/html"); fseek(tp,0L,SEEK_SET); sendfile(tp,socket); fclose(tp); remove(tmpfilename); return 1; }int changepath(char *path){ int i; if(path==NULL) return; for(i=0;i<strlen(path);i++) if(path[i]=='\\') path[i]='/';}int sendrecfile(char *param,int socket){ int i,j; char hd[]="abcdefgh"; char path[254]; FILE *fp; for(i=0;i<8;i++) for(j=0;j<4;j++) { memset(path,0,254); sprintf(path,"/var/hd%c%1d%s",hd[i],j+1,param); changepath(path); log(path); fp=fopen(path,"rb"); if(fp) { fseek(fp,0L,SEEK_END); contentsize=ftell(fp); writeheader(socket,200,"file/unknown"); fseek(fp,0L,SEEK_SET); sendfile(fp,socket); fclose(fp); return 1; } } return 0;}int decurl(char *s,char *d){ int i; int j=0; char inum; char num[5]; char *endptr; for(i=0;i<strlen(s);i++) { if(s[i]=='%') { num[0]='0'; num[1]='x'; num[2]=s[i+1]; num[3]=s[i+2]; num[4]='\0'; d[j]=strtol(num,NULL,0); j++; i+=2; //printf("%d %s %d\n",i,num,strtol(num,endptr,16)); } else { d[j]=s[i]; j++; } } d[j]='\0'; return 1;}int checkcgi(char *cmd,char *param,int socket){ FILE *fp=NULL; char cginame[1024]; char decparam[1024]; char *p; decurl(param,decparam); log(decparam); if(strcasecmp(cmd,"/getrecfile1")==0) { p=strtok(decparam,"="); p=strtok(NULL,"="); return sendrecfile(p,socket); } if((fp=fopen(cgiconffile,"r"))==NULL) return 0; if(!readoption(fp,cmd,cginame)) { fclose(fp); return 0; } fclose(fp); p=strtok(decparam,"&"); while(p) { strcat(cginame," "); strcat(cginame,p); p=strtok(NULL,"&"); } log(cginame); return runbin(cginame,socket);}int handle_connection(int socket,char * ip){ char requesttype[5]=""; //char connecttype[30]; char *connection; char ext[20]=""; char *tmpext; FILE *fp=NULL; //char teststr[]="<html><body><h1>Mini Web Server Home Page</h1></body></html>"; char error404[]="<Html><body><h1>File Not Found!</h1></body></html>"; char badrequest[]="<Html><body><h1>Bad Request!</h1></body></html>"; char notauth[]="<html><body><h1>401 Unauthorized</h1></body></html>"; char *rvalue; char user[60],pwd[20],b64str[120],decstr[120]; char logstr[512]; int rtvalue; memset(rheader,'\0',2048); rtvalue=readheader(socket); sscanf(rheader,"%s %s",requesttype,request); if(strcasecmp(requesttype,"GET")!=0&&strcasecmp(requesttype,"POST")!=0) { contentsize=strlen(badrequest); writeheader(socket,400,"text/html"); send(socket,(void *)badrequest,strlen(badrequest),0); return 0; } printf("%s\n",rheader); if(needauth) if(!isauth) { rvalue=readheadervalue("Authorization"); if(rvalue==NULL) { log("nead auth!"); contentsize=strlen(notauth); writeheader(socket,401,"text/html"); send(socket,(void *)notauth,strlen(notauth),0); return 0; } else { memset(pwd,'\0',20); memset(b64str,'\0',120); memset(decstr,'\0',120); sscanf(rvalue,"%[^:]: %s %s",user,pwd,b64str); base64decode(b64str,decstr,strlen(b64str)); sscanf(decstr,"%[^:]:%s",user,pwd); printf("%s,%s,%s\n",pwd,password,decstr); if(!(strcasecmp(user,"Admin")==0&&strcmp(pwd,password)==0)) { log("Auth fail!"); contentsize=strlen(notauth); writeheader(socket,401,"text/html"); send(socket,(void *)notauth,strlen(notauth),0); return 0; } } } strcpy(logstr,"from "); strcat(logstr,ip); strcat(logstr," request:"); strcat(logstr,request); log(logstr); if(strchr(request,'?')!=NULL) { sscanf(request,"%[^?]%s",requestcmd,requestparam); strcpy(requestparam,&requestparam[1]); } else strcpy(requestcmd,request); if(strchr(requestcmd,'.')!=NULL) { tmpext=strchr(requestcmd,'.'); strcpy(ext,&tmpext[1]); } //printf("Request Type:%s\nRequest:%s\nRequestcmd:%s\nRequest Param:%s\nExt:%s\n",requesttype,request,requestcmd,requestparam,ext); //log(requestparam); if(strcmp(requestcmd,"/")==0) strcat(requestcmd,defaultdoc); if(checkcgi(requestcmd,requestparam,socket)) return 0; if((fp = fopen(&requestcmd[1],"r"))==NULL) { contentsize=strlen(error404); writeheader(socket,404,"text/html"); send(socket,(void *)error404,strlen(error404),0); return 0; } else { fseek (fp , 0 , SEEK_END); contentsize=ftell(fp); fseek (fp , 0 , SEEK_SET); //printf("Send file:%s\nFile Size:%d\nFile Type:%s\n",&requestcmd[1],contentsize,filetype(&requestcmd[1])); writeheader(socket,200,filetype(&requestcmd[1])); sendfile(fp,socket); fclose(fp); } connection=strstr(rheader,"Connection:"); return 0;/* if(!connection) return 0; else { sscanf(connection,"%[^:]: %s",returndata,connecttype); //printf("%s\n",connecttype); if(strcasecmp(connecttype,"keep-Alive")==0&&strcasecmp(filetype(&requestcmd[1]),"text/html")==0) return 1; else return 0; }*/}int main(int argc, char* argv[]){ int sockfd, new_fd; struct sockaddr_in my_addr; struct sockaddr_in their_addr; int sin_size;// struct sigaction sa; int yes=1; int handle; int pid;// struct newthread *nt;// pthread_t ptid; printf("\n=================Starting Netstorage WEB setup program================\n"); printf(" Safeking Corporation \n"); printf("======================================================================\n"); printf("log Start:\n"); readconfig(); if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { perror("setsockopt"); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(serverport); my_addr.sin_addr.s_addr = INADDR_ANY; memset(&(my_addr.sin_zero), '\0', 8); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(sockfd, 10) == -1) { perror("listen"); exit(1); } chdir(serverpath); while(1) { // main accept() loop sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,(unsigned int *)&sin_size)) == -1) { perror("accept"); continue; } //printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr)); pid=fork();// pid=0; if (pid==0) { close(sockfd); while(1) { handle = handle_connection(new_fd,inet_ntoa(their_addr.sin_addr)); if(handle==0) { exit(0); } }/* nt=(struct newthread *)malloc(sizeof(struct newthread)); strcpy(nt->ip,inet_ntoa(their_addr.sin_addr)); nt->sfd=new_fd; pthread_create(&ptid,NULL,pt,(void *)nt);*/ } close(new_fd); while(wait(NULL)>0); } return 0;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -