Skip to content
Snippets Groups Projects
main.c 93.6 KiB
Newer Older
  • Learn to ignore specific revisions
  •         curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
            curl_easy_setopt(curl, CURLOPT_DEBUGDATA, config);
    
            config->conf |= CONF_VERBOSE; /* force verbose */
    
          curl_easy_setopt(curl, CURLOPT_VERBOSE, config->conf&CONF_VERBOSE);
    
          /* new in curl 7.10 */
          curl_easy_setopt(curl, CURLOPT_ENCODING, 
    
                           (config->encoding) ? "" : NULL);
    
          res = curl_easy_perform(curl);
    
          if((config->progressmode == CURL_PROGRESS_BAR) &&
             progressbar.calls) {
    
            /* if the custom progress bar has been displayed, we output a
               newline here */
            fputs("\n", progressbar.out);
          }
    
    
          if(config->writeout) {
            ourWriteOut(curl, config->writeout);
    
    #ifdef USE_ENVIRONMENT
          if (config->writeenv)
            ourWriteEnv(curl);
    #endif
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #ifdef	VMS
    
          if (!config->showerror)  {
            vms_show = VMSSTS_HIDE;
          }
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #else
    
          if((res!=CURLE_OK) && config->showerror) {
            if(CURLE_SSL_CACERT == res) {
              fprintf(config->errors, "curl: (%d) %s\n\n", res, errorbuffer);
    
    #define CURL_CA_CERT_ERRORMSG1 \
    
    "More details here: http://curl.haxx.se/docs/sslcerts.html\n\n" \
    
    "curl performs SSL certificate verification by default, using a \"bundle\"\n" \
    " of Certificate Authority (CA) public keys (CA certs). The default\n" \
    " bundle is named curl-ca-bundle.crt; you can specify an alternate file\n" \
    " using the --cacert option.\n"
    
    #define CURL_CA_CERT_ERRORMSG2 \
    "If this HTTPS server uses a certificate signed by a CA represented in\n" \
    " the bundle, the certificate verification probably failed due to a\n" \
    " problem with the certificate (it might be expired, or the name might\n" \
    " not match the domain name in the URL).\n" \
    "If you'd like to turn off curl's verification of the certificate, use\n" \
    " the -k (or --insecure) option.\n"
    
              fprintf(config->errors, "%s%s",
                      CURL_CA_CERT_ERRORMSG1,
                      CURL_CA_CERT_ERRORMSG2 );
    
            }
            else
              fprintf(config->errors, "curl: (%d) %s\n", res, errorbuffer);
          }
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #endif
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
          if (outfile && !curl_strequal(outfile, "-") && outs.stream)
    
            fclose(outs.stream);
    
    
    #ifdef HAVE_UTIME
          /* Important that we set the time _after_ the file has been 
             closed, as is done above here */
          if(config->remote_time && outs.filename) {
            /* as libcurl if we got a time. Pretty please */
            long filetime;
            curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
            if(filetime >= 0) {
              struct utimbuf times;
              times.actime = filetime;
              times.modtime = filetime;
              utime(outs.filename, &times); /* set the time we got */
            }
          }
    #endif
    
    
          if (config->infile)
            fclose(infd);
          if(headerfilep)
            fclose(headerfilep);
          
    
          if(url)
            free(url);
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
          if(outfile)
            free(outfile);
    
        if(outfiles)
          free(outfiles);
    
        if(urls)
          /* cleanup memory used for URL globbing patterns */
          glob_cleanup(urls);
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
        /* empty this urlnode struct */
        if(urlnode->url)
          free(urlnode->url);
        if(urlnode->outfile)
          free(urlnode->outfile);
    
        /* move on to the next URL */
        nextnode=urlnode->next;
        free(urlnode); /* free the node */
        urlnode = nextnode;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
      } /* while-loop through all URLs */
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
      if(config->headerfile && !headerfilep && heads.stream)
        fclose(heads.stream);
    
    
      if(config->trace_fopened)
    
      if(allocuseragent)
    
        free(config->useragent);
    
      /* cleanup the curl handle! */
      curl_easy_cleanup(curl);
    
    
      struct Configurable config;
    
      memset(&config, 0, sizeof(struct Configurable));
      
    
      res = operate(&config, argc, argv);
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #ifdef	VMS
    
      if (res > 52) res = 53;		/* MAXMSG, porting helper */
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      return (vms_cond[res]|vms_show);
    #else
    
      return res;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #endif
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    }
    
    
    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;
    }
    
    
    
    /* Create the needed directory hierarchy recursively in order to save
       multi-GETs in file output, ie:
       curl "http://my.site/dir[1-5]/file[1-5].txt" -o "dir#1/file#2.txt"
       should create all the dir* automagically
    */
    static int create_dir_hierarchy(char *outfile)
    {
      char *tempdir;
      char *tempdir2;
      char *outdup;
      char *dirbuildup;
      int result=0;
      
      outdup = strdup(outfile);
      dirbuildup = malloc(sizeof(char) * strlen(outfile));
    
      if(!dirbuildup)
        return -1;
      dirbuildup[0] = '\0';
    
    
      tempdir = strtok(outdup, DIR_CHAR);
    
      while (tempdir != NULL) {
        tempdir2 = strtok(NULL, DIR_CHAR);
        /* since strtok returns a token for the last word even
           if not ending with DIR_CHAR, we need to prune it */
        if (tempdir2 != NULL) {
          if (strlen(dirbuildup) > 0)
            sprintf(dirbuildup,"%s%s%s",dirbuildup, DIR_CHAR, tempdir);
          else {
    
            if (0 != strncmp(outdup, DIR_CHAR, 1))
    
              sprintf(dirbuildup,"%s",tempdir);
            else
              sprintf(dirbuildup,"%s%s", DIR_CHAR, tempdir);
          }
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
          if (access(dirbuildup, F_OK) == -1) {
    
            result = mkdir(dirbuildup,(mode_t)0000750);
            if (-1 == result) {
              switch (errno) {
    #ifdef EACCES
              case EACCES:
                fprintf(stderr,"You don't have permission to create %s.\n",
                        dirbuildup);
                break;
    #endif
    #ifdef ENAMETOOLONG
              case ENAMETOOLONG:
                fprintf(stderr,"The directory name %s is too long.\n",
                        dirbuildup);
                break;
    #endif
    #ifdef EROFS
              case EROFS:
                fprintf(stderr,"%s resides on a read-only file system.\n",
                        dirbuildup);
                break;
    #endif
    #ifdef ENOSPC
              case ENOSPC:
                fprintf(stderr,"No space left on the file system that will "
                        "contain the directory %s.\n", dirbuildup);
                break;
    #endif
    #ifdef EDQUOT
              case EDQUOT:
                fprintf(stderr,"Cannot create directory %s because you "
                        "exceeded your quota.\n", dirbuildup);
                break;
    #endif
              default :
                fprintf(stderr,"Error creating directory %s.\n", dirbuildup);
                break;
              }
              break; /* get out of loop */
            }
          }
        }
        tempdir = tempdir2;
      }
      free(dirbuildup);
      free(outdup);
    
      return result; /* 0 is fine, -1 is badness */
    }