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