Ejemplo n.º 1
0
int main()
{
	test_data_t items_to_store[ITEMS_USED];
	test_data_t item_retrieved;

	char key_datum;
	
	DBM *dbm_ptr;
	dbm_ptr = dbm_open(TEST_DB_FILE,O_RDWR | O_CREAT,0666);
	menset(items_to_store,'\0',sizeof(items_to_store));


}
Ejemplo n.º 2
0
int GenerateDirFile(struct worker_ctl *wctl)
{
	struct conn_request *req = &wctl->conn.con_req;
	struct conn_response *res = &wctl->conn.con_res;
	char *command = strstr(req->uri, CGISTR) + strlen(CGISTR);
	char *arg[ARGNUM];
	int num = 0;
	char *rpath = wctl->conn.con_req.rpath;
	stat *fs = &wctl->conn.con_res.fsate;

	/*打开目录*/
	DIR *dir = opendir(rpath);
	if(dir == NULL)
	{
		/*错误*/
		res->status = 500;
		retval = -1;
		goto EXITgenerateIndex;
	}

	/*建立临时文件保存目录列表*/
	File *tmpfile;
	char tmpbuff[2048];
	int filesize = 0;
	char *uri = wctl->conn.con_req.uri;
	tmpfile = tmpfile();

	/*标题部分*/
	sprintf(tmpbuff,
		"%s%s%s",
		"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML><HEAD><TITLE>",
		uri,
		"</TITLE></HEAD>\n"	);
	fprintf(tmpfile, "%s", tmpbuff);
	filesize += strlen(tmpbuff);

	/*标识部分*/
	sprintf(tmpbuff, 
		"%s %s %s",
		"<BODY><H1>Index of:",
		uri,
		" </H1> <HR><P><I>Date: </I> <I>Size: </I></P><HR>");
	fprintf(tmpfile, "%s", tmpbuff);
	filesize += strlen(tmpbuff);	
	

	/* 读取目录中的文件列表 */
	struct dirent *de;
#define PATHLENGTH 2048
	char path[PATHLENGTH];
	char tmpath[PATHLENGTH];
	char linkname[PATHLENGTH];
	struct stat fs;
	strcpy(path, rpath);
	if(rpath[strlen(rpath)]!='/')
	{
		rpath[strlen(rpath)]='/';
	}
	while ((de = readdir(dir)) != NULL)/*读取一个文件*/
	{
		menset(tmpath, 0, sizeof(tmpath));
		menset(linkname, 0, sizeof(linkname));
		if(strcmp(de->d_name, "."))/*不是当前目录*/
		{
			if(strcmp(de->d_name, ".."))/*不是父目录*/			
			{
				strcpy(linkname,de->d_name);/*将目录名称作为链接名称*/
			}
			else/*是父目录*/
			{
				strcpy(linkname, "Parent Directory");/*将父目录作为链接名称*/
			}

			sprintf(tmpath, "%s%s",path, de->d_name);/*构建当前文件的全路径*/
			stat(tmpath, &fs);/*获得文件信息*/
			if(S_ISDIR(fs.st_mode))/*是一个目录*/
			{
				/*打印目录的连接为目录名称*/
				sprintf(tmpbuff, "<A HREF=\"%s/\">%s/</A><BR>\n", de->d_name,tmpath);
			}
			else/*正常文件*/
			{
				char size_str[32];
				off_t size_int;

				size_int = fs.st_size;/*文件大小*/
				if (size_int < 1024)/*不到1K*/
					sprintf(size_str, "%d bytes", (int) size_int);
				else if (size_int < 1024*1024)/*不到1M*/
					sprintf(size_str, "%1.2f Kbytes", (float) size_int / 1024);
				else/*其他*/
					sprintf(size_str, "%1.2f Mbytes", (float) size_int / (1024*1024));

				/*输出文件大小*/
				sprintf(tmpbuff, "<A HREF=\"%s\">%s</A> (%s)<BR>\n", de->d_name, linkname, size_int);
			}
			/*将形成的字符串写入临时文件*/
			fprintf(tmpfile, "%s", tmpbuff);
			filesize += strlen(tmpbuff);				
		}
	}

	/*生成临时的文件信息,主要是文件大小*/
	fs.st_ctime = time(NULL);
	fs.st_mtime = time(NULL);
	fs.st_size = filesize;
	fseek(tmpfile, (long) 0, SEEK_SET);/*移动文件指针到头部*/

	{
		DBGPRINT("==>Method_DoGet\n");
		struct conn_response *res = &wctl->conn.con_res;
		struct conn_request *req = &wctl->conn.con_req;
		char path[URI_MAX];
		memset(path, 0, URI_MAX);

		size_t		n;
		unsigned long	r1, r2;
		char	*fmt = "%a, %d %b %Y %H:%M:%S GMT";

		/*需要确定的参数*/
		size_t status = 200;		/*状态值,已确定*/
		char *msg = "OK";	/*状态信息,已确定*/
		char  date[64] = "";		/*时间*/
		char  lm[64] = "";			/*请求文件最后修改信息*/
		char  etag[64] = "";		/*etag信息*/
		big_int_t cl;				/*内容长度*/
		char  range[64] = "";		/*范围*/	
		struct mine_type *mine = NULL;

		/*当前时间*/
		time_t t = time(NULL);	
		(void) strftime(date, 
					sizeof(date), 
					fmt, 
					localtime(&t));

		/*最后修改时间*/
		(void) strftime(lm, 
					sizeof(lm), 
					fmt, 
					localtime(&res->fsate.st_mtime));

		/*ETAG*/
		(void) snprintf(etag, 
					sizeof(etag), 
					"%lx.%lx",
					(unsigned long) res->fsate.st_mtime,
					(unsigned long) res->fsate.st_size);
		
		/*发送的MIME类型*/
		mine = Mine_Type(req->uri, strlen(req->uri), wctl);

		/*内容长度*/
		cl = (big_int_t) res->fsate.st_size;

		/*范围range*/
		memset(range, 0, sizeof(range));
		n = -1;
		if (req->ch.range.v_vec.len > 0 )/*取出请求范围*/
		{
			printf("request range:%d\n",req->ch.range.v_vec.len);
			n = sscanf(req->ch.range.v_vec.ptr,"bytes=%lu-%lu",&r1, &r2);
		}

		printf("n:%d\n",n);
		if(n   > 0) 
		{
			status = 206;
			(void) sseek(res->fd, r1, SEEK_SET);
			cl = n == 2 ? r2 - r1 + 1: cl - r1;
			(void) snprintf(range, 
						sizeof(range),
						"Content-Range: bytes %lu-%lu/%lu\r\n",
						r1, 
						r1 + cl - 1, 
						(unsigned long) res->fsate.st_size);
			msg = "Partial Content";
		}

		memset(res->res.ptr, 0, sizeof(wctl->conn.dres));
		snprintf(
			res->res.ptr,
			sizeof(wctl->conn.dres),
			"HTTP/1.1 %d %s\r\n" 
			"Date: %s\r\n"
			"Last-Modified: %s\r\n"
			"Etag: \"%s\"\r\n"
			"Content-Type: %.*s\r\n"
			"Content-Length: %lu\r\n"
			//"Connection:close\r\n"
			"Accept-Ranges: bytes\r\n"		
			"%s\r\n",
			status,
			msg,
			date,
			lm,
			etag,
			strlen(mine->mime_type),
			mine->mime_type,
			cl,
			range);
		res->cl = cl;
		res->status = status;
	}

EXITgenerateIndex:
	return 0;
}