1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (c) 2005 Novell, Inc. 3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * All Rights Reserved. 4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * This program is free software; you can redistribute it and/or 6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * modify it under the terms of version 2 of the GNU General Public License as 7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * published by the Free Software Foundation. 8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * This program is distributed in the hope that it will be useful, 10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * but WITHOUT ANY WARRANTY; without even the implied warranty of 11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * GNU General Public License for more details. 13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * You should have received a copy of the GNU General Public License 15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * along with this program; if not, contact Novell, Inc. 16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * To contact Novell about this file by physical or electronic mail, 18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * you may find current contact information at www.novell.com 19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Author : Rohit Kumar 21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Email ID : rokumar@novell.com 22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Date : 14th July 2005 23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <stdio.h> 27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <string.h> 28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <stdlib.h> 29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <fcntl.h> 301d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 311d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#ifdef WIN32 321d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#include <io.h> 331d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#include <direct.h> 341d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#include <sys/utime.h> 351d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#ifdef _MSC_VER 361d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) 371d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_ISDIR(m) (((m) & S_IFDIR) == S_IFDIR) 381d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_IWUSR S_IWRITE 391d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_IRUSR S_IREAD 401d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_IWOTH 0x0000002 411d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_IROTH 0x0000004 421d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_IWGRP 0x0000010 431d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define S_IRGRP 0x0000020 441d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define mkdir(path, perms) _mkdir(path) /* Match POSIX signature */ 451d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman/* Prevent POSIX deprecation warnings on MSVC */ 461d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define creat _creat 471d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define open _open 481d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define read _read 491d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define write _write 501d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define close _close 511d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define unlink _unlink 521d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#endif /* _MSC_VER */ 531d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#else 54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <dirent.h> 55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <utime.h> 561d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#endif 571d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <errno.h> 59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <unistd.h> 60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <sys/stat.h> 61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <sys/types.h> 62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <rfb/rfb.h> 64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "rfbtightproto.h" 65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "filelistinfo.h" 66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "filetransfermsg.h" 67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "handlefiletransferrequest.h" 68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define SZ_RFBBLOCKSIZE 8192 70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid 73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFreeFileTransferMsg(FileTransferMsg ftm) 74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(ftm.data != NULL) { 77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat free(ftm.data); 78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ftm.data = NULL; 79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ftm.length = 0; 82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/****************************************************************************** 87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Methods to handle file list request. 88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ******************************************************************************/ 89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint CreateFileListInfo(FileListInfoPtr pFileListInfo, char* path, int flag); 91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg CreateFileListErrMsg(char flags); 92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg CreateFileListMsg(FileListInfo fileListInfo, char flags); 93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * This is the method called by HandleFileListRequest to get the file list 97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileListResponseMsg(char* path, char flags) 101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileListMsg; 103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileListInfo fileListInfo; 104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int status = -1; 105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileListMsg, 0, sizeof(FileTransferMsg)); 107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileListInfo, 0, sizeof(FileListInfo)); 108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* fileListInfo can have null data if the folder is Empty 111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat or if some error condition has occured. 112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat The return value is 'failure' only if some error condition has occured. 113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat status = CreateFileListInfo(&fileListInfo, path, !(flags & 0x10)); 115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(status == FAILURE) { 117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListMsg = CreateFileListErrMsg(flags); 118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else { 120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* DisplayFileList(fileListInfo); For Debugging */ 121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListMsg = CreateFileListMsg(fileListInfo, flags); 123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FreeFileListInfo(fileListInfo); 124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileListMsg; 127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 1291d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#if !defined(__GNUC__) && !defined(_MSC_VER) 130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define __FUNCTION__ "unknown" 131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 1331d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#ifdef WIN32 1341d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1351d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman/* Most of the Windows version here is based on https://github.com/danielgindi/FileDir */ 1361d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1371d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define FILETIME_TO_TIME_T(FILETIME) (((((__int64)FILETIME.dwLowDateTime) | (((__int64)FILETIME.dwHighDateTime) << 32)) - 116444736000000000L) / 10000000L) 1381d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1391d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM 1401d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define IS_REGULAR_FILE_HAS_ATTRIBUTE_INTEGRITY_STREAM(dwFileAttributes) (!!(dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM)) 1411d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#else 1421d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define IS_REGULAR_FILE_HAS_ATTRIBUTE_INTEGRITY_STREAM(dwFileAttributes) 0 1431d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#endif 1441d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1451d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA 1461d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define IS_REGULAR_FILE_HAS_ATTRIBUTE_NO_SCRUB_DATA(dwFileAttributes) (!!(dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA)) 1471d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#else 1481d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define IS_REGULAR_FILE_HAS_ATTRIBUTE_NO_SCRUB_DATA(dwFileAttributes) 0 1491d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#endif 1501d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1511d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define IS_REGULAR_FILE(dwFileAttributes) \ 1521d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman ( \ 1531d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !!(dwFileAttributes & FILE_ATTRIBUTE_NORMAL) || \ 1541d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman ( \ 1551d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !(dwFileAttributes & FILE_ATTRIBUTE_DEVICE) && \ 1561d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && \ 1571d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !(dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) && \ 1581d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !IS_REGULAR_FILE_HAS_ATTRIBUTE_INTEGRITY_STREAM(dwFileAttributes) && \ 1591d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !IS_REGULAR_FILE_HAS_ATTRIBUTE_NO_SCRUB_DATA(dwFileAttributes) && \ 1601d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !(dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) && \ 1611d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman !(dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) \ 1621d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman ) \ 1631d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman ) 1641d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1651d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#define IS_FOLDER(dwFileAttributes) (!!(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 1661d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1671d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartmanint 1681d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg HartmanCreateFileListInfo(FileListInfoPtr pFileListInfo, char* path, int flag) 1691d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman{ 1701d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman int pathLen, basePathLength; 1711d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman char *basePath, *pChar; 1721d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman WIN32_FIND_DATAA winFindData; 1731d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman HANDLE findHandle; 1741d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1751d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(path == NULL) { 1761d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman return FAILURE; 1771d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 1781d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1791d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(strlen(path) == 0) { 1801d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman /* In this case we will send the list of entries in ftp root*/ 1811d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman sprintf(path, "%s%s", GetFtpRoot(), "/"); 1821d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 1831d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1841d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman /* Create a search string, like C:\folder\* */ 1851d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1861d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman pathLen = strlen(path); 1871d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman basePath = malloc(pathLen + 3); 1881d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman memcpy(basePath, path, pathLen); 1891d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman basePathLength = pathLen; 1901d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman basePath[basePathLength] = '\\'; 1911d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman basePath[basePathLength + 1] = '*'; 1921d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman basePath[basePathLength + 2] = '\0'; 1931d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1941d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman /* Start a search */ 1951d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman memset(&winFindData, 0, sizeof(winFindData)); 1961d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman findHandle = FindFirstFileA(path, &winFindData); 1971d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 1981d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman basePath[basePathLength] = '\0'; /* Restore to a basePath + \ */ 1991d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman /* Convert \ to / */ 2001d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman for(pChar = basePath; *pChar; pChar++) { 2011d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if (*pChar == '\\') { 2021d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman *pChar = '/'; 2031d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2041d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2051d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2061d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman /* While we can find a next file do... 2071d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman But ignore \. and '.. entries, which are current folder and parent folder respectively */ 2081d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman while(findHandle != INVALID_HANDLE_VALUE && winFindData.cFileName[0] == '.' && 2091d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman (winFindData.cFileName[1] == '\0' || 2101d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman (winFindData.cFileName[1] == '.' && winFindData.cFileName[2] == '\0'))) { 2111d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman char fullpath[PATH_MAX]; 2121d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman fullpath[0] = 0; 2131d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2141d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman strncpy_s(fullpath, PATH_MAX, basePath, basePathLength); 2151d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman strncpy_s(fullpath + basePathLength, PATH_MAX - basePathLength, winFindData.cFileName, (int)strlen(winFindData.cFileName)); 2161d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2171d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(IS_FOLDER(winFindData.dwFileAttributes)) { 2181d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if (AddFileListItemInfo(pFileListInfo, winFindData.cFileName, -1, 0) == 0) { 2191d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman rfbLog("File [%s]: Method [%s]: Add directory %s in the" 2201d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman " list failed\n", __FILE__, __FUNCTION__, fullpath); 2211d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman continue; 2221d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2231d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2241d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman else if(IS_REGULAR_FILE(winFindData.dwFileAttributes)) { 2251d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(flag) { 2261d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman unsigned int fileSize = (winFindData.nFileSizeHigh * (MAXDWORD+1)) + winFindData.nFileSizeLow; 2271d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(AddFileListItemInfo(pFileListInfo, winFindData.cFileName, fileSize, FILETIME_TO_TIME_T(winFindData.ftLastWriteTime)) == 0) { 2281d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman rfbLog("File [%s]: Method [%s]: Add file %s in the " 2291d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman "list failed\n", __FILE__, __FUNCTION__, fullpath); 2301d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman continue; 2311d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2321d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2331d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2341d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2351d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(FindNextFileA(findHandle, &winFindData) == 0) { 2361d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman FindClose(findHandle); 2371d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman findHandle = INVALID_HANDLE_VALUE; 2381d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2391d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2401d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2411d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(findHandle != INVALID_HANDLE_VALUE) { 2421d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman FindClose(findHandle); 2431d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2441d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2451d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman free(basePath); 2461d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2471d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman return SUCCESS; 2481d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman} 2491d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2501d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#else /* WIN32 */ 2511d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 252a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint 253a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileListInfo(FileListInfoPtr pFileListInfo, char* path, int flag) 254a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 255a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat DIR* pDir = NULL; 256a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct dirent* pDirent = NULL; 2571d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2581d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(path == NULL) { 2591d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman return FAILURE; 2601d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman } 2611d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 2621d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman if(strlen(path) == 0) { 263a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* In this case we will send the list of entries in ftp root*/ 264a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sprintf(path, "%s%s", GetFtpRoot(), "/"); 265a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 266a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 267a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((pDir = opendir(path)) == NULL) { 268a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: not able to open the dir\n", 269a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 270a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return FAILURE; 271a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 272a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 273a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while((pDirent = readdir(pDir))) { 274a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(strcmp(pDirent->d_name, ".") && strcmp(pDirent->d_name, "..")) { 275a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct stat stat_buf; 276a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* 277a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int fpLen = sizeof(char)*(strlen(pDirent->d_name)+strlen(path)+2); 278a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 279a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char fullpath[PATH_MAX]; 280a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 281a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(fullpath, 0, PATH_MAX); 282a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 283a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcpy(fullpath, path); 284a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(path[strlen(path)-1] != '/') 285a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcat(fullpath, "/"); 286a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcat(fullpath, pDirent->d_name); 287a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 288a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(stat(fullpath, &stat_buf) < 0) { 289a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Reading stat for file %s failed\n", 290a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__, fullpath); 291a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat continue; 292a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 293a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 294a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(S_ISDIR(stat_buf.st_mode)) { 295a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(AddFileListItemInfo(pFileListInfo, pDirent->d_name, -1, 0) == 0) { 296a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Add directory %s in the" 297a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat " list failed\n", __FILE__, __FUNCTION__, fullpath); 298a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat continue; 299a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 300a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 301a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else { 302a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flag) { 303a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(AddFileListItemInfo(pFileListInfo, pDirent->d_name, 304a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat stat_buf.st_size, 305a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat stat_buf.st_mtime) == 0) { 306a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Add file %s in the " 307a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat "list failed\n", __FILE__, __FUNCTION__, fullpath); 308a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat continue; 309a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 310a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 311a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 312a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 313a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 314a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(closedir(pDir) < 0) { 315a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: ERROR Couldn't close dir\n", 316a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 317a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 318a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 319a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return SUCCESS; 320a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 321a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 3221d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#endif 3231d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 324a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 325a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 326a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileListErrMsg(char flags) 327a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 328a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileListMsg; 329a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbFileListDataMsg* pFLD = NULL; 330a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char* data = NULL; 331a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned int length = 0; 332a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 333a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileListMsg, 0, sizeof(FileTransferMsg)); 334a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 335a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat data = (char*) calloc(sizeof(rfbFileListDataMsg), sizeof(char)); 336a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(data == NULL) { 337a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileListMsg; 338a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 339a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat length = sizeof(rfbFileListDataMsg) * sizeof(char); 340a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD = (rfbFileListDataMsg*) data; 341a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 342a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->type = rfbFileListData; 343a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->numFiles = Swap16IfLE(0); 344a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->dataSize = Swap16IfLE(0); 345a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->compressedSize = Swap16IfLE(0); 346a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->flags = flags | 0x80; 347a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 348a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListMsg.data = data; 349a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListMsg.length = length; 350a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 351a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileListMsg; 352a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 353a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 354a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 355a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 356a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileListMsg(FileListInfo fileListInfo, char flags) 357a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 358a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileListMsg; 359a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbFileListDataMsg* pFLD = NULL; 360a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *data = NULL, *pFileNames = NULL; 361a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned int length = 0, dsSize = 0, i = 0; 362a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileListItemSizePtr pFileListItemSize = NULL; 363a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 364a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileListMsg, 0, sizeof(FileTransferMsg)); 365a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dsSize = fileListInfo.numEntries * 8; 366a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat length = sz_rfbFileListDataMsg + dsSize + 367a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat GetSumOfFileNamesLength(fileListInfo) + 368a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListInfo.numEntries; 369a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 370a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat data = (char*) calloc(length, sizeof(char)); 371a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(data == NULL) { 372a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileListMsg; 373a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 374a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD = (rfbFileListDataMsg*) data; 375a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFileListItemSize = (FileListItemSizePtr) &data[sz_rfbFileListDataMsg]; 376a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFileNames = &data[sz_rfbFileListDataMsg + dsSize]; 377a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 378a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->type = rfbFileListData; 379a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->flags = flags & 0xF0; 380a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->numFiles = Swap16IfLE(fileListInfo.numEntries); 381a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->dataSize = Swap16IfLE(GetSumOfFileNamesLength(fileListInfo) + 382a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListInfo.numEntries); 383a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFLD->compressedSize = pFLD->dataSize; 384a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 385a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for(i =0; i <fileListInfo.numEntries; i++) { 386a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFileListItemSize[i].size = Swap32IfLE(GetFileSizeAt(fileListInfo, i)); 387a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFileListItemSize[i].data = Swap32IfLE(GetFileDataAt(fileListInfo, i)); 388a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcpy(pFileNames, GetFileNameAt(fileListInfo, i)); 389a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 390a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(i+1 < fileListInfo.numEntries) 391a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFileNames += strlen(pFileNames) + 1; 392a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 393a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 394a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListMsg.data = data; 395a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileListMsg.length = length; 396a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 397a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileListMsg; 398a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 399a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 400a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 401a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/****************************************************************************** 402a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Methods to handle File Download Request. 403a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ******************************************************************************/ 404a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 405a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg CreateFileDownloadErrMsg(char* reason, unsigned int reasonLen); 406a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg CreateFileDownloadZeroSizeDataMsg(unsigned long mTime); 407a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg CreateFileDownloadBlockSizeDataMsg(unsigned short sizeFile, char *pFile); 408a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 409a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 410a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileDownLoadErrMsg() 411a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 412a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileDownloadErrMsg; 413a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 414a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason[] = "An internal error on the server caused download failure"; 415a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 416a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 417a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileDownloadErrMsg, 0, sizeof(FileTransferMsg)); 418a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 419a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadErrMsg = CreateFileDownloadErrMsg(reason, reasonLen); 420a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 421a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadErrMsg; 422a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 423a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 424a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 425a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 426a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileDownloadReadDataErrMsg() 427a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 428a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason[] = "Cannot open file, perhaps it is absent or is a directory"; 429a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 430a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 431a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return CreateFileDownloadErrMsg(reason, reasonLen); 432a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 433a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 434a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 435a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 436a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 437a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileDownloadLengthErrResponseMsg() 438a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 439a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason [] = "Path length exceeds PATH_MAX (4096) bytes"; 440a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 441a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 442a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return CreateFileDownloadErrMsg(reason, reasonLen); 443a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 444a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 445a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 446a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 447a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileDownloadResponseMsgInBlocks(rfbClientPtr cl, rfbTightClientPtr rtcp) 448a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 449a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* const unsigned int sz_rfbBlockSize = SZ_RFBBLOCKSIZE; */ 450a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int numOfBytesRead = 0; 451a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char pBuf[SZ_RFBBLOCKSIZE]; 452a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char* path = rtcp->rcft.rcfd.fName; 453a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 454a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(pBuf, 0, SZ_RFBBLOCKSIZE); 455a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 456a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((rtcp->rcft.rcfd.downloadInProgress == FALSE) && (rtcp->rcft.rcfd.downloadFD == -1)) { 457a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((rtcp->rcft.rcfd.downloadFD = open(path, O_RDONLY)) == -1) { 458a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Error: Couldn't open file\n", 459a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 460a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return GetFileDownloadReadDataErrMsg(); 461a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 462a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfd.downloadInProgress = TRUE; 463a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 464a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((rtcp->rcft.rcfd.downloadInProgress == TRUE) && (rtcp->rcft.rcfd.downloadFD != -1)) { 465a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if( (numOfBytesRead = read(rtcp->rcft.rcfd.downloadFD, pBuf, SZ_RFBBLOCKSIZE)) <= 0) { 466a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat close(rtcp->rcft.rcfd.downloadFD); 467a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfd.downloadFD = -1; 468a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfd.downloadInProgress = FALSE; 469a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(numOfBytesRead == 0) { 470a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return CreateFileDownloadZeroSizeDataMsg(rtcp->rcft.rcfd.mTime); 471a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 472a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return GetFileDownloadReadDataErrMsg(); 473a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 474a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return CreateFileDownloadBlockSizeDataMsg(numOfBytesRead, pBuf); 475a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 476a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return GetFileDownLoadErrMsg(); 477a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 478a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 479a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 480a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 481a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatChkFileDownloadErr(rfbClientPtr cl, rfbTightClientPtr rtcp) 482a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 483a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileDownloadMsg; 484a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct stat stat_buf; 485a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int sz_rfbFileSize = 0; 486a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char* path = rtcp->rcft.rcfd.fName; 487a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 488a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileDownloadMsg, 0, sizeof(FileTransferMsg)); 489a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 490a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if( (path == NULL) || (strlen(path) == 0) || 491a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (stat(path, &stat_buf) < 0) || (!(S_ISREG(stat_buf.st_mode))) ) { 492a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 493a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason[] = "Cannot open file, perhaps it is absent or is not a regular file"; 494a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 495a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 496a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Reading stat for path %s failed\n", 497a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__, path); 498a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 499a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadMsg = CreateFileDownloadErrMsg(reason, reasonLen); 500a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 501a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else { 502a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfd.mTime = stat_buf.st_mtime; 503a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sz_rfbFileSize = stat_buf.st_size; 504a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(sz_rfbFileSize <= 0) { 505a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadMsg = CreateFileDownloadZeroSizeDataMsg(stat_buf.st_mtime); 506a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 507a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 508a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 509a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadMsg; 510a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 511a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 512a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 513a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 514a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileDownloadErrMsg(char* reason, unsigned int reasonLen) 515a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 516a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileDownloadErrMsg; 517a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int length = sz_rfbFileDownloadFailedMsg + reasonLen + 1; 518a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbFileDownloadFailedMsg *pFDF = NULL; 519a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pFollow = NULL; 520a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 521a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pData = (char*) calloc(length, sizeof(char)); 522a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileDownloadErrMsg, 0, sizeof(FileTransferMsg)); 523a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pData == NULL) { 524a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: pData is NULL\n", 525a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 526a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadErrMsg; 527a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 528a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 529a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDF = (rfbFileDownloadFailedMsg *) pData; 530a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFollow = &pData[sz_rfbFileDownloadFailedMsg]; 531a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 532a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDF->type = rfbFileDownloadFailed; 533a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDF->reasonLen = Swap16IfLE(reasonLen); 534a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memcpy(pFollow, reason, reasonLen); 535a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 536a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadErrMsg.data = pData; 537a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadErrMsg.length = length; 538a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 539a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadErrMsg; 540a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 541a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 542a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 543a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 544a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileDownloadZeroSizeDataMsg(unsigned long mTime) 545a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 546a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileDownloadZeroSizeDataMsg; 547a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int length = sz_rfbFileDownloadDataMsg + sizeof(unsigned long); 548a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbFileDownloadDataMsg *pFDD = NULL; 549a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pFollow = NULL; 550a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 551a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pData = (char*) calloc(length, sizeof(char)); 552a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileDownloadZeroSizeDataMsg, 0, sizeof(FileTransferMsg)); 553a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pData == NULL) { 554a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: pData is NULL\n", 555a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 556a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadZeroSizeDataMsg; 557a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 558a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 559a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD = (rfbFileDownloadDataMsg *) pData; 560a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFollow = &pData[sz_rfbFileDownloadDataMsg]; 561a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 562a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->type = rfbFileDownloadData; 563a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->compressLevel = 0; 564a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->compressedSize = Swap16IfLE(0); 565a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->realSize = Swap16IfLE(0); 566a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 567a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memcpy(pFollow, &mTime, sizeof(unsigned long)); 568a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 569a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadZeroSizeDataMsg.data = pData; 570a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadZeroSizeDataMsg.length = length; 571a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 572a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadZeroSizeDataMsg; 573a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 574a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 575a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 576a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 577a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 578a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileDownloadBlockSizeDataMsg(unsigned short sizeFile, char *pFile) 579a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 580a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileDownloadBlockSizeDataMsg; 581a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int length = sz_rfbFileDownloadDataMsg + sizeFile; 582a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbFileDownloadDataMsg *pFDD = NULL; 583a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pFollow = NULL; 584a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 585a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pData = (char*) calloc(length, sizeof(char)); 586a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileDownloadBlockSizeDataMsg, 0, sizeof(FileTransferMsg)); 587a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(NULL == pData) { 588a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: pData is NULL\n", 589a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 590a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadBlockSizeDataMsg; 591a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 592a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 593a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD = (rfbFileDownloadDataMsg *) pData; 594a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFollow = &pData[sz_rfbFileDownloadDataMsg]; 595a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 596a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->type = rfbFileDownloadData; 597a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->compressLevel = 0; 598a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->compressedSize = Swap16IfLE(sizeFile); 599a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDD->realSize = Swap16IfLE(sizeFile); 600a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 601a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memcpy(pFollow, pFile, sizeFile); 602a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 603a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadBlockSizeDataMsg.data = pData; 604a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileDownloadBlockSizeDataMsg.length = length; 605a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 606a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileDownloadBlockSizeDataMsg; 607a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 608a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 609a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 610a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 611a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/****************************************************************************** 612a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Methods to handle file upload request 613a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ******************************************************************************/ 614a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 615a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg CreateFileUploadErrMsg(char* reason, unsigned int reasonLen); 616a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 617a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 618a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileUploadLengthErrResponseMsg() 619a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 620a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason [] = "Path length exceeds PATH_MAX (4096) bytes"; 621a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 622a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 623a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return CreateFileUploadErrMsg(reason, reasonLen); 624a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 625a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 626a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 627a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 628a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatChkFileUploadErr(rfbClientPtr cl, rfbTightClientPtr rtcp) 629a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 630a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileUploadErrMsg; 631a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 632a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileUploadErrMsg, 0, sizeof(FileTransferMsg)); 633a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if( (rtcp->rcft.rcfu.fName == NULL) || 634a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (strlen(rtcp->rcft.rcfu.fName) == 0) || 635a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ((rtcp->rcft.rcfu.uploadFD = creat(rtcp->rcft.rcfu.fName, 636a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) == -1)) { 637a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 638a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason[] = "Could not create file"; 639a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 640a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileUploadErrMsg = CreateFileUploadErrMsg(reason, reasonLen); 641a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 642a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else 643a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfu.uploadInProgress = TRUE; 644a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 645a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileUploadErrMsg; 646a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 647a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 648a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 649a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 650a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGetFileUploadCompressedLevelErrMsg() 651a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 652a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason[] = "Server does not support data compression on upload"; 653a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 654a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 655a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return CreateFileUploadErrMsg(reason, reasonLen); 656a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 657a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 658a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 659a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 660a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatChkFileUploadWriteErr(rfbClientPtr cl, rfbTightClientPtr rtcp, char* pBuf) 661a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 662a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg ftm; 663a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long numOfBytesWritten = 0; 664a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 665a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&ftm, 0, sizeof(FileTransferMsg)); 666a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 667a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat numOfBytesWritten = write(rtcp->rcft.rcfu.uploadFD, pBuf, rtcp->rcft.rcfu.fSize); 668a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 669a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(numOfBytesWritten != rtcp->rcft.rcfu.fSize) { 670a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char reason[] = "Error writing file data"; 671a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int reasonLen = strlen(reason); 672a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ftm = CreateFileUploadErrMsg(reason, reasonLen); 673a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat CloseUndoneFileTransfer(cl, rtcp); 674a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 675a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return ftm; 676a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 677a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 678a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 679a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid 680a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileUpdateComplete(rfbClientPtr cl, rfbTightClientPtr rtcp) 681a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 682a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* Here we are settimg the modification and access time of the file */ 683a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* Windows code stes mod/access/creation time of the file */ 684a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct utimbuf utb; 685a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 686a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat utb.actime = utb.modtime = rtcp->rcft.rcfu.mTime; 687a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(utime(rtcp->rcft.rcfu.fName, &utb) == -1) { 688a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Setting the modification/access" 689a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat " time for the file <%s> failed\n", __FILE__, 690a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FUNCTION__, rtcp->rcft.rcfu.fName); 691a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 692a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 693a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rtcp->rcft.rcfu.uploadFD != -1) { 694a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat close(rtcp->rcft.rcfu.uploadFD); 695a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfu.uploadFD = -1; 696a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfu.uploadInProgress = FALSE; 697a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 698a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 699a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 700a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 701a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFileTransferMsg 702a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateFileUploadErrMsg(char* reason, unsigned int reasonLen) 703a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 704a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FileTransferMsg fileUploadErrMsg; 705a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int length = sz_rfbFileUploadCancelMsg + reasonLen; 706a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbFileUploadCancelMsg *pFDF = NULL; 707a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pFollow = NULL; 708a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 709a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *pData = (char*) calloc(length, sizeof(char)); 710a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(&fileUploadErrMsg, 0, sizeof(FileTransferMsg)); 711a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pData == NULL) { 712a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: pData is NULL\n", 713a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__); 714a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileUploadErrMsg; 715a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 716a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 717a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDF = (rfbFileUploadCancelMsg *) pData; 718a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFollow = &pData[sz_rfbFileUploadCancelMsg]; 719a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 720a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDF->type = rfbFileUploadCancel; 721a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pFDF->reasonLen = Swap16IfLE(reasonLen); 722a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memcpy(pFollow, reason, reasonLen); 723a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 724a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileUploadErrMsg.data = pData; 725a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fileUploadErrMsg.length = length; 726a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 727a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return fileUploadErrMsg; 728a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 729a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 730a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 731a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/****************************************************************************** 732a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Method to cancel File Transfer operation. 733a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ******************************************************************************/ 734a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 735a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid 736a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCloseUndoneFileTransfer(rfbClientPtr cl, rfbTightClientPtr rtcp) 737a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 738a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* TODO :: File Upload case is not handled currently */ 739a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* TODO :: In case of concurrency we need to use Critical Section */ 740a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 741a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(cl == NULL) 742a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 743a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 744a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 745a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rtcp->rcft.rcfu.uploadInProgress == TRUE) { 746a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfu.uploadInProgress = FALSE; 747a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 748a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rtcp->rcft.rcfu.uploadFD != -1) { 749a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat close(rtcp->rcft.rcfu.uploadFD); 750a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfu.uploadFD = -1; 751a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 752a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 753a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(unlink(rtcp->rcft.rcfu.fName) == -1) { 754a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Delete operation on file <%s> failed\n", 755a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__, rtcp->rcft.rcfu.fName); 756a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 757a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 758a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(rtcp->rcft.rcfu.fName, 0 , PATH_MAX); 759a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 760a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 761a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rtcp->rcft.rcfd.downloadInProgress == TRUE) { 762a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfd.downloadInProgress = FALSE; 763a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 764a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rtcp->rcft.rcfd.downloadFD != -1) { 765a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat close(rtcp->rcft.rcfd.downloadFD); 766a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rtcp->rcft.rcfd.downloadFD = -1; 767a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 768a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(rtcp->rcft.rcfd.fName, 0 , PATH_MAX); 769a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 770a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 771a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 772a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 773a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/****************************************************************************** 774a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Method to handle create directory request. 775a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ******************************************************************************/ 776a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 7771d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#ifdef _MSC_VER 7781d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#undef CreateDirectory /* Prevent macro clashes under Windows */ 7791d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman#endif /* _MSC_VER */ 7801d80c6a8d34f59543f7df1963c22d7efa292bcb0Greg Hartman 781a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid 782a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatCreateDirectory(char* dirName) 783a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 784a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(dirName == NULL) return; 785a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 786a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(mkdir(dirName, 0700) == -1) { 787a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("File [%s]: Method [%s]: Create operation for directory <%s> failed\n", 788a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat __FILE__, __FUNCTION__, dirName); 789a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 790a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 791