📄 list.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 + -