📄 main.c
字号:
break; case 'n': /* --basic for completeness */ config->authtype = CURLAUTH_BASIC; break; case 'o': /* --anyauth, let libcurl pick it */ config->authtype = CURLAUTH_ANY; break;#ifdef __DJGPP__ case 'p': /* --wdebug */ dbug_init(); break;#endif case 'q': /* --ftp-create-dirs */ config->ftp_create_dirs ^= TRUE; break; case 'r': /* --create-dirs */ config->create_dirs = TRUE; break; case 's': /* --max-redirs */ /* specified max no of redirects (http(s)) */ if(str2num(&config->maxredirs, nextarg)) return PARAM_BAD_NUMERIC; break; case 't': /* --proxy-ntlm */ config->proxyntlm ^= TRUE; break; case 'u': /* --crlf */ /* LF -> CRLF conversinon? */ config->crlf = TRUE; break; case 'v': /* --stderr */ if(strcmp(nextarg, "-")) { config->errors = fopen(nextarg, "wt"); config->errors_fopened = TRUE; } else config->errors = stdout; break; case 'w': /* --interface */ /* interface */ GetStr(&config->iface, nextarg); break; case 'x': /* --krb4 */ /* krb4 level string */ GetStr(&config->krb4level, nextarg); break; case 'y': /* --max-filesize */ if(str2num(&config->max_filesize, nextarg)) return PARAM_BAD_NUMERIC; break; case 'z': /* --disable-eprt */ config->disable_eprt ^= TRUE; break; default: /* the URL! */ { struct getout *url; if(config->url_get || (config->url_get=config->url_list)) { /* there's a node here, if it already is filled-in continue to find an "empty" node */ while(config->url_get && (config->url_get->flags&GETOUT_URL)) config->url_get = config->url_get->next; } /* now there might or might not be an available node to fill in! */ if(config->url_get) /* existing node */ url = config->url_get; else /* there was no free node, create one! */ url=new_getout(config); if(url) { /* fill in the URL */ GetStr(&url->url, nextarg); url->flags |= GETOUT_URL; } } } break; case '#': /* added 19990617 larsa */ config->progressmode ^= CURL_PROGRESS_BAR; break; case '0': /* HTTP version 1.0 */ config->httpversion = CURL_HTTP_VERSION_1_0; break; case '1': /* TLS version 1 */ config->ssl_version = CURL_SSLVERSION_TLSv1; break; case '2': /* SSL version 2 */ config->ssl_version = CURL_SSLVERSION_SSLv2; break; case '3': /* SSL version 3 */ config->ssl_version = CURL_SSLVERSION_SSLv3; break; case '4': /* IPv4 */ config->ip_version = 4; break; case '6': /* IPv6 */ config->ip_version = 6; break; case 'a': /* This makes the FTP sessions use APPE instead of STOR */ config->conf ^= CONF_FTPAPPEND; break; case 'A': /* This specifies the User-Agent name */ GetStr(&config->useragent, nextarg); break; case 'b': /* cookie string coming up: */ if(nextarg[0] == '@') { nextarg++; } else if(strchr(nextarg, '=')) { /* A cookie string must have a =-letter */ GetStr(&config->cookie, nextarg); break; } /* We have a cookie file to read from! */ GetStr(&config->cookiefile, nextarg); break; case 'B': /* use ASCII/text when transfering */ config->conf ^= CONF_GETTEXT; break; case 'c': /* get the file name to dump all cookies in */ GetStr(&config->cookiejar, nextarg); break; case 'C': /* This makes us continue an ftp transfer at given position */ if(!curl_strequal(nextarg, "-")) { if(str2num(&config->resume_from, nextarg)) return PARAM_BAD_NUMERIC; config->resume_from_current = FALSE; } else { config->resume_from_current = TRUE; config->resume_from = 0; } config->use_resume=TRUE; break; case 'd': /* postfield data */ { char *postdata=NULL; if('@' == *nextarg) { /* the data begins with a '@' letter, it means that a file name or - (stdin) follows */ FILE *file; nextarg++; /* pass the @ */ if(curl_strequal("-", nextarg)) file = stdin; else file = fopen(nextarg, "rb"); if(subletter == 'b') /* forced binary */ postdata = file2memory(file, &config->postfieldsize); else postdata = file2string(file); if(file && (file != stdin)) fclose(file); } else { GetStr(&postdata, nextarg); } if(config->postfields) { /* we already have a string, we append this one with a separating &-letter */ char *oldpost=config->postfields; config->postfields=aprintf("%s&%s", oldpost, postdata); free(oldpost); free(postdata); } else config->postfields=postdata; } /* We can't set the request type here, as this data might be used in a simple GET if -G is used. Already or soon. if(SetHTTPrequest(HTTPREQ_SIMPLEPOST, &config->httpreq)) return PARAM_BAD_USE; */ break; case 'D': /* dump-header to given file name */ GetStr(&config->headerfile, nextarg); break; case 'e': { char *ptr = strstr(nextarg, ";auto"); if(ptr) { /* Automatic referer requested, this may be combined with a set initial one */ config->conf |= CONF_AUTO_REFERER; *ptr = 0; /* zero terminate here */ } GetStr(&config->referer, nextarg); } break; case 'E': switch(subletter) { case 'a': /* CA info PEM file */ /* CA info PEM file */ GetStr(&config->cacert, nextarg); break; case 'b': /* cert file type */ GetStr(&config->cert_type, nextarg); break; case 'c': /* private key file */ GetStr(&config->key, nextarg); break; case 'd': /* private key file type */ GetStr(&config->key_type, nextarg); break; case 'e': /* private key passphrase */ GetStr(&config->key_passwd, nextarg); cleanarg(nextarg); break; case 'f': /* crypto engine */ GetStr(&config->engine, nextarg); break; case 'g': /* CA info PEM file */ /* CA cert directory */ GetStr(&config->capath, nextarg); break; default: /* certificate file */ { char *ptr = strchr(nextarg, ':'); /* Since we live in a world of weirdness and confusion, the win32 dudes can use : when using drive letters and thus c:\file:password needs to work. In order not to break compatibility, we still use : as separator, but we try to detect when it is used for a file name! On windows. */#ifdef WIN32 if(ptr && (ptr == &nextarg[1]) && (nextarg[2] == '\\') && (isalpha((int)nextarg[0])) ) /* colon in the second column, followed by a backslash, and the first character is an alphabetic letter: this is a drive letter colon */ ptr = strchr(&nextarg[3], ':'); /* find the next one instead */#endif if(ptr) { /* we have a password too */ *ptr=0; ptr++; GetStr(&config->key_passwd, ptr); } GetStr(&config->cert, nextarg); cleanarg(nextarg); } } break; case 'f': /* fail hard on errors */ config->conf ^= CONF_FAILONERROR; break; case 'F': /* "form data" simulation, this is a little advanced so lets do our best to sort this out slowly and carefully */ if(formparse(nextarg, &config->httppost, &config->last_post)) return PARAM_BAD_USE; if(SetHTTPrequest(HTTPREQ_POST, &config->httpreq)) return PARAM_BAD_USE; break; case 'g': /* g disables URLglobbing */ config->globoff ^= TRUE; break; case 'G': /* HTTP GET */ config->use_httpget = TRUE; break; case 'h': /* h for help */ help(); return PARAM_HELP_REQUESTED; case 'H': /* A custom header to append to a list */ config->headers = curl_slist_append(config->headers, nextarg); break; case 'i': config->conf ^= CONF_HEADER; /* include the HTTP header as well */ break; case 'j': config->cookiesession ^= TRUE; break; case 'I': /* * This is a bit tricky. We either SET both bits, or we clear both * bits. Let's not make any other outcomes from this. */ if((CONF_HEADER|CONF_NOBODY) != (config->conf&(CONF_HEADER|CONF_NOBODY)) ) { /* one of them weren't set, set both */ config->conf |= (CONF_HEADER|CONF_NOBODY); if(SetHTTPrequest(HTTPREQ_HEAD, &config->httpreq)) return PARAM_BAD_USE; } else { /* both were set, clear both */ config->conf &= ~(CONF_HEADER|CONF_NOBODY); if(SetHTTPrequest(HTTPREQ_GET, &config->httpreq)) return PARAM_BAD_USE; } break; case 'k': /* allow insecure SSL connects */ config->insecure_ok ^= TRUE; break; case 'K': /* parse config file */ res = parseconfig(nextarg, config); config->configread = TRUE; if(res) return res; break; case 'l': config->conf ^= CONF_FTPLISTONLY; /* only list the names of the FTP dir */ break; case 'L': config->conf ^= CONF_FOLLOWLOCATION; /* Follow Location: HTTP headers */ switch (subletter) { case 't': /* Continue to send authentication (user+password) when following * locations, even when hostname changed */ config->conf ^= CONF_UNRESTRICTED_AUTH; break; } break; case 'm': /* specified max time */ if(str2num(&config->timeout, nextarg)) return PARAM_BAD_NUMERIC; break; case 'M': /* M for manual, huge help */ hugehelp(); return PARAM_HELP_REQUESTED; case 'n': switch(subletter) { case 'o': /* CA info PEM file */ /* use .netrc or URL */ config->conf ^= CONF_NETRC_OPT; break; default: /* pick info from .netrc, if this is used for http, curl will automatically enfore user+password with the request */ config->conf ^= CONF_NETRC; break; } break; case 'N': /* disable the output I/O buffering */ config->nobuffer ^= 1; break; case 'o': case 'O': /* output file */ { struct getout *url; if(config->url_out || (config->url_out=config->url_list)) { /* there's a node here, if it already is filled-in continue to find an "empty" node */ while(config->url_out && (config->url_out->flags&GETOUT_OUTFILE)) config->url_out = config->url_out->next; } /* now there might or might not be an available node to fill in! */ if(config->url_out) /* existing node */ url = config->url_out; else /* there was no free node, create one! */ url=new_getout(config); if(url) { /* fill in the outfile */ if('o' == letter) GetStr(&url->outfile, nextarg); else { url->outfile=NULL; /* leave it */ url->flags |= GETOUT_USEREMOTE; } url->flags |= GETOUT_OUTFILE; } } break; case 'P': /* This makes the FTP sessions use PORT instead of PASV */ /* use <eth0> or <192.168.10.10> style addresses. Anything except this will make us try to get the "default" address. NOTE: this is a changed behaviour since the released 4.1! */ GetStr(&config->ftpport, nextarg); break; case 'p': /* proxy tunnel for non-http protocols */ config->proxytunnel ^= TRUE; break; case 'q': /* if used first, already taken care of, we do it like this so we don't cause an error! */ break; case 'Q': /* QUOTE command to send to FTP server */ switch(nextarg[0]) { case '-': /* prefixed with a dash makes it a POST TRANSFER one */ nextarg++; config->postquote = curl_slist_append(config->postquote, nextarg); break; case '+': /* prefixed with a plus makes it a just-before-transfer one */ nextarg++; config->prequote = curl_slist_append(config->prequote, nextarg); break; default: config->quote = curl_slist_append(config->quote, nextarg); } break; case 'r': /* byte range requested */ GetStr(&config->range, nextarg); break; case 'R': /* use remote file's time */ config->remote_time ^= TRUE; break; case 's': /* don't show progress meter, don't show errors : */ config->conf |= (CONF_MUTE|CONF_NOPROGRESS); config->showerror ^= TRUE; /* toggle off */ break; case 'S':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -