Skip to content
Snippets Groups Projects
main.c 36 KiB
Newer Older
  • Learn to ignore specific revisions
  • Daniel Stenberg's avatar
    Daniel Stenberg committed
    	nextarg= (i < argc - 1)? argv[i+1]: NULL;
    
    	res = getparameter ( flag,
    			     nextarg,
    			     &passarg,
    			   &config );
    	if(res)
    	  return res;
    
    	if(passarg) /* we're supposed to skip this */
    	  i++;
          }
        }
        else {
          if(url) {
    	helpf("only one URL is supported!\n");
    	return URG_FAILED_INIT;
          }
          url = argv[i];
        }
      }
    
      /* if no URL was specified and there was one in the config file, get that
         one */
      if(!url && config.url)
        url = config.url;
      
      if(!url) {
        helpf("no URL specified!\n");
        return URG_FAILED_INIT;
      }
    #if 0
    
      fprintf(stderr, "URL: %s PROXY: %s\n", url, config.proxy?config.proxy:"none");
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #endif
    
    
      /* expand '{...}' and '[...]' expressions and return total number of URLs
         in pattern set */
      res = glob_url(&urls, url, &urlnum);
      if(res != URG_OK)
        return res;
    
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      outfiles = config.outfile;		/* save outfile pattern befor expansion */
      if (!outfiles && !config.remotefile && urlnum > 1) {
    #ifdef CURL_SEPARATORS
        /* multiple files extracted to stdout, insert separators! */
        separator = 1;
    #endif
    #ifdef MIME_SEPARATORS
        /* multiple files extracted to stdout, insert MIME separators! */
        separator = 1;
        printf("MIME-Version: 1.0\n");
        printf("Content-Type: multipart/mixed; boundary=%s\n\n", MIMEseparator);
    #endif
      }
      for (i = 0; (url = next_url(urls)); ++i) {
        if (outfiles)
          config.outfile = strdup(outfiles);
    
      if(config.outfile && config.infile) {
        helpf("you can't both upload and download!\n");
        return URG_FAILED_INIT;
      }
     
      if (config.outfile || config.remotefile) {
        /* 
         * We have specified a file name to store the result in, or we have
         * decided we want to use the remote file name.
         */
    
        if(config.remotefile) {
          /* Find and get the remote file name */
          config.outfile=strstr(url, "://");
          if(config.outfile)
            config.outfile+=3;
          else
            config.outfile=url;
          config.outfile = strrchr(config.outfile, '/');
          if(!config.outfile || !strlen(++config.outfile)) {
            helpf("Remote file name has no length!\n");
            return URG_WRITE_ERROR;
          }
        }
        else	/* fill '#1' ... '#9' terms from URL pattern */
          config.outfile = match_url(config.outfile, *urls);
    
        if((0 == config.resume_from) && config.use_resume) {
          /* we're told to continue where we are now, then we get the size of the
    	 file as it is now and open it for append instead */
          struct stat fileinfo;
    
          if(0 == stat(config.outfile, &fileinfo)) {
    	/* set offset to current file size: */
    	config.resume_from = fileinfo.st_size;
          }
          /* else let offset remain 0 */
        }
    
        if(config.resume_from) {
          /* open file for output: */
          outs.stream=(FILE *) fopen(config.outfile, config.resume_from?"ab":"wb");
          if (!outs.stream) {
            helpf("Can't open '%s'!\n", config.outfile);
            return URG_WRITE_ERROR;
          }
        }
        else {
          outs.filename = config.outfile;
          outs.stream = NULL; /* open when needed */
        }
      }
      if (config.infile) {
        /*
         * We have specified a file to upload
         */
        struct stat fileinfo;
    
        /* If no file name part is given in the URL, we add this file name */
        char *ptr=strstr(url, "://");
        if(ptr)
          ptr+=3;
        else
          ptr=url;
        ptr = strrchr(ptr, '/');
        if(!ptr || !strlen(++ptr)) {
          /* The URL has no file name part, add the local file name. In order
             to be able to do so, we have to create a new URL in another buffer.*/
          urlbuffer=(char *)malloc(strlen(url) + strlen(config.infile) + 3);
          if(!urlbuffer) {
            helpf("out of memory\n");
            return URG_OUT_OF_MEMORY;
          }
          if(ptr)
            /* there is a trailing slash on the URL */
            sprintf(urlbuffer, "%s%s", url, config.infile);
          else
            /* thers is no trailing slash on the URL */
            sprintf(urlbuffer, "%s/%s", url, config.infile);
    
          url = urlbuffer; /* use our new URL instead! */
        }
    
        infd=(FILE *) fopen(config.infile, "rb");
        if (!infd || stat(config.infile, &fileinfo)) {
          helpf("Can't open '%s'!\n", config.infile);
          return URG_READ_ERROR;
        }
        infilesize=fileinfo.st_size;
    
      }
      if((config.conf&CONF_UPLOAD) &&
         config.use_resume &&
         (0==config.resume_from)) {
        config.resume_from = -1; /* -1 will then force get-it-yourself */
      }
      if(config.headerfile) {
        /* open file for output: */
        if(strcmp(config.headerfile,"-"))
        {
    
          heads.filename = config.headerfile;
          headerfilep=NULL;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
        }
        else
          headerfilep=stdout;
    
      if(outs.stream && isatty(fileno(outs.stream)) &&
         !(config.conf&(CONF_UPLOAD|CONF_HTTPPOST)))
        /* we send the output to a tty and it isn't an upload operation, therefore
           we switch off the progress meter */
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
        config.conf |= CONF_NOPROGRESS;
    
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      if (urlnum > 1) {
        fprintf(stderr, "\n[%d/%d]: %s --> %s\n", i+1, urlnum, url, config.outfile ? config.outfile : "<stdout>");
        if (separator) {
    #ifdef CURL_SEPARATORS
          printf("%s%s\n", CURLseparator, url);
    #endif
    #ifdef MIME_SEPARATORS
          printf("--%s\n", MIMEseparator);
          printf("Content-ID: %s\n\n", url); 
    #endif
        }
      }
    
      if(!config.errors)
        config.errors = stderr;
    
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      res = curl_urlget(URGTAG_FILE, (FILE *)&outs,  /* where to store */
                        URGTAG_WRITEFUNCTION, my_fwrite, /* what call to write */
                        URGTAG_INFILE, infd, /* for uploads */
                        URGTAG_INFILESIZE, infilesize, /* size of uploaded file */
                        URGTAG_URL, url,     /* what to fetch */
                        URGTAG_PROXY, config.proxy, /* proxy to use */
                        URGTAG_FLAGS, config.conf, /* flags */
                        URGTAG_USERPWD, config.userpwd, /* user + passwd */
                        URGTAG_PROXYUSERPWD, config.proxyuserpwd, /* Proxy user + passwd */
                        URGTAG_RANGE, config.range, /* range of document */
                        URGTAG_ERRORBUFFER, errorbuffer,
                        URGTAG_TIMEOUT, config.timeout,
                        URGTAG_POSTFIELDS, config.postfields,
                        URGTAG_REFERER, config.referer,
                        URGTAG_USERAGENT, config.useragent,
                        URGTAG_FTPPORT, config.ftpport,
                        URGTAG_LOW_SPEED_LIMIT, config.low_speed_limit,
                        URGTAG_LOW_SPEED_TIME, config.low_speed_time,
                        URGTAG_RESUME_FROM, config.use_resume?config.resume_from:0,
                        URGTAG_COOKIE, config.cookie,
                        URGTAG_HTTPHEADER, config.headers,
                        URGTAG_HTTPPOST, config.httppost,
                        URGTAG_SSLCERT, config.cert,
                        URGTAG_SSLCERTPASSWD, config.cert_passwd,
                        URGTAG_CRLF, config.crlf,
                        URGTAG_QUOTE, config.quote,
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
                        URGTAG_POSTQUOTE, config.postquote,
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
                        URGTAG_WRITEHEADER, config.headerfile?&heads:NULL,
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
                        URGTAG_COOKIEFILE, config.cookiefile,
                        URGTAG_SSLVERSION, config.ssl_version,
                        URGTAG_TIMECONDITION, config.timecond,
                        URGTAG_TIMEVALUE, config.condtime,
                        URGTAG_CUSTOMREQUEST, config.customrequest,
                        URGTAG_STDERR, config.errors,
    
                        URGTAG_PROGRESSMODE, config.progressmode,
    
                        URGTAG_WRITEINFO, config.writeout,
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
                        URGTAG_DONE); /* always terminate the list of tags */
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      if((res!=URG_OK) && config.showerror)
        fprintf(config.errors, "curl: (%d) %s\n", res, errorbuffer);
    
      if((config.errors != stderr) &&
         (config.errors != stdout))
        /* it wasn't directed to stdout or stderr so close the file! */
        fclose(config.errors);
    
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      if(config.headerfile && !headerfilep && heads.stream)
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      if(urlbuffer)
        free(urlbuffer);
      if (config.outfile && outs.stream)
        fclose(outs.stream);
      if (config.infile)
        fclose(infd);
      if(headerfilep)
        fclose(headerfilep);
    
      if(config.url)
        free(config.url);
    
      if(url)
        free(url);
      if(config.outfile && !config.remotefile)
        free(config.outfile);
      }
    #ifdef MIME_SEPARATORS
      if (separator)
        printf("--%s--\n", MIMEseparator);
    #endif
    
      curl_slist_free_all(config.quote); /* the checks for config.quote == NULL */
    
      return(res);
    }
    
    
    static char *my_get_line(FILE *fp)
    {
       char buf[4096];
       char *nl = NULL;
       char *retval = NULL;
    
       do
       {
          if (NULL == fgets(buf, sizeof(buf), fp))
             break;
          if (NULL == retval)
             retval = strdup(buf);
          else
          {
             if (NULL == (retval = realloc(retval,
                                           strlen(retval) + strlen(buf) + 1)))
                break;
             strcat(retval, buf);
          }
       }
       while (NULL == (nl = strchr(retval, '\n')));
    
       if (NULL != nl)
         *nl = '\0';
    
       return retval;
    }
    
    static char *my_get_token(const char *line)
    {
      static const char *save = NULL;
      const char *first = NULL;
      const char *last = NULL;
      char *retval = NULL;
      size_t size;
    
      if (NULL == line)
        line = save;
      if (NULL == line)
        return NULL;
    
      while (('\0' != *line) && (isspace(*line)))
        line++;
      first = line;
      while (('\0' != *line) && (!isspace(*line)))
        line++;
      save = line;
      while ('\0' != *line)
        line++;
      last = line;
    
      size = last - first;
      if (0 == size)
        return NULL;
      if (NULL == (retval = malloc(size + 1)))
        return NULL;
      memcpy(retval, first, size);
      retval[size] = '\0';
      return retval;
    }