www.pudn.com > MyFtpServ.rar > ftp.h


/*---------------------------------------------------- 
	ftp.h -- myFtpServ Program 
			 ZhuJiaJun,2002 
  ----------------------------------------------------*/ 
 
#ifndef __FTP_H 
#define __FTP_H 
 
//#include  
#include  
#include  
#include  
 
 
#include "typedef.h" 
#include "const.h" 
 
/*---------------------------------------------------- 
	function claim  
  ----------------------------------------------------*/ 
void PutFile_ToList(Client_Socket_Ptr client, char* list, WIN32_FIND_DATA file); 
void Change_Directory(Client_Socket_Ptr client, char* list); 
void Get_Directory(Client_Socket_Ptr client, char* dir); 
void Set_Directory(Client_Socket_Ptr client); 
 
/*---------------------------------------------------- 
	function define 
  ----------------------------------------------------*/ 
 
	/* 将文件的相关信息按照下列格式存入list字符串中: 
文件:	-rw-rw-r--   1 ftp      ftp      23084779 Apr  7 08:24 Oversea.chm 
文件夹:	drwxrwxr-x   2 ftp      ftp          4096 May 12 16:05 ResBak	*/ 
void PutFile_ToList(Client_Socket_Ptr client, char* list, WIN32_FIND_DATA file) 
{ 
	char	buf[20]; 
	SYSTEMTIME	systime; 
	//文件或文件夹选项 
	if (file.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)  
		strcpy(list, "-rw-rw-r-- 1 "); 
	else 
		strcpy(list, "drwxrwxr-x 2 "); 
	//用户名 
	strcat(list, client->user); 
	strcat(list, " "); 
	//组名 
	if (client->group[0] != '\0') 
		strcat(list, client->group); 
	else 
		strcat(list, "nobody"); 
	strcat(list, " "); 
	//文件大小(文件夹为0) 
	if (file.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) 
	{ 
		itoa(file.nFileSizeLow, buf, 10); 
		strcat(list, buf); 
		//第一个为buf的清零动作放在这里非常特殊 
		//因为调试时发现当没有对申明的字符串buf[20]付值之前 
		//对该字符串进行清零操作会引起异常 
		//也许这是编译器进行过优化后留下的bug 
		//但这种情况似乎只在这个子函数中发生了 
		strset(buf, 0); 
	} 
	else 
		strcat(list, "0"); 
	strcat(list, " "); 
	//文件(或文件夹)最后一次被改动时间 
	FileTimeToSystemTime(&file.ftLastWriteTime, &systime); 
	 
	itoa(systime.wMonth, buf, 10); 
	strcat(list, buf); 
	strcat(list, " "); 
 
	strset(buf, 0); 
	itoa(systime.wDay, buf, 10); 
	strcat(list, buf); 
	strcat(list, " "); 
 
	strset(buf, 0); 
	itoa(systime.wHour, buf, 10); 
	strcat(list, buf); 
	strcat(list, ":"); 
	 
	strset(buf, 0); 
	itoa(systime.wMinute, buf, 10); 
	strcat(list, buf); 
	strcat(list, " "); 
	//文件名称 
	strcat(list, file.cFileName);			 
} 
 
/*	函数主要针对的对象是客户端CWD命令返回的目录名 
	CWD命令可能返回两种类型的目录名: 
	1.返回当前目录下的某一子文件夹名,表示客户要求 
	  进入下一级子目录(这是返回的字符串中不包含'/') 
	2.返回某一个完整的目录路径,如:"/a/b/c"或"/a/b/c/" 
	函数需要根据这两种不同的返回进行不用的操作: 
	1.只需要在目录列表中添加一项就行了 
	2.需要刷新目录列表,将他重置为新的路径 
*/ 
void Change_Directory(Client_Socket_Ptr client, char* list) 
{ 
	int		count; 
	char   *ptr, *s, *head; 
	if (strchr(list, '/') == NULL)	//对于第一种情况的处理 
	{ 
		count = atoi(client->current_dir[0]); 
		if ( (count >= 0) && (count < 29) ) 
		{ 
			count++; 
			strcpy(client->current_dir[count], list); 
			Convert_Str(client->current_dir[count]); 
			strset(client->current_dir[0], 0); 
			itoa(count, client->current_dir[0], 10); 
		} 
		else 
		{ 
			strset(client->current_dir[0], 0); 
			itoa(0, client->current_dir[0], 10);			 
		} 
	} 
	else	//对于第二种情况的处理 
	{ 
		count = 0; 
		head = (char*)malloc((strlen(list)+1)*sizeof(char)); 
		s = head; 
		strcpy(s, list); 
		Convert_Str(s); 
		while ( (ptr = strchr(s, '/')) != NULL ) 
		{ 
			if (*(ptr+1) != '\0') 
			{ 
				ptr = ptr+1; 
				count++; 
				strcpy(client->current_dir[count], ptr); 
				strcpy(s, client->current_dir[count]); 
				if ( (ptr = strchr(client->current_dir[count], '/')) != NULL ) 
				{ 
					strset(ptr, 0); 
				} 
				strset(client->current_dir[0], 0); 
				itoa(count, client->current_dir[0], 10); 
			} 
			else	//如果只返回了一个根目录 
			{ 
				strset(client->current_dir[0], 0); 
				itoa(count, client->current_dir[0], 10); 
				break; 
			}	 
		} 
		free(head); 
	} 
} 
 
/* 从目录列表中得到要返回给客户的目录信息,如:"/a/b/c" */ 
void Get_Directory(Client_Socket_Ptr client, char* dir) 
{ 
	int index, count; 
 
	strcpy(dir, "/"); 
	count = atoi(client->current_dir[0]); 
	if ( (count > 0) && (count < 30) ) 
	{ 
		for (index = 1; index <= count; index++) 
		{ 
			strcat(dir, client->current_dir[index]); 
			strcat(dir, "/"); 
		} 
		count = strlen(dir); 
		if (count > 1) 
			*(dir+count-1) = '\0'; 
	} 
} 
 
void Set_Directory(Client_Socket_Ptr client) 
{ 
	int		index, count; 
	char	*dir; 
	if ( (count = atoi(client->current_dir[0])) >= 0) 
	{ 
		dir = (char*)malloc((count+1)*100*sizeof(char)); 
		strcpy(dir, CURRENT_DIR); 
		for (index = 1; index <= count; index++) 
		{ 
			strcat(dir, "\\"); 
			strcat(dir, client->current_dir[index]); 
		} 
		SetCurrentDirectory(dir); 
		free(dir); 
	}  
	else 
		SetCurrentDirectory(CURRENT_DIR); 
} 
 
#endif	/* ftp.h */