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 */