/*++ 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 #include #include #include #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); }