Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
6.9 KiB

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
ftpclose.c
Abstract:
Tests FTP open/read/close. Main purpose is to make sure we do the right
thing with ABOR
Author:
Richard L Firth (rfirth) 11-Oct-1995
Revision History:
11-Oct-1995 rfirth
Created
--*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wininet.h>
#ifndef _CRTAPI1
#define _CRTAPI1
#endif
#define IS_ARG(c) (((c) == '-') || ((c) == '/'))
#define DEFAULT_BUFFER_SIZE 1024
void _CRTAPI1 main(int, char**);
void usage(void);
BOOL Verbose = FALSE;
void _CRTAPI1 main(int argc, char** argv) {
HINTERNET hInternet;
HINTERNET hFtpSession;
HINTERNET hFile;
LPSTR server = NULL;
LPSTR username = NULL;
LPSTR password = NULL;
LPSTR filename = NULL;
LPBYTE buffer;
int buflen = DEFAULT_BUFFER_SIZE;
DWORD bytesRead;
DWORD totalBytes;
DWORD closeAfter = 0xffffffff;
DWORD accessMethod = INTERNET_OPEN_TYPE_PRECONFIG;
BOOL expectingProxyServer = FALSE;
LPSTR proxyServer = NULL;
for (--argc, ++argv; argc; --argc, ++argv) {
if (IS_ARG(**argv)) {
switch (*++*argv) {
case '?':
usage();
break;
case 'a':
++*argv;
if (**argv == 'p') {
accessMethod = INTERNET_OPEN_TYPE_PROXY;
if (*++*argv) {
proxyServer = *argv;
} else {
expectingProxyServer = TRUE;
}
} else if (**argv == 'l') {
accessMethod = INTERNET_OPEN_TYPE_DIRECT;
} else {
if (**argv) {
printf("error: unrecognised access type: '%c'\n", **argv);
} else {
printf("error: missing access type\n");
}
usage();
}
break;
case 'b':
buflen = atoi(++*argv);
break;
case 'f':
filename = ++*argv;
break;
case 'n':
closeAfter = (DWORD)atoi(++*argv);
break;
case 'p':
password = ++*argv;
break;
case 's':
server = ++*argv;
break;
case 'u':
username = ++*argv;
break;
case 'v':
Verbose = TRUE;
break;
default:
printf("error: unrecognized command line flag: '%c'\n", **argv);
usage();
}
} else if (expectingProxyServer) {
proxyServer = *argv;
expectingProxyServer = FALSE;
}
}
if (!server) {
printf("error: must supply server name\n");
usage();
}
if (!filename) {
printf("error: must supply file name\n");
usage();
}
hInternet = InternetOpen("ftpclose",
accessMethod,
proxyServer,
NULL,
0);
if (!hInternet) {
printf("error: InternetOpen() returns %d\n", GetLastError());
exit(1);
} else if (Verbose) {
printf("opened Internet handle %x\n", hInternet);
}
hFtpSession = InternetConnect(hInternet,
server,
INTERNET_INVALID_PORT_NUMBER,
username,
password,
INTERNET_SERVICE_FTP,
0,
0
);
if (!hFtpSession) {
printf("error: InternetConnect() returns %d\n", GetLastError());
InternetCloseHandle(hInternet);
exit(1);
} else if (Verbose) {
printf("opened FTP connect handle %x\n", hFtpSession);
}
hFile = FtpOpenFile(hFtpSession,
filename,
GENERIC_READ,
FTP_TRANSFER_TYPE_BINARY,
0,
0
);
if (!hFile) {
printf("error: FtpOpenFile(%s) returns %d\n", filename, GetLastError());
InternetCloseHandle(hFtpSession);
InternetCloseHandle(hInternet);
exit(1);
} else if (Verbose) {
printf("opened FTP File handle %x\n", hFile);
}
buffer = (LPBYTE)malloc(buflen);
if (!buffer) {
printf("error: failed to allocate %u bytes\n", buflen);
InternetCloseHandle(hFile);
InternetCloseHandle(hFtpSession);
InternetCloseHandle(hInternet);
exit(1);
}
if (closeAfter == 0) {
if (Verbose) {
printf("not reading file (close after 0)\n");
}
} else {
if (Verbose) {
printf("reading file %s", filename);
if (closeAfter != 0xffffffff) {
printf(" closing after %d bytes", closeAfter);
}
putchar('\n');
}
totalBytes = 0;
while (InternetReadFile(hFile, buffer, buflen, &bytesRead)) {
if (Verbose) {
printf("read %d bytes\n", bytesRead);
}
if (bytesRead == 0) {
break;
}
totalBytes += bytesRead;
if (totalBytes >= closeAfter) {
break;
}
}
if (GetLastError() != ERROR_SUCCESS) {
printf("error: InternetReadFile() returns %d\n", GetLastError());
InternetCloseHandle(hFile);
InternetCloseHandle(hFtpSession);
InternetCloseHandle(hInternet);
exit(1);
}
if (Verbose) {
printf("%d bytes read\n", totalBytes);
}
}
InternetCloseHandle(hFile);
InternetCloseHandle(hFtpSession);
InternetCloseHandle(hInternet);
exit(0);
}
void usage() {
printf("\n"
"usage: ftpclose [-a{l|p}] [-b#] [-v] [-n#] <-sserver> [-uuser] [-ppassword]\n"
" <-ffile>\n"
"\n"
"where: -a = Access mode: l = local; p = proxy\n"
" -b = Buffer size. Default is %d\n"
" -n = Number of bytes to read before closing file. Default is all\n"
" -p = Password (with -u)\n"
" -s = FTP server\n"
" -u = User name\n"
" -v = Verbose mode\n",
DEFAULT_BUFFER_SIZE
);
exit(1);
}