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

📄 list.c

📁 基于嵌入式Linux的WEB_CGI开发例程
💻 C
字号:
/* 
* Description:list files  
* Author: Zheng Geng <gzheng@hyesco.com> 
*/ 
#include "cgic.h" 
#ifndef TRUE 
#define TRUE   1 
#define FALSE 0 
#endif 
typedef unsigned char U8; 
typedef unsigned short U16; 
typedef unsigned long U32; 
//保存当前的目录 
char strDir[128]; 
#define BUFSIZE 1024 
char buf[BUFSIZE]; 
//处理用户提交的数据,使用CGIC库中的函数根据元素名字获得数据,然后执行动作 
void HandleSubmit() 
{ 
//<!--Dir--> 
	cgiFormStringNoNewlines("Dir", buf, BUFSIZE); 
	strcpy(strDir, buf); 
	//用ls命令显示目录下文件到临时文件中,当然也可以直接调用系统API来做 
	sprintf(buf,"ls -l %s >/var/1",strDir); 
	system(buf); 		//执行shell命令,它会返回执行shell命令后的返回值
} 
//下面三个函数用于逐行读取文件 
#define bufferFileSize 4096 
static char bufferFile[bufferFileSize]; 
static U16 ubufferActualSize=bufferFileSize; 
static int nEOB=FALSE; 
static U32 uStrHead=0, uStrTail=-1; //str pos in bufferFile 
static int FillBufferFile(FILE * fp) 
{ 
	int nCount=0; 
	ubufferActualSize=0; 
	while(ubufferActualSize<bufferFileSize){ 
		nCount=fread(bufferFile+ubufferActualSize,sizeof(char),bufferFileSize-ubufferActualSize,fp); 
		if(nCount<0){ 
			printf("FillBufferFile: read file failed!\n"); 
			return -1; 
		} 
		else{ 
			ubufferActualSize+=nCount; 
			if (feof(fp)) 
			break; 
		} 
	} 
	return ubufferActualSize; 
} 
int InitReadString(FILE * fp) 
{ 
	int n=0; 
	if(NULL==fp) 
		return -1; 
	nEOB=FALSE; 
	//init buffer 
	n=FillBufferFile(fp); 
	if (n<0) 
		return -1; 
	else 
		return 0; 
} 
/* 
Description: 
  read string from fd to buffer starting at buf when encount a '\n' 
Parameters: 
  fp:     file point to read 
  buf:    buffer to write 
 nMax:    buffer length 
Return Vlalue: 
  >0  Succeed, the number of bytes read are returned   
  0  End of BufferF 
 <0 Fail 
*/ 
int ReadString(FILE * fp,char * buf,U32 uMax) 
{ 
	U32 nCount=0,n=0; 
	if ( (NULL==fp) || (NULL==buf) || (0==uMax)) 
		return -1;   
	if (nEOB==TRUE) 
		return 0; 
	uStrHead=uStrTail+1; 
	if(0x0a==bufferFile[uStrHead]) 
		uStrHead++; 
	while(++uStrTail<ubufferActualSize)
	{ 
		if(0x0d==bufferFile[uStrTail])
		{ 
			//'\n'==0d0a in windows, only check 0d 
			nCount=uStrTail-uStrHead; 
			if (nCount>uMax) 
				return -1; 
			memcpy(buf,bufferFile+uStrHead,nCount); 
			return nCount; 
		} 
	}   
	nCount=ubufferActualSize-uStrHead; 
	if (nCount>uMax) 
		return -1; 
	memcpy(buf,bufferFile+uStrHead,nCount); 
	while (1)
	{ 
		if (feof(fp))
		{ 
			nEOB=TRUE; 
			return nCount; 
		} 
		n=FillBufferFile(fp); 
		if (n<0) 
			return -1; 
		uStrHead=0; 
		uStrTail=-1; 
		while(++uStrTail<n){ 
			if(0x0d==bufferFile[uStrTail])
			{ 
				//'\n'==0d0a in windows, only check 0d 
				if (nCount+uStrTail-uStrHead>uMax) 
					return -1;   
				memcpy(buf+nCount,bufferFile+uStrHead,uStrTail-uStrHead); 
				nCount+=uStrTail-uStrHead; 
				return nCount; 
			} 
		} 
	   if(nCount+n-uStrHead>uMax) 
		return -1; 
	   memcpy(buf+nCount,bufferFile+uStrHead,n-uStrHead); 
	   nCount+=n-uStrHead;    
	} 
} 
//基于CGIC 库的主函数 
int cgiMain() 
{ 
	char strTemplateFileName[128]; 
	char TemplateDir[]="/www/wangzhang1/"; 	//cgi程序模板文件目录
	int  nCount=0; 
	FILE * fp=NULL; 
	FILE * fp1=NULL; 
	cgiHeaderContentType("text/html"); 
	//处理提交 
	if(cgiFormSubmitClicked("Submit") == cgiFormSuccess) 		//判断Submit按钮是否被提交
		HandleSubmit(); 
	//将处理结果填充表单 
	strcpy(strTemplateFileName,TemplateDir); 
	strcat(strTemplateFileName,"list.htm"); 
	if((fp=fopen(strTemplateFileName, "r"))==NULL){ 
		fprintf(cgiOut, "<HTML><HEAD>\n"); 			//cgiOut-->stdout
		fprintf(cgiOut, "<TITLE>ERROR</TITLE></HEAD>\n"); 
		fprintf(cgiOut, "<BODY><H1>ERROR: Can't open template file : %s</H1>\n", strTemplateFileName); 
		fprintf(cgiOut, "</BODY></HTML>\n"); 
		return -1; 
	} 
	else{ 
		if(InitReadString(fp)<0) 	//将模板文件读到全局数组bufferFile[]
			goto ReadStringError; 
		//根据注释标记处理 
		//显示文件目录
		//<!--Dir--> 
		while(1){ 
			nCount=ReadString(fp,buf,BUFSIZE); 
			if (nCount<0)  
				goto ReadStringError;  
			else if(nCount>0){ 
				buf[nCount]='\0';  
				if(strcmp(buf,"<!--Dir-->")==0){ 
					nCount=ReadString(fp,buf,BUFSIZE);  
					if(nCount<0)  
						goto ReadStringError;  
					else if(nCount>0){  
						fwrite(buf,sizeof(char),nCount-1,cgiOut);  	//nCount-1,表示不输出'>'
						fprintf(cgiOut," value=\"");     
						fwrite(strDir,sizeof(char),strlen((strDir)),cgiOut); 		//输出目录路径
						fprintf(cgiOut,"\">\n"); 		//输出值后再输出'>'
						break;  
					}  
					else  
						break;  
				}  
				else{  
					fwrite(buf,sizeof(char),nCount,cgiOut);  
					fprintf(cgiOut,"\n");  
				} 
			}  
			else  
			break;  
		} 
		//显示文件列表 
		//<!--files--> 
		while(1){ 
			nCount=ReadString(fp,buf,BUFSIZE); 
			if (nCount<0)  
				goto ReadStringError;  
			else if(nCount>0){ 
				buf[nCount]='\0'; 
				if (strcmp(buf,"<!--files-->")==0){ 
					nCount=ReadString(fp,buf,BUFSIZE);  
					if (nCount<0)  
						goto ReadStringError;  
					else if(nCount>0){ 
						fwrite(buf,sizeof(char),nCount,cgiOut);  
						fprintf(cgiOut,"\n"); 
					}  
					else  
						break;    
					if((fp1=fopen("/var/1", "r"))==NULL) 
						goto ReadStringError; 
					else{ 
						while(1){ 
							nCount=fread(buf,sizeof(char), BUFSIZE,fp1); 
							if (nCount<0){ 
								fprintf(cgiOut, "ERROR: read/var/1 \n"); 
								fclose(fp1); 
							} 
							else{ 
								fwrite(buf,sizeof(char),nCount,cgiOut); 
								if (feof(fp1)) 
									break; 
							} 
						} 
						fclose(fp1); 
					} 
					fprintf(cgiOut,"\n");  
						break; 
				}  
				else { 
					fwrite(buf,sizeof(char),nCount,cgiOut);  
					fprintf(cgiOut,"\n"); 
				} 
			}  
			else  
				break; 
		} 
	   //others 
		while(1){ 
		    nCount=ReadString(fp,buf,BUFSIZE); 
			if (nCount<0) 
				goto ReadStringError; 
			else if (nCount>0) { 
				fwrite(buf,sizeof(char),nCount,cgiOut); 
				fprintf(cgiOut,"\n"); 
			} 
			else  
				break; 
		} 
		fclose(fp);  
	}  
	return 0; 
	ReadStringError: 
	fclose(fp); 
	fprintf(cgiOut, "<HTML><HEAD>\n"); 
	fprintf(cgiOut, "<TITLE>ERROR</TITLE></HEAD>\n"); 
	fprintf(cgiOut, "<BODY><H1>ERROR: ReadString Error!"); 
	fprintf(cgiOut, "</BODY></HTML>\n"); 
	return -1; 
} 
 

⌨️ 快捷键说明

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