/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 1998 - 2002, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://curl.haxx.se/docs/copyright.html. * * 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 COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * * $Id: main.c,v 1.1.1.3 2002/11/26 19:08:06 zarzycki Exp $ ***************************************************************************/ /* This is now designed to have its own local setup.h */ #include "setup.h" #include #include #include #include #include #include #include #include #define _MPRINTF_REPLACE /* we want curl-functions instead of native ones */ #include #include "urlglob.h" #include "writeout.h" #ifdef USE_ENVIRONMENT #include "writeenv.h" #endif #define CURLseparator "--_curl_--" #if defined(WIN32)&&!defined(__CYGWIN32__) #include #endif #include "version.h" #ifdef HAVE_IO_H /* typical win32 habit */ #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UTIME_H #include #else #ifdef HAVE_SYS_UTIME_H #include #endif #endif #ifdef HAVE_SYS_POLL_H #include #endif /* The last #include file should be: */ #ifdef MALLOCDEBUG /* this is low-level hard-hacking memory leak tracking shit */ #include "../lib/memdebug.h" #endif #define DEFAULT_MAXREDIRS 50L #ifndef __cplusplus /* (rabe) */ #ifndef typedef_bool typedef char bool; #endif #endif /* (rabe) */ #define CURL_PROGRESS_STATS 0 /* default progress display */ #define CURL_PROGRESS_BAR 1 typedef enum { HTTPREQ_UNSPEC, HTTPREQ_GET, HTTPREQ_HEAD, HTTPREQ_POST, HTTPREQ_SIMPLEPOST, HTTPREQ_CUSTOM, HTTPREQ_LAST } HttpReq; /* Just a set of bits */ #define CONF_DEFAULT 0 #define CONF_AUTO_REFERER (1<<4) /* the automatic referer-system please! */ #define CONF_VERBOSE (1<<5) /* talk a lot */ #define CONF_HEADER (1<<8) /* throw the header out too */ #define CONF_NOPROGRESS (1<<10) /* shut off the progress meter */ #define CONF_NOBODY (1<<11) /* use HEAD to get http document */ #define CONF_FAILONERROR (1<<12) /* no output on http error codes >= 300 */ #define CONF_UPLOAD (1<<14) /* this is an upload */ #define CONF_FTPLISTONLY (1<<16) /* Use NLST when listing ftp dir */ #define CONF_FTPAPPEND (1<<20) /* Append instead of overwrite on upload! */ #define CONF_NETRC (1<<22) /* read user+password from .netrc */ #define CONF_FOLLOWLOCATION (1<<23) /* use Location: Luke! */ #define CONF_GETTEXT (1<<24) /* use ASCII/text for transfer */ #define CONF_HTTPPOST (1<<25) /* multipart/form-data HTTP POST */ #define CONF_MUTE (1<<28) /* force NOPROGRESS */ #define CONF_NETRC_OPT (1<<29) /* read user+password from either * .netrc or URL*/ #ifndef HAVE_STRDUP /* Ultrix doesn't have strdup(), so make a quick clone: */ char *strdup(char *str) { int len; char *newstr; len = strlen(str); newstr = (char *) malloc((len+1)*sizeof(char)); if (!newstr) return (char *)NULL; strcpy(newstr,str); return newstr; } #endif #ifdef VMS int vms_show = 0; #define FAC_CURL 0xC01 #define FAC_SYSTEM 0 #define MSG_NORMAL 0 #define VMS_STS(c,f,e,s) (((c&0xF)<<28)|((f&0xFFF)<<16)|((e&0x1FFF)<3)|(s&7)) #define VMSSTS_HIDE VMS_STS(1,0,0,0) #define SEV_WARNING 0 #define SEV_SUCCESS 1 #define SEV_ERROR 2 #define SEV_INFO 3 /* success, with an extra hint */ #define SEV_FATAL 4 globalvalue int CURL_UNSUPPROTO; /* these are from curlmsg.msg file..... */ globalvalue int CURL_FAILINIT; globalvalue int CURL_BADURLSYN; globalvalue int CURL_BADURLUSER; globalvalue int CURL_BADPROXY; globalvalue int CURL_BADHOST; globalvalue int CURL_FAILHOST; globalvalue int CURL_FTPUNKREPLY; globalvalue int CURL_FTPNOACC; globalvalue int CURL_FTPUSRPW; globalvalue int CURL_FTPBADPASS; globalvalue int CURL_FTPBADUSER; globalvalue int CURL_FTPBADPASV; globalvalue int CURL_FTPBAD227; globalvalue int CURL_FTPBADHOST227; globalvalue int CURL_FTPNORECONN; globalvalue int CURL_FTPNOBIN; globalvalue int CURL_PARTIALFILE; globalvalue int CURL_FTPNORETR; globalvalue int CURL_FTPWRITERR; globalvalue int CURL_FTPNOQUOTE; globalvalue int CURL_HTTPPNF; globalvalue int CURL_WRITERR; globalvalue int CURL_BADUSER; globalvalue int CURL_FTPNOSTOR; globalvalue int CURL_READERR; globalvalue int CURL_OUTOFMEM; globalvalue int CURL_TIMEOUT; globalvalue int CURL_FTPNOASCII; globalvalue int CURL_FTPNOPORT; globalvalue int CURL_FTPNOREST; globalvalue int CURL_FTPNOSIZE; globalvalue int CURL_HTTPRNGERR; globalvalue int CURL_HTTPPOSTERR; globalvalue int CURL_SSLNOCONN; globalvalue int CURL_FTPBADRESUME; globalvalue int CURL_FILENOACC; globalvalue int CURL_LDAPNOBIND; globalvalue int CURL_LDAPNOSRCH; globalvalue int CURL_LDAPNOLIB; globalvalue int CURL_LDAPNOFUNC; globalvalue int CURL_ABORTCB; globalvalue int CURL_BADPARAM; globalvalue int CURL_BADORDER; globalvalue int CURL_BADPWD; globalvalue int CURL_MNYREDIR; globalvalue int CURL_UNKTELNET; globalvalue int CURL_UNKMSG; globalvalue int CURL_BADSSLCERT; globalvalue int CURL_SRVNOERR; globalvalue int CURL_MAXMSG; long vms_cond[] = { VMS_STS(1,FAC_SYSTEM,MSG_NORMAL,SEV_SUCCESS), CURL_UNSUPPROTO, /* these are from curlmsg.msg file..... */ CURL_FAILINIT, CURL_BADURLSYN, CURL_BADURLUSER, CURL_BADPROXY, CURL_BADHOST, CURL_FAILHOST, CURL_FTPUNKREPLY, CURL_FTPNOACC, CURL_FTPUSRPW, CURL_FTPBADPASS, CURL_FTPBADUSER, CURL_FTPBADPASV, CURL_FTPBAD227, CURL_FTPBADHOST227, CURL_FTPNORECONN, CURL_FTPNOBIN, CURL_PARTIALFILE, CURL_FTPNORETR, CURL_FTPWRITERR, CURL_FTPNOQUOTE, CURL_HTTPPNF, CURL_WRITERR, CURL_BADUSER, CURL_FTPNOSTOR, CURL_READERR, CURL_OUTOFMEM, CURL_TIMEOUT, CURL_FTPNOASCII, CURL_FTPNOPORT, CURL_FTPNOREST, CURL_FTPNOSIZE, CURL_HTTPRNGERR, CURL_HTTPPOSTERR, CURL_SSLNOCONN, CURL_FTPBADRESUME, CURL_FILENOACC, CURL_LDAPNOBIND, CURL_LDAPNOSRCH, CURL_LDAPNOLIB, CURL_LDAPNOFUNC, CURL_ABORTCB, CURL_BADPARAM, CURL_BADORDER, CURL_BADPWD, CURL_MNYREDIR, CURL_UNKTELNET, CURL_UNKMSG, CURL_BADSSLCERT, CURL_SRVNOERR, CURL_MAXMSG }; #endif extern void hugehelp(void); /* * This is the main global constructor for the app. Call this before * _any_ libcurl usage. If this fails, *NO* libcurl functions may be * used, or havoc may be the result. */ CURLcode main_init(void) { return curl_global_init(CURL_GLOBAL_DEFAULT); } /* * This is the main global destructor for the app. Call this after * _all_ libcurl usage is done. */ void main_free(void) { curl_global_cleanup(); } int SetHTTPrequest(HttpReq req, HttpReq *store) { if((*store == HTTPREQ_UNSPEC) || (*store == req)) { *store = req; return 0; } fprintf(stderr, "You can only select one HTTP request!\n"); return 1; } static void helpf(const char *fmt, ...) { va_list ap; if(fmt) { va_start(ap, fmt); fputs("curl: ", stderr); /* prefix it */ vfprintf(stderr, fmt, ap); va_end(ap); } fprintf(stderr, "curl: try 'curl --help' for more information\n"); } /* * A chain of these nodes contain URL to get and where to put the URL's * contents. */ struct getout { struct getout *next; char *url; char *outfile; int flags; }; #define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */ #define GETOUT_URL (1<<1) /* set when URL is deemed done */ #define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */ static void help(void) { printf(CURL_ID "%s\n" "Usage: curl [options...] \n" "Options: (H) means HTTP/HTTPS only, (F) means FTP only\n" " -a/--append Append to target file when uploading (F)\n" " -A/--user-agent User-Agent to send to server (H)\n" " -b/--cookie Cookie string or file to read cookies from (H)\n" " -B/--use-ascii Use ASCII/text transfer\n", curl_version()); puts(" -c/--cookie-jar Write all cookies to this file after operation (H)\n" " -C/--continue-at Specify absolute resume offset\n" " -d/--data HTTP POST data (H)\n" " --data-ascii HTTP POST ASCII data (H)\n" " --data-binary HTTP POST binary data (H)\n" " --disable-epsv Prevents curl from using EPSV (F)\n" " -D/--dump-header Write the headers to this file\n" " --egd-file EGD socket path for random data (SSL)\n" #ifdef USE_ENVIRONMENT " --environment Write result codes to environment variables (RISC OS)\n" #endif " -e/--referer Referer page (H)"); puts(" -E/--cert Specifies your certificate file and password (HTTPS)\n" " --cert-type Specifies certificate file type (DER/PEM/ENG) (HTTPS)\n" " --key Specifies private key file (HTTPS)\n" " --key-type Specifies private key file type (DER/PEM/ENG) (HTTPS)\n" " --pass Specifies passphrase for the private key (HTTPS)"); puts(" --engine Specifies the crypto engine to use (HTTPS)\n" " --cacert CA certifciate to verify peer against (SSL)\n" " --capath CA directory (made using c_rehash) to verify\n" " peer against (SSL, NOT Windows)\n" " --ciphers What SSL ciphers to use (SSL)\n" " --compressed Request a compressed response (using deflate)."); puts(" --connect-timeout Maximum time allowed for connection\n" " --crlf Convert LF to CRLF in upload. Useful for MVS (OS/390)\n" " -f/--fail Fail silently (no output at all) on errors (H)\n" " -F/--form Specify HTTP POST data (H)\n" " -g/--globoff Disable URL sequences and ranges using {} and []\n" " -G/--get Send the -d data with a HTTP GET (H)"); puts(" -h/--help This help text\n" " -H/--header Custom header to pass to server. (H)\n" " -i/--include Include the HTTP-header in the output (H)\n" " -I/--head Fetch document info only (HTTP HEAD/FTP SIZE)"); puts(" -j/--junk-session-cookies Ignore session cookies read from file (H)\n" " --interface Specify the interface to be used\n" " --krb4 Enable krb4 with specified security level (F)\n" " -k/--insecure Allow curl to connect to SSL sites without certs (H)\n" " -K/--config Specify which config file to read\n" " -l/--list-only List only names of an FTP directory (F)\n" " --limit-rate Limit how fast transfers to allow"); puts(" -L/--location Follow Location: hints (H)\n" " -m/--max-time Maximum time allowed for the transfer\n" " -M/--manual Display huge help text\n" " -n/--netrc Must read .netrc for user name and password\n" " --netrc-optional Use either .netrc or URL; overrides -n\n" " -N/--no-buffer Disables the buffering of the output stream"); puts(" -o/--output Write output to instead of stdout\n" " -O/--remote-name Write output to a file named as the remote file\n" " -p/--proxytunnel Perform non-HTTP services through a HTTP proxy\n" " -P/--ftpport
Use PORT with address instead of PASV when ftping (F)\n" " -q When used as the first parameter disables .curlrc\n" " -Q/--quote Send QUOTE command to FTP before file transfer (F)"); puts(" -r/--range Retrieve a byte range from a HTTP/1.1 or FTP server\n" " -R/--remote-time Set the remote file's time on the local output\n" " -s/--silent Silent mode. Don't output anything\n" " -S/--show-error Show error. With -s, make curl show errors when they occur"); puts(" --stderr Where to redirect stderr. - means stdout.\n" " -t/--telnet-option Set telnet option\n" " --trace Dump a network/debug trace to the given file\n" " --trace-ascii Like --trace but without the hex output\n" " -T/--upload-file Transfer/upload to remote site\n" " --url Another way to specify URL to work with"); puts(" -u/--user Specify user and password to use\n" " Overrides -n and --netrc-optional\n" " -U/--proxy-user Specify Proxy authentication\n" " -v/--verbose Makes the operation more talkative\n" " -V/--version Outputs version number then quits"); puts(" -w/--write-out [format] What to output after completion\n" " -x/--proxy Use proxy. (Default port is 1080)\n" " --random-file File to use for reading random data from (SSL)\n" " -X/--request Specific request command to use"); puts(" -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30\n" " -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs\n" " -z/--time-cond