summaryrefslogtreecommitdiffstats
path: root/Source/CTest/Curl/file.c
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2003-01-07 02:13:39 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2003-01-07 02:13:39 (GMT)
commitbaeba76200afb19cf8ea4e67025c1916ac210b13 (patch)
treef9fb8746b534b90c89e1d54e7a16a0b14873f894 /Source/CTest/Curl/file.c
parent0f14e027b5263a78b2bd1d41a319f16dacaa16af (diff)
downloadCMake-baeba76200afb19cf8ea4e67025c1916ac210b13.zip
CMake-baeba76200afb19cf8ea4e67025c1916ac210b13.tar.gz
CMake-baeba76200afb19cf8ea4e67025c1916ac210b13.tar.bz2
Initial import
Diffstat (limited to 'Source/CTest/Curl/file.c')
-rw-r--r--Source/CTest/Curl/file.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/Source/CTest/Curl/file.c b/Source/CTest/Curl/file.c
new file mode 100644
index 0000000..b2270aa
--- /dev/null
+++ b/Source/CTest/Curl/file.c
@@ -0,0 +1,206 @@
+/*****************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * In order to be useful for every potential user, curl and libcurl are
+ * dual-licensed under the MPL and the MIT/X-derivate licenses.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the MPL or the MIT/X-derivate
+ * licenses. You may pick one of these licenses.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * $Id$
+ *****************************************************************************/
+
+#include "setup.h"
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#include <time.h>
+#include <io.h>
+#include <fcntl.h>
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#include <sys/time.h>
+#include <sys/resource.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+#include <signal.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "progress.h"
+#include "sendf.h"
+#include "escape.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+/* The last #include file should be: */
+#ifdef MALLOCDEBUG
+#include "memdebug.h"
+#endif
+
+/* Emulate a connect-then-transfer protocol. We connect to the file here */
+CURLcode Curl_file_connect(struct connectdata *conn)
+{
+ char *actual_path = curl_unescape(conn->path, 0);
+ struct FILE *file;
+ int fd;
+#if defined(WIN32) || defined(__EMX__)
+ int i;
+#endif
+
+ file = (struct FILE *)malloc(sizeof(struct FILE));
+ if(!file)
+ return CURLE_OUT_OF_MEMORY;
+
+ memset(file, 0, sizeof(struct FILE));
+ conn->proto.file = file;
+
+#if defined(WIN32) || defined(__EMX__)
+ /* change path separators from '/' to '\\' for Windows and OS/2 */
+ for (i=0; actual_path[i] != '\0'; ++i)
+ if (actual_path[i] == '/')
+ actual_path[i] = '\\';
+
+ fd = open(actual_path, O_RDONLY | O_BINARY); /* no CR/LF translation! */
+#else
+ fd = open(actual_path, O_RDONLY);
+#endif
+ free(actual_path);
+
+ if(fd == -1) {
+ failf(conn->data, "Couldn't open file %s", conn->path);
+ return CURLE_FILE_COULDNT_READ_FILE;
+ }
+ file->fd = fd;
+
+ return CURLE_OK;
+}
+
+/* This is the do-phase, separated from the connect-phase above */
+
+CURLcode Curl_file(struct connectdata *conn)
+{
+ /* This implementation ignores the host name in conformance with
+ RFC 1738. Only local files (reachable via the standard file system)
+ are supported. This means that files on remotely mounted directories
+ (via NFS, Samba, NT sharing) can be accessed through a file:// URL
+ */
+ CURLcode res = CURLE_OK;
+ struct stat statbuf;
+ ssize_t expected_size=-1;
+ ssize_t nread;
+ struct SessionHandle *data = conn->data;
+ char *buf = data->state.buffer;
+ int bytecount = 0;
+ struct timeval start = Curl_tvnow();
+ struct timeval now = start;
+ int fd;
+
+ /* get the fd from the connection phase */
+ fd = conn->proto.file->fd;
+
+/*VMS?? -- This only works reliable for STREAMLF files */
+ if( -1 != fstat(fd, &statbuf)) {
+ /* we could stat it, then read out the size */
+ expected_size = statbuf.st_size;
+ }
+
+ /* The following is a shortcut implementation of file reading
+ this is both more efficient than the former call to download() and
+ it avoids problems with select() and recv() on file descriptors
+ in Winsock */
+ if(expected_size != -1)
+ Curl_pgrsSetDownloadSize(data, expected_size);
+
+ while (res == CURLE_OK) {
+ nread = read(fd, buf, BUFSIZE-1);
+
+ if ( nread > 0)
+ buf[nread] = 0;
+
+ if (nread <= 0)
+ break;
+
+ bytecount += nread;
+ /* NOTE: The following call to fwrite does CR/LF translation on
+ Windows systems if the target is stdout. Use -O or -o parameters
+ to prevent CR/LF translation (this then goes to a binary mode
+ file descriptor). */
+
+ res = Curl_client_write(data, CLIENTWRITE_BODY, buf, nread);
+ if(res)
+ return res;
+
+ now = Curl_tvnow();
+ if(Curl_pgrsUpdate(conn))
+ res = CURLE_ABORTED_BY_CALLBACK;
+ }
+ now = Curl_tvnow();
+ if(Curl_pgrsUpdate(conn))
+ res = CURLE_ABORTED_BY_CALLBACK;
+
+ close(fd);
+
+ return res;
+}
+
+/*
+ * local variables:
+ * eval: (load-file "../curl-mode.el")
+ * end:
+ * vim600: fdm=marker
+ * vim: et sw=2 ts=2 sts=2 tw=78
+ */