Annotation of embedaddon/curl/src/tool_operhlp.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9:  *
                     10:  * This software is licensed as described in the file COPYING, which
                     11:  * you should have received as part of this distribution. The terms
                     12:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     13:  *
                     14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15:  * copies of the Software, and permit persons to whom the Software is
                     16:  * furnished to do so, under the terms of the COPYING file.
                     17:  *
                     18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19:  * KIND, either express or implied.
                     20:  *
                     21:  ***************************************************************************/
                     22: #include "tool_setup.h"
                     23: 
                     24: #include "strcase.h"
                     25: 
                     26: #define ENABLE_CURLX_PRINTF
                     27: /* use our own printf() functions */
                     28: #include "curlx.h"
                     29: 
                     30: #include "tool_cfgable.h"
                     31: #include "tool_convert.h"
                     32: #include "tool_doswin.h"
                     33: #include "tool_operhlp.h"
                     34: #include "tool_metalink.h"
                     35: 
                     36: #include "memdebug.h" /* keep this as LAST include */
                     37: 
                     38: void clean_getout(struct OperationConfig *config)
                     39: {
                     40:   if(config) {
                     41:     struct getout *next;
                     42:     struct getout *node = config->url_list;
                     43: 
                     44:     while(node) {
                     45:       next = node->next;
                     46:       Curl_safefree(node->url);
                     47:       Curl_safefree(node->outfile);
                     48:       Curl_safefree(node->infile);
                     49:       Curl_safefree(node);
                     50:       node = next;
                     51:     }
                     52:     config->url_list = NULL;
                     53:   }
                     54: }
                     55: 
                     56: bool output_expected(const char *url, const char *uploadfile)
                     57: {
                     58:   if(!uploadfile)
                     59:     return TRUE;  /* download */
                     60:   if(checkprefix("http://", url) || checkprefix("https://", url))
                     61:     return TRUE;   /* HTTP(S) upload */
                     62: 
                     63:   return FALSE; /* non-HTTP upload, probably no output should be expected */
                     64: }
                     65: 
                     66: bool stdin_upload(const char *uploadfile)
                     67: {
                     68:   return (!strcmp(uploadfile, "-") ||
                     69:           !strcmp(uploadfile, ".")) ? TRUE : FALSE;
                     70: }
                     71: 
                     72: /*
                     73:  * Adds the file name to the URL if it doesn't already have one.
                     74:  * url will be freed before return if the returned pointer is different
                     75:  */
                     76: char *add_file_name_to_url(char *url, const char *filename)
                     77: {
                     78:   /* If no file name part is given in the URL, we add this file name */
                     79:   char *ptr = strstr(url, "://");
                     80:   CURL *curl = curl_easy_init(); /* for url escaping */
                     81:   if(!curl)
                     82:     return NULL; /* error! */
                     83:   if(ptr)
                     84:     ptr += 3;
                     85:   else
                     86:     ptr = url;
                     87:   ptr = strrchr(ptr, '/');
                     88:   if(!ptr || !*++ptr) {
                     89:     /* The URL has no file name part, add the local file name. In order
                     90:        to be able to do so, we have to create a new URL in another
                     91:        buffer.*/
                     92: 
                     93:     /* We only want the part of the local path that is on the right
                     94:        side of the rightmost slash and backslash. */
                     95:     const char *filep = strrchr(filename, '/');
                     96:     char *file2 = strrchr(filep?filep:filename, '\\');
                     97:     char *encfile;
                     98: 
                     99:     if(file2)
                    100:       filep = file2 + 1;
                    101:     else if(filep)
                    102:       filep++;
                    103:     else
                    104:       filep = filename;
                    105: 
                    106:     /* URL encode the file name */
                    107:     encfile = curl_easy_escape(curl, filep, 0 /* use strlen */);
                    108:     if(encfile) {
                    109:       char *urlbuffer;
                    110:       if(ptr)
                    111:         /* there is a trailing slash on the URL */
                    112:         urlbuffer = aprintf("%s%s", url, encfile);
                    113:       else
                    114:         /* there is no trailing slash on the URL */
                    115:         urlbuffer = aprintf("%s/%s", url, encfile);
                    116: 
                    117:       curl_free(encfile);
                    118: 
                    119:       if(!urlbuffer) {
                    120:         url = NULL;
                    121:         goto end;
                    122:       }
                    123: 
                    124:       Curl_safefree(url);
                    125:       url = urlbuffer; /* use our new URL instead! */
                    126:     }
                    127:   }
                    128:   end:
                    129:   curl_easy_cleanup(curl);
                    130:   return url;
                    131: }
                    132: 
                    133: /* Extracts the name portion of the URL.
                    134:  * Returns a pointer to a heap-allocated string or NULL if
                    135:  * no name part, at location indicated by first argument.
                    136:  */
                    137: CURLcode get_url_file_name(char **filename, const char *url)
                    138: {
                    139:   const char *pc, *pc2;
                    140: 
                    141:   *filename = NULL;
                    142: 
                    143:   /* Find and get the remote file name */
                    144:   pc = strstr(url, "://");
                    145:   if(pc)
                    146:     pc += 3;
                    147:   else
                    148:     pc = url;
                    149: 
                    150:   pc2 = strrchr(pc, '\\');
                    151:   pc = strrchr(pc, '/');
                    152:   if(pc2 && (!pc || pc < pc2))
                    153:     pc = pc2;
                    154: 
                    155:   if(pc)
                    156:     /* duplicate the string beyond the slash */
                    157:     pc++;
                    158:   else
                    159:     /* no slash => empty string */
                    160:     pc = "";
                    161: 
                    162:   *filename = strdup(pc);
                    163:   if(!*filename)
                    164:     return CURLE_OUT_OF_MEMORY;
                    165: 
                    166: #if defined(MSDOS) || defined(WIN32)
                    167:   {
                    168:     char *sanitized;
                    169:     SANITIZEcode sc = sanitize_file_name(&sanitized, *filename, 0);
                    170:     Curl_safefree(*filename);
                    171:     if(sc)
                    172:       return CURLE_URL_MALFORMAT;
                    173:     *filename = sanitized;
                    174:   }
                    175: #endif /* MSDOS || WIN32 */
                    176: 
                    177:   /* in case we built debug enabled, we allow an environment variable
                    178:    * named CURL_TESTDIR to prefix the given file name to put it into a
                    179:    * specific directory
                    180:    */
                    181: #ifdef DEBUGBUILD
                    182:   {
                    183:     char *tdir = curlx_getenv("CURL_TESTDIR");
                    184:     if(tdir) {
                    185:       char buffer[512]; /* suitably large */
                    186:       msnprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename);
                    187:       Curl_safefree(*filename);
                    188:       *filename = strdup(buffer); /* clone the buffer */
                    189:       curl_free(tdir);
                    190:       if(!*filename)
                    191:         return CURLE_OUT_OF_MEMORY;
                    192:     }
                    193:   }
                    194: #endif
                    195: 
                    196:   return CURLE_OK;
                    197: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>