1 /* Generated by CIL v. 1.3.6 */
   2 /* print_CIL_Input is true */
   3 
   4 typedef unsigned int size_t;
   5 typedef long long __quad_t;
   6 typedef long __off_t;
   7 typedef __quad_t __off64_t;
   8 typedef long __time_t;
   9 typedef __time_t time_t;
  10 struct __anonstruct___sigset_t_7 {
  11    unsigned long __val[1024U / (8U * sizeof(unsigned long ))] ;
  12 };
  13 typedef struct __anonstruct___sigset_t_7 __sigset_t;
  14 typedef __sigset_t sigset_t;
  15 typedef unsigned long pthread_t;
  16 union __anonunion_pthread_attr_t_9 {
  17    char __size[36] ;
  18    long __align ;
  19 };
  20 typedef union __anonunion_pthread_attr_t_9 pthread_attr_t;
  21 struct _IO_FILE;
  22 typedef struct _IO_FILE FILE;
  23 typedef void _IO_lock_t;
  24 struct _IO_marker {
  25    struct _IO_marker *_next ;
  26    struct _IO_FILE *_sbuf ;
  27    int _pos ;
  28 };
  29 struct _IO_FILE {
  30    int _flags ;
  31    char *_IO_read_ptr ;
  32    char *_IO_read_end ;
  33    char *_IO_read_base ;
  34    char *_IO_write_base ;
  35    char *_IO_write_ptr ;
  36    char *_IO_write_end ;
  37    char *_IO_buf_base ;
  38    char *_IO_buf_end ;
  39    char *_IO_save_base ;
  40    char *_IO_backup_base ;
  41    char *_IO_save_end ;
  42    struct _IO_marker *_markers ;
  43    struct _IO_FILE *_chain ;
  44    int _fileno ;
  45    int _flags2 ;
  46    __off_t _old_offset ;
  47    unsigned short _cur_column ;
  48    signed char _vtable_offset ;
  49    char _shortbuf[1] ;
  50    _IO_lock_t *_lock ;
  51    __off64_t _offset ;
  52    void *__pad1 ;
  53    void *__pad2 ;
  54    void *__pad3 ;
  55    void *__pad4 ;
  56    size_t __pad5 ;
  57    int _mode ;
  58    char _unused2[(15U * sizeof(int ) - 4U * sizeof(void *)) - sizeof(size_t )] ;
  59 };
  60 typedef unsigned short uint16_t;
  61 typedef unsigned int uint32_t;
  62 typedef unsigned short sa_family_t;
  63 struct sockaddr {
  64    sa_family_t sa_family ;
  65    char sa_data[14] ;
  66 };
  67 typedef uint16_t in_port_t;
  68 typedef uint32_t in_addr_t;
  69 struct in_addr {
  70    in_addr_t s_addr ;
  71 };
  72 struct sockaddr_in {
  73    sa_family_t sin_family ;
  74    in_port_t sin_port ;
  75    struct in_addr sin_addr ;
  76    unsigned char sin_zero[((sizeof(struct sockaddr ) - sizeof(unsigned short )) - sizeof(in_port_t )) - sizeof(struct in_addr )] ;
  77 };
  78 struct request {
  79    char host[1024] ;
  80    char url[1024] ;
  81    char file[512] ;
  82    char lfile[512] ;
  83    char ip[16] ;
  84    char username[512] ;
  85    char password[512] ;
  86    int port ;
  87    int clength ;
  88    unsigned char proto ;
  89 };
  90 struct thread_data {
  91    struct sockaddr_in sin ;
  92    char getstr[256] ;
  93    long soffset ;
  94    long foffset ;
  95    long offset ;
  96    long clength ;
  97    int fd ;
  98    pthread_t tid ;
  99    unsigned char status ;
 100 };
 101 struct hist_data {
 102    struct request req ;
 103    int nthreads ;
 104    int bwritten ;
 105    struct thread_data wthread[25] ;
 106 };
 107 typedef int __ssize_t;
 108 typedef __ssize_t ssize_t;
 109 typedef __builtin_va_list __gnuc_va_list;
 110 typedef __gnuc_va_list va_list;
 111 typedef unsigned int __socklen_t;
 112 typedef __socklen_t socklen_t;
 113 struct hostent {
 114    char *h_name ;
 115    char **h_aliases ;
 116    int h_addrtype ;
 117    int h_length ;
 118    char **h_addr_list ;
 119 };
 120 struct __pthread_internal_slist {
 121    struct __pthread_internal_slist *__next ;
 122 };
 123 typedef struct __pthread_internal_slist __pthread_slist_t;
 124 union __anonunion____missing_field_name_19 {
 125    int __spins ;
 126    __pthread_slist_t __list ;
 127 };
 128 struct __pthread_mutex_s {
 129    int __lock ;
 130    unsigned int __count ;
 131    int __owner ;
 132    int __kind ;
 133    unsigned int __nusers ;
 134    union __anonunion____missing_field_name_19 __annonCompField1 ;
 135 };
 136 union __anonunion_pthread_mutex_t_18 {
 137    struct __pthread_mutex_s __data ;
 138    char __size[24] ;
 139    long __align ;
 140 };
 141 typedef union __anonunion_pthread_mutex_t_18 pthread_mutex_t;
 142 #pragma merger(0,"/tmp/cil-96Ono5Br.i","-g,-Wall,-W,-pedantic")
 143 extern  __attribute__((__nothrow__)) int *__errno_location(void)  __attribute__((__const__)) ;
 144 extern char *optarg ;
 145 extern int optind ;
 146 extern  __attribute__((__nothrow__)) int getopt(int ___argc , char * const  *___argv ,
 147                                                 char const   *__shortopts ) ;
 148 extern  __attribute__((__nothrow__)) int atoi(char const   *__nptr )  __attribute__((__pure__,
 149 __nonnull__(1))) ;
 150 extern  __attribute__((__nothrow__)) void *calloc(size_t __nmemb , size_t __size )  __attribute__((__malloc__)) ;
 151 extern  __attribute__((__nothrow__, __noreturn__)) void exit(int __status ) ;
 152 extern struct _IO_FILE *stderr ;
 153 extern int fprintf(FILE * __restrict  __stream , char const   * __restrict  __format 
 154                    , ...) ;
 155 extern int printf(char const   * __restrict  __format  , ...) ;
 156 extern  __attribute__((__nothrow__)) char *strncpy(char * __restrict  __dest , char const   * __restrict  __src ,
 157                                                    size_t __n )  __attribute__((__nonnull__(1,2))) ;
 158 extern  __attribute__((__nothrow__)) char *strdup(char const   *__s )  __attribute__((__nonnull__(1),
 159 __malloc__)) ;
 160 extern  __attribute__((__nothrow__)) char *strerror(int __errnum ) ;
 161 extern  __attribute__((__nothrow__)) int sigemptyset(sigset_t *__set )  __attribute__((__nonnull__(1))) ;
 162 extern  __attribute__((__nothrow__)) int sigaddset(sigset_t *__set , int __signo )  __attribute__((__nonnull__(1))) ;
 163 extern  __attribute__((__nothrow__)) int pthread_sigmask(int __how , __sigset_t const   * __restrict  __newmask ,
 164                                                          __sigset_t * __restrict  __oldmask ) ;
 165 extern  __attribute__((__nothrow__)) int pthread_create(pthread_t * __restrict  __newthread ,
 166                                                         pthread_attr_t const   * __restrict  __attr ,
 167                                                         void *(*__start_routine)(void * ) ,
 168                                                         void * __restrict  __arg )  __attribute__((__nonnull__(1,3))) ;
 169 void parse_url(char *url , struct request *req___0 ) ;
 170 void usage(void) ;
 171 void Log(char *fmt  , ...) ;
 172 time_t t_start  ;
 173 time_t t_finish  ;
 174 int read_log(struct hist_data *h ) ;
 175 void get(struct request *req___0 ) ;
 176 void resume_get(struct hist_data *h ) ;
 177 sigset_t signal_set  ;
 178 void *signal_waiter(void *arg ) ;
 179 char *fullurl  ;
 180 int nthreads  ;
 181 int fsuggested  =    0;
 182 struct request *req  ;
 183 pthread_t hthread  ;
 184 struct thread_data *wthread  ;
 185 int main(int argc , char **argv ) 
 186 { int c ;
 187   int error ;
 188   int ret ;
 189   struct hist_data h ;
 190   int retlog ;
 191   void *tmp ;
 192   int *tmp___0 ;
 193   char *tmp___1 ;
 194 
 195   {
 196   error = 0;
 197   tmp = calloc(1U, sizeof(struct request ));
 198   req = (struct request *)tmp;
 199   sigemptyset(& signal_set);
 200   sigaddset(& signal_set, 2);
 201   sigaddset(& signal_set, 14);
 202   pthread_sigmask(0, (__sigset_t const   * __restrict  )(& signal_set), (__sigset_t * __restrict  )((void *)0));
 203   ret = pthread_create((pthread_t * __restrict  )(& hthread), (pthread_attr_t const   * __restrict  )((void *)0),
 204                        & signal_waiter, (void * __restrict  )((void *)0));
 205   if (ret != 0) {
 206     tmp___0 = __errno_location();
 207     tmp___1 = strerror(*tmp___0);
 208     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"main: cannot create signal_waiter thread: %s, exiting...\n",
 209             tmp___1);
 210     exit(-1);
 211   }
 212   while (1) {
 213     if (! error) {
 214       c = getopt(argc, (char * const  *)argv, "p:l:n:hfv");
 215       if (! (c != -1)) {
 216         break;
 217       }
 218     } else {
 219       break;
 220     }
 221     switch (c) {
 222     case 112: 
 223     req->port = atoi((char const   *)optarg);
 224     break;
 225     case 102: 
 226     fsuggested = 1;
 227     break;
 228     case 108: 
 229     strncpy((char * __restrict  )(req->lfile), (char const   * __restrict  )optarg,
 230             512U);
 231     break;
 232     case 110: 
 233     nthreads = atoi((char const   *)optarg);
 234     if (nthreads > 25) {
 235       Log((char *)"Error: Maximum # of threads allowed is %d\n", 25);
 236       nthreads = 0;
 237     }
 238     break;
 239     case 104: 
 240     printf((char const   * __restrict  )"%s\n", "EnderUNIX Aget v0.4");
 241     usage();
 242     exit(0);
 243     break;
 244     case 118: 
 245     printf((char const   * __restrict  )"%s\nby Murat BALABAN <murat@enderunix.org>\n",
 246            "EnderUNIX Aget v0.4");
 247     exit(0);
 248     break;
 249     default: 
 250     error = 1;
 251     usage();
 252     exit(1);
 253     break;
 254     }
 255   }
 256   if (error) {
 257     usage();
 258     exit(1);
 259   }
 260   if (fsuggested == 1) {
 261     if (nthreads == 0) {
 262       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\nERROR: -f and -n should be used together!, exiting...\n\n");
 263       usage();
 264       exit(1);
 265     }
 266   }
 267   if (argc == 2) {
 268     fullurl = strdup((char const   *)*(argv + 1));
 269   } else {
 270     if (optind < argc) {
 271       if (argc > 2) {
 272         fullurl = strdup((char const   *)*(argv + optind));
 273       } else {
 274         usage();
 275         exit(1);
 276       }
 277     } else {
 278       if (optind == argc) {
 279         usage();
 280         exit(1);
 281       }
 282     }
 283   }
 284   parse_url(fullurl, req);
 285   retlog = read_log(& h);
 286   if (retlog != -1) {
 287     resume_get(& h);
 288   } else {
 289     get(req);
 290   }
 291   return (0);
 292 }
 293 }
 294 #pragma merger(0,"/tmp/cil-vCwIYZEB.i","-g,-Wall,-W,-pedantic")
 295 extern  __attribute__((__nothrow__)) int ( /* format attribute */  snprintf)(char * __restrict  __s ,
 296                                                                              size_t __maxlen ,
 297                                                                              char const   * __restrict  __format 
 298                                                                              , ...) ;
 299 extern  __attribute__((__nothrow__)) void *malloc(size_t __size )  __attribute__((__malloc__)) ;
 300 extern  __attribute__((__nothrow__)) void free(void *__ptr ) ;
 301 extern  __attribute__((__nothrow__)) void *memcpy(void * __restrict  __dest , void const   * __restrict  __src ,
 302                                                   size_t __n )  __attribute__((__nonnull__(1,2))) ;
 303 extern  __attribute__((__nothrow__)) size_t strlen(char const   *__s )  __attribute__((__pure__,
 304 __nonnull__(1))) ;
 305 extern  __attribute__((__nothrow__)) time_t time(time_t *__timer ) ;
 306 extern int pthread_join(pthread_t __th , void **__thread_return ) ;
 307 extern int pthread_cancel(pthread_t __th ) ;
 308 extern  __attribute__((__nothrow__)) __off_t lseek(int __fd , __off_t __offset , int __whence ) ;
 309 extern int close(int __fd ) ;
 310 extern ssize_t write(int __fd , void const   *__buf , size_t __n ) ;
 311 extern  __attribute__((__nothrow__)) int dup(int __fd ) ;
 312 extern int open(char const   *__file , int __oflag  , ...)  __attribute__((__nonnull__(1))) ;
 313 extern  __attribute__((__nothrow__)) uint16_t htons(uint16_t __hostshort )  __attribute__((__const__)) ;
 314 extern  __attribute__((__nothrow__)) in_addr_t inet_addr(char const   *__cp ) ;
 315 void http_head_req(struct request *req___0 ) ;
 316 int calc_offset(int total , int part , int nthreads___0 ) ;
 317 int numofthreads(int size ) ;
 318 void *http_get(void *arg ) ;
 319 void get(struct request *req___0 ) 
 320 { int i ;
 321   int ret ;
 322   int fd ;
 323   int diff_sec ;
 324   int nok ;
 325   long soffset ;
 326   long foffset ;
 327   char *fmt ;
 328   void *tmp ;
 329   int *tmp___0 ;
 330   char *tmp___1 ;
 331   int *tmp___2 ;
 332   char *tmp___3 ;
 333   size_t tmp___4 ;
 334   int *tmp___5 ;
 335   char *tmp___6 ;
 336   __off_t tmp___7 ;
 337   int *tmp___8 ;
 338   char *tmp___9 ;
 339   ssize_t tmp___10 ;
 340   void *tmp___11 ;
 341   int tmp___12 ;
 342   int tmp___13 ;
 343 
 344   {
 345   nok = 0;
 346   if ((int )req___0->proto == 255) {
 347     http_head_req(req___0);
 348   }
 349   ret = numofthreads(req___0->clength);
 350   if (fsuggested == 0) {
 351     if (ret == 0) {
 352       nthreads = 1;
 353     } else {
 354       nthreads = ret;
 355     }
 356   }
 357   tmp = malloc((unsigned int )nthreads * sizeof(struct thread_data ));
 358   wthread = (struct thread_data *)tmp;
 359   Log((char *)"Downloading %s (%d bytes) from site %s(%s:%d). Number of Threads: %d",
 360       req___0->url, req___0->clength, req___0->host, req___0->ip, req___0->port, nthreads);
 361   tmp___4 = strlen((char const   *)(req___0->lfile));
 362   if (tmp___4 != 0U) {
 363     fd = open((char const   *)(req___0->lfile), 66, 448);
 364     if (fd == -1) {
 365       tmp___0 = __errno_location();
 366       tmp___1 = strerror(*tmp___0);
 367       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"get: cannot open file %s for writing: %s\n",
 368               req___0->lfile, tmp___1);
 369       exit(1);
 370     }
 371   } else {
 372     fd = open((char const   *)(req___0->file), 66, 448);
 373     if (fd == -1) {
 374       tmp___2 = __errno_location();
 375       tmp___3 = strerror(*tmp___2);
 376       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"get: cannot open file %s for writing: %s\n",
 377               req___0->lfile, tmp___3);
 378       exit(1);
 379     }
 380   }
 381   tmp___7 = lseek(fd, (long )(req___0->clength - 1), 0);
 382   if (tmp___7 == -1L) {
 383     tmp___5 = __errno_location();
 384     tmp___6 = strerror(*tmp___5);
 385     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"get: couldn\'t lseek:  %s\n",
 386             tmp___6);
 387     exit(1);
 388   }
 389   tmp___10 = write(fd, (void const   *)"0", 1U);
 390   if (tmp___10 == -1) {
 391     tmp___8 = __errno_location();
 392     tmp___9 = strerror(*tmp___8);
 393     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"get: couldn\'t allocate space for download file: %s\n",
 394             tmp___9);
 395     exit(1);
 396   }
 397   tmp___11 = calloc(254U, sizeof(char ));
 398   fmt = (char *)tmp___11;
 399   time(& t_start);
 400   i = 0;
 401   while (i < nthreads) {
 402     tmp___12 = calc_offset(req___0->clength, i, nthreads);
 403     soffset = (long )tmp___12;
 404     tmp___13 = calc_offset(req___0->clength, i + 1, nthreads);
 405     foffset = (long )tmp___13;
 406     (wthread + i)->soffset = soffset;
 407     if (i == nthreads - 1) {
 408       (wthread + i)->foffset = (long )req___0->clength;
 409     } else {
 410       (wthread + i)->foffset = foffset;
 411     }
 412     (wthread + i)->sin.sin_family = (unsigned short)2;
 413     (wthread + i)->sin.sin_addr.s_addr = inet_addr((char const   *)(req___0->ip));
 414     (wthread + i)->sin.sin_port = htons((unsigned short )req___0->port);
 415     (wthread + i)->fd = dup(fd);
 416     (wthread + i)->clength = (long )req___0->clength;
 417     snprintf((char * __restrict  )fmt, 256U, (char const   * __restrict  )"GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nRange: bytes=%ld-\r\nConnection: close\r\n\r\n",
 418              req___0->url, req___0->host, "EnderUNIX Aget v0.4", soffset);
 419     strncpy((char * __restrict  )((wthread + i)->getstr), (char const   * __restrict  )fmt,
 420             256U);
 421     pthread_create((pthread_t * __restrict  )(& (wthread + i)->tid), (pthread_attr_t const   * __restrict  )((void *)0),
 422                    & http_get, (void * __restrict  )(wthread + i));
 423     i ++;
 424   }
 425   free((void *)fmt);
 426   i = 0;
 427   while (i < nthreads) {
 428     pthread_join((wthread + i)->tid, (void **)((void *)0));
 429     if ((int )(wthread + i)->status == 255) {
 430       nok ++;
 431     }
 432     i ++;
 433   }
 434   if (nok == nthreads) {
 435     pthread_cancel(hthread);
 436   } else {
 437     pthread_join(hthread, (void **)((void *)0));
 438   }
 439   time(& t_finish);
 440   diff_sec = (int )(t_finish - t_start);
 441   if (diff_sec == 0) {
 442     diff_sec = 1;
 443   }
 444   Log((char *)"Download completed, job completed in %d seconds. (%d Kb/sec)", diff_sec,
 445       (req___0->clength / diff_sec) / 1024);
 446   Log((char *)"Shutting down...");
 447   close(fd);
 448   return;
 449 }
 450 }
 451 void resume_get(struct hist_data *h ) 
 452 { int i ;
 453   int fd ;
 454   int diff_sec ;
 455   int nok ;
 456   char *fmt ;
 457   void *tmp ;
 458   void *tmp___0 ;
 459   int *tmp___1 ;
 460   char *tmp___2 ;
 461   int *tmp___3 ;
 462   char *tmp___4 ;
 463   size_t tmp___5 ;
 464 
 465   {
 466   nok = 0;
 467   nthreads = h->nthreads;
 468   tmp = calloc(254U, sizeof(char ));
 469   fmt = (char *)tmp;
 470   tmp___0 = malloc((unsigned int )nthreads * sizeof(struct thread_data ));
 471   wthread = (struct thread_data *)tmp___0;
 472   memcpy((void * __restrict  )req, (void const   * __restrict  )(& h->req), sizeof(struct request ));
 473   memcpy((void * __restrict  )wthread, (void const   * __restrict  )(h->wthread),
 474          sizeof(struct thread_data ) * (unsigned int )nthreads);
 475   Log((char *)"Resuming download %s (%d bytes) from site %s(%s:%d). Number of Threads: %d",
 476       req->url, req->clength, req->host, req->ip, req->port, nthreads);
 477   tmp___5 = strlen((char const   *)(req->lfile));
 478   if (tmp___5 != 0U) {
 479     fd = open((char const   *)(req->lfile), 2, 448);
 480     if (fd == -1) {
 481       tmp___1 = __errno_location();
 482       tmp___2 = strerror(*tmp___1);
 483       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"get: cannot open file %s for writing: %s\n",
 484               req->lfile, tmp___2);
 485       exit(1);
 486     }
 487   } else {
 488     fd = open((char const   *)(req->file), 2, 448);
 489     if (fd == -1) {
 490       tmp___3 = __errno_location();
 491       tmp___4 = strerror(*tmp___3);
 492       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"get: cannot open file %s for writing: %s\n",
 493               req->lfile, tmp___4);
 494       exit(1);
 495     }
 496   }
 497   time(& t_start);
 498   i = 0;
 499   while (i < nthreads) {
 500     (wthread + i)->soffset = (wthread + i)->offset;
 501     (wthread + i)->fd = dup(fd);
 502     snprintf((char * __restrict  )fmt, 256U, (char const   * __restrict  )"GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nRange: bytes=%ld-\r\nConnection: close\r\n\r\n",
 503              req->url, req->host, "EnderUNIX Aget v0.4", (wthread + i)->offset);
 504     strncpy((char * __restrict  )((wthread + i)->getstr), (char const   * __restrict  )fmt,
 505             256U);
 506     pthread_create((pthread_t * __restrict  )(& (wthread + i)->tid), (pthread_attr_t const   * __restrict  )((void *)0),
 507                    & http_get, (void * __restrict  )(wthread + i));
 508     i ++;
 509   }
 510   i = 0;
 511   while (i < nthreads) {
 512     pthread_join((wthread + i)->tid, (void **)((void *)0));
 513     i ++;
 514   }
 515   i = 0;
 516   while (i < nthreads) {
 517     pthread_join((wthread + i)->tid, (void **)((void *)0));
 518     if ((int )(wthread + i)->status == 255) {
 519       nok ++;
 520     }
 521     i ++;
 522   }
 523   if (nok == nthreads) {
 524     pthread_cancel(hthread);
 525   } else {
 526     pthread_join(hthread, (void **)((void *)0));
 527   }
 528   time(& t_finish);
 529   diff_sec = (int )(t_finish - t_start);
 530   if (diff_sec == 0) {
 531     diff_sec = 1;
 532   }
 533   Log((char *)"Download completed, job completed in %d seconds. (%d Kb/sec)", diff_sec,
 534       ((req->clength - h->bwritten) / diff_sec) / 1024);
 535   Log((char *)"Shutting down...");
 536   close(fd);
 537   return;
 538 }
 539 }
 540 /* compiler builtin: 
 541    void __builtin_va_end(__builtin_va_list  ) ;  */
 542 /* compiler builtin: 
 543    void __builtin_va_start(__builtin_va_list  ) ;  */
 544 #pragma merger(0,"/tmp/cil-rsiEkcjk.i","-g,-Wall,-W,-pedantic")
 545 extern struct _IO_FILE *stdout ;
 546 extern int fflush(FILE *__stream ) ;
 547 extern  __attribute__((__nothrow__)) int sprintf(char * __restrict  __s , char const   * __restrict  __format 
 548                                                  , ...) ;
 549 extern int vfprintf(FILE * __restrict  __s , char const   * __restrict  __format ,
 550                     __gnuc_va_list __arg ) ;
 551 extern int putchar(int __c ) ;
 552 extern  __attribute__((__nothrow__)) void *memset(void *__s , int __c , size_t __n )  __attribute__((__nonnull__(1))) ;
 553 extern  __attribute__((__nothrow__)) int strncmp(char const   *__s1 , char const   *__s2 ,
 554                                                  size_t __n )  __attribute__((__pure__,
 555 __nonnull__(1,2))) ;
 556 extern  __attribute__((__nothrow__)) char *strstr(char const   *__haystack , char const   *__needle )  __attribute__((__pure__,
 557 __nonnull__(1,2))) ;
 558 void revstr(char *str ) ;
 559 void updateProgressBar(float cur , float tot ) ;
 560 void handleHttpRetcode(char *rbuf ) ;
 561 void parse_url(char *url , struct request *req___0 ) 
 562 { char *s ;
 563   int i ;
 564   int j ;
 565   int k ;
 566   int tmp ;
 567   int tmp___0 ;
 568   int tmp___1 ;
 569   int tmp___2 ;
 570 
 571   {
 572   k = 0;
 573   j = k;
 574   i = j;
 575   s = url;
 576   tmp___0 = strncmp((char const   *)url, "ftp://", 6U);
 577   if (tmp___0 == 0) {
 578     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Error: Currently Aget doesn\'t support FTP requests...\n");
 579     exit(1);
 580   } else {
 581     tmp = strncmp((char const   *)url, "http://", 7U);
 582     if (tmp != 0) {
 583       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Error: URL should be of the form http://...\n");
 584       exit(1);
 585     }
 586   }
 587   if (req___0->port == 0) {
 588     req___0->port = 80;
 589     req___0->proto = (unsigned char)255;
 590   }
 591   s = url + 7;
 592   i = 0;
 593   while ((int )*s != 47) {
 594     if (i > 1024) {
 595       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Error: Cannot get hostname from URL...\n");
 596       exit(1);
 597     }
 598     if ((int )*s == 58) {
 599       while ((int )*s != 47) {
 600         tmp___1 = j;
 601         j ++;
 602         s --;
 603         req___0->username[tmp___1] = *s;
 604         i --;
 605       }
 606       j --;
 607       req___0->username[j] = (char )'\000';
 608       revstr(req___0->username);
 609       while (1) {
 610         if ((int )*s == 58) {
 611           while ((int )*s != 64) {
 612             if (k > 512) {
 613               fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Error: Cannot get password from URL...\n");
 614               exit(1);
 615             }
 616             tmp___2 = k;
 617             k ++;
 618             s ++;
 619             req___0->password[tmp___2] = *s;
 620           }
 621           break;
 622         }
 623         s ++;
 624       }
 625       k --;
 626       req___0->password[k] = (char )'\000';
 627     }
 628     req___0->host[i] = *s;
 629     i ++;
 630     s ++;
 631   }
 632   req___0->host[i] = (char )'\000';
 633   i = 0;
 634   while ((int )*s != 0) {
 635     if (i > 1024) {
 636       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Error: Cannot get remote file name from URL...\n");
 637       exit(1);
 638     }
 639     req___0->url[i] = *s;
 640     i ++;
 641     s ++;
 642   }
 643   req___0->url[i] = (char )'\000';
 644   s --;
 645   i = 0;
 646   while ((int )*s != 47) {
 647     if (i > 512) {
 648       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Error: Cannot get local file name from URL...\n");
 649       exit(1);
 650     }
 651     req___0->file[i] = *s;
 652     i ++;
 653     s --;
 654   }
 655   req___0->file[i] = (char )'\000';
 656   revstr(req___0->file);
 657   return;
 658 }
 659 }
 660 int numofthreads(int size ) 
 661 { 
 662 
 663   {
 664   if (size == 0) {
 665     return (0);
 666   } else {
 667     if (size < 16384) {
 668       return (1);
 669     } else {
 670       if (size >= 16384) {
 671         if (size < 32768) {
 672           return (2);
 673         } else {
 674           goto _L___5;
 675         }
 676       } else {
 677         _L___5: /* CIL Label */ 
 678         if (size >= 32768) {
 679           if (size < 65536) {
 680             return (3);
 681           } else {
 682             goto _L___4;
 683           }
 684         } else {
 685           _L___4: /* CIL Label */ 
 686           if (size >= 65536) {
 687             if (size < 131072) {
 688               return (4);
 689             } else {
 690               goto _L___3;
 691             }
 692           } else {
 693             _L___3: /* CIL Label */ 
 694             if (size >= 131072) {
 695               if (size < 262144) {
 696                 return (5);
 697               } else {
 698                 goto _L___2;
 699               }
 700             } else {
 701               _L___2: /* CIL Label */ 
 702               if (size >= 262144) {
 703                 if (size < 524288) {
 704                   return (6);
 705                 } else {
 706                   goto _L___1;
 707                 }
 708               } else {
 709                 _L___1: /* CIL Label */ 
 710                 if (size >= 524288) {
 711                   if (size < 1048576) {
 712                     return (7);
 713                   } else {
 714                     goto _L___0;
 715                   }
 716                 } else {
 717                   _L___0: /* CIL Label */ 
 718                   if (size >= 1048576) {
 719                     if (size < 2097152) {
 720                       return (8);
 721                     } else {
 722                       goto _L;
 723                     }
 724                   } else {
 725                     _L: /* CIL Label */ 
 726                     if (size >= 2097152) {
 727                       if (size < 4194304) {
 728                         return (9);
 729                       } else {
 730                         return (10);
 731                       }
 732                     } else {
 733                       return (10);
 734                     }
 735                   }
 736                 }
 737               }
 738             }
 739           }
 740         }
 741       }
 742     }
 743   }
 744 }
 745 }
 746 int calc_offset(int total , int part , int nthreads___0 ) 
 747 { 
 748 
 749   {
 750   return (part * (total / nthreads___0));
 751 }
 752 }
 753 void usage(void) 
 754 { 
 755 
 756   {
 757   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"usage: aget [options] url\n");
 758   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\toptions:\n");
 759   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\t\t-p port number\n");
 760   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\t\t-l local file name\n");
 761   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\t\t-n suggested number of threads\n");
 762   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\t\t-f force using suggested number of threads\n");
 763   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\t\t-h this screen\n");
 764   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\t\t-v version info\n");
 765   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\n");
 766   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"http//www.enderunix.org/aget/\n");
 767   return;
 768 }
 769 }
 770 void revstr(char *str ) 
 771 { char *p ;
 772   char *s ;
 773   int i ;
 774   int size ;
 775   size_t tmp ;
 776   void *tmp___0 ;
 777 
 778   {
 779   tmp = strlen((char const   *)str);
 780   size = (int )tmp;
 781   if (size == 0) {
 782     return;
 783   }
 784   tmp___0 = calloc((unsigned int )size, sizeof(char ));
 785   p = (char *)tmp___0;
 786   s = p;
 787   i = size;
 788   while (i >= 0) {
 789     *s = *((str + i) - 1);
 790     i --;
 791     s ++;
 792   }
 793   *s = (char )'\000';
 794   memset((void *)str, 0, (unsigned int )size);
 795   strncpy((char * __restrict  )str, (char const   * __restrict  )p, (unsigned int )size);
 796   free((void *)p);
 797   return;
 798 }
 799 }
 800 void Log(char *fmt  , ...) 
 801 { va_list ap ;
 802   char *lfmt ;
 803   size_t tmp ;
 804   void *tmp___0 ;
 805   int *tmp___1 ;
 806   char *tmp___2 ;
 807   size_t tmp___3 ;
 808 
 809   {
 810   tmp = strlen((char const   *)fmt);
 811   tmp___0 = calloc(7U + tmp, sizeof(char ));
 812   lfmt = (char *)tmp___0;
 813   sprintf((char * __restrict  )lfmt, (char const   * __restrict  )"<LOG> %s", fmt);
 814   fflush(stdout);
 815   __builtin_va_start(ap, fmt);
 816   vfprintf((FILE * __restrict  )stderr, (char const   * __restrict  )lfmt, ap);
 817   __builtin_va_end(ap);
 818   if ((int )*(fmt + 0) != 0) {
 819     tmp___3 = strlen((char const   *)fmt);
 820     if ((int )*(fmt + (tmp___3 - 1U)) == 58) {
 821       tmp___1 = __errno_location();
 822       tmp___2 = strerror(*tmp___1);
 823       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )" %s", tmp___2);
 824     }
 825   }
 826   fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"\n");
 827   free((void *)lfmt);
 828   return;
 829 }
 830 }
 831 static float prev  =    (float )-1;
 832 void updateProgressBar(float cur , float tot ) 
 833 { float rat ;
 834   int ndot ;
 835   int i ;
 836 
 837   {
 838   rat = cur / tot;
 839   ndot = (int )(rat * (float )100);
 840   if ((float )ndot < prev + (float )5) {
 841     if (ndot != 100) {
 842       return;
 843     }
 844   }
 845   i = 0;
 846   while (i < ndot) {
 847     putchar('.');
 848     i += 2;
 849   }
 850   i = ndot - 1;
 851   while (i < 100) {
 852     putchar(' ');
 853     i += 2;
 854   }
 855   printf((char const   * __restrict  )"[%d%% completed]\n", ndot);
 856   prev = (float )ndot;
 857   return;
 858 }
 859 }
 860 void handleHttpRetcode(char *rbuf ) 
 861 { char *tmp ;
 862   char *tmp___0 ;
 863   char *tmp___1 ;
 864 
 865   {
 866   tmp___1 = strstr((char const   *)rbuf, "HTTP/1.1 416");
 867   if ((unsigned int )tmp___1 != (unsigned int )((void *)0)) {
 868     Log((char *)"Server returned HTTP/1.1 416 - Requested Range Not Satisfiable\n");
 869     exit(1);
 870   } else {
 871     tmp___0 = strstr((char const   *)rbuf, "HTTP/1.1 403");
 872     if ((unsigned int )tmp___0 != (unsigned int )((void *)0)) {
 873       Log((char *)"<Server returned HTTP/1.1 403 - Permission Denied\n");
 874       exit(1);
 875     } else {
 876       tmp = strstr((char const   *)rbuf, "HTTP/1.1 404");
 877       if ((unsigned int )tmp != (unsigned int )((void *)0)) {
 878         Log((char *)"<Server returned HTTP/1.1 404 - File Not Found\n");
 879         exit(1);
 880       }
 881     }
 882   }
 883   return;
 884 }
 885 }
 886 #pragma merger(0,"/tmp/cil-vVPZxX0H.i","-g,-Wall,-W,-pedantic")
 887 extern  __attribute__((__nothrow__)) char *strtok(char * __restrict  __s , char const   * __restrict  __delim )  __attribute__((__nonnull__(2))) ;
 888 extern  __attribute__((__nothrow__)) void bzero(void *__s , size_t __n )  __attribute__((__nonnull__(1))) ;
 889 extern  __attribute__((__nothrow__)) int socket(int __domain , int __type , int __protocol ) ;
 890 extern int connect(int __fd , struct sockaddr  const  *__addr , socklen_t __len ) ;
 891 extern ssize_t send(int __fd , void const   *__buf , size_t __n , int __flags ) ;
 892 extern ssize_t recv(int __fd , void *__buf , size_t __n , int __flags ) ;
 893 extern  __attribute__((__nothrow__)) int *__h_errno_location(void)  __attribute__((__const__)) ;
 894 extern  __attribute__((__nothrow__)) char const   *hstrerror(int __err_num ) ;
 895 extern struct hostent *gethostbyname(char const   *__name ) ;
 896 extern  __attribute__((__nothrow__)) char *inet_ntoa(struct in_addr __in ) ;
 897 void http_head_req(struct request *req___0 ) 
 898 { struct sockaddr_in sin ;
 899   struct hostent *he ;
 900   int sd ;
 901   char *sbuf ;
 902   char *rbuf ;
 903   char *tok ;
 904   char *s ;
 905   int clength ;
 906   size_t tmp ;
 907   void *tmp___0 ;
 908   void *tmp___1 ;
 909   int *tmp___2 ;
 910   char const   *tmp___3 ;
 911   char *tmp___4 ;
 912   int *tmp___5 ;
 913   char *tmp___6 ;
 914   int *tmp___7 ;
 915   char *tmp___8 ;
 916   int tmp___9 ;
 917   int *tmp___10 ;
 918   char *tmp___11 ;
 919   size_t tmp___12 ;
 920   ssize_t tmp___13 ;
 921   int *tmp___14 ;
 922   char *tmp___15 ;
 923   ssize_t tmp___16 ;
 924   size_t tmp___17 ;
 925   char *tmp___18 ;
 926   char *tmp___19 ;
 927 
 928   {
 929   tmp = strlen((char const   *)(req___0->url));
 930   tmp___0 = calloc(512U + tmp, sizeof(char ));
 931   sbuf = (char *)tmp___0;
 932   tmp___1 = calloc(512U, sizeof(char ));
 933   rbuf = (char *)tmp___1;
 934   he = gethostbyname((char const   *)(req___0->host));
 935   if ((unsigned int )he == (unsigned int )((void *)0)) {
 936     tmp___2 = __h_errno_location();
 937     tmp___3 = hstrerror(*tmp___2);
 938     Log((char *)"Error: Cannot resolve hostname for %s: %s", req___0->host, tmp___3);
 939     exit(1);
 940   }
 941   tmp___4 = inet_ntoa(*((struct in_addr *)*(he->h_addr_list + 0)));
 942   strncpy((char * __restrict  )(req___0->ip), (char const   * __restrict  )tmp___4,
 943           16U);
 944   time(& t_start);
 945   bzero((void *)(& sin), sizeof(sin));
 946   sin.sin_family = (unsigned short)2;
 947   sin.sin_addr.s_addr = inet_addr((char const   *)(req___0->ip));
 948   sin.sin_port = htons((unsigned short )req___0->port);
 949   sd = socket(2, 1, 0);
 950   if (sd == -1) {
 951     tmp___5 = __errno_location();
 952     tmp___6 = strerror(*tmp___5);
 953     Log((char *)"Socket creation failed for Head Request: %s", tmp___6);
 954     exit(1);
 955   }
 956   tmp___9 = connect(sd, (struct sockaddr  const  *)(& sin), sizeof(sin));
 957   if (tmp___9 == -1) {
 958     tmp___7 = __errno_location();
 959     tmp___8 = strerror(*tmp___7);
 960     Log((char *)"Connection failed for Head Request: %s", tmp___8);
 961     exit(1);
 962   }
 963   Log((char *)"Head-Request Connection established");
 964   sprintf((char * __restrict  )sbuf, (char const   * __restrict  )"HEAD %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n",
 965           req___0->url, req___0->host, "EnderUNIX Aget v0.4");
 966   tmp___12 = strlen((char const   *)sbuf);
 967   tmp___13 = send(sd, (void const   *)sbuf, tmp___12, 0);
 968   if (tmp___13 == -1) {
 969     tmp___10 = __errno_location();
 970     tmp___11 = strerror(*tmp___10);
 971     Log((char *)"send failed for Head Request: %s", tmp___11);
 972     exit(1);
 973   }
 974   tmp___16 = recv(sd, (void *)rbuf, 512U, 0);
 975   if (tmp___16 == -1) {
 976     tmp___14 = __errno_location();
 977     tmp___15 = strerror(*tmp___14);
 978     Log((char *)"recv failed for Head Request: %s", tmp___15);
 979     exit(1);
 980   }
 981   handleHttpRetcode(rbuf);
 982   tok = strtok((char * __restrict  )rbuf, (char const   * __restrict  )"\r\n");
 983   tmp___19 = strstr((char const   *)tok, "HTTP/1.1 200");
 984   if ((unsigned int )tmp___19 != (unsigned int )((void *)0)) {
 985     while (1) {
 986       tok = strtok((char * __restrict  )((void *)0), (char const   * __restrict  )"\r\n");
 987       if (! ((unsigned int )tok != (unsigned int )((void *)0))) {
 988         break;
 989       }
 990       tmp___18 = strstr((char const   *)tok, "Content-Length");
 991       if ((unsigned int )tmp___18 != (unsigned int )((void *)0)) {
 992         tmp___17 = strlen("Content-Length: ");
 993         s = tok + tmp___17;
 994         clength = atoi((char const   *)s);
 995         req___0->clength = clength;
 996       }
 997     }
 998   }
 999   free((void *)sbuf);
1000   free((void *)rbuf);
1001   return;
1002 }
1003 }
1004 #pragma merger(0,"/tmp/cil-R4CIbMeC.i","-g,-Wall,-W,-pedantic")
1005 extern int sigwait(sigset_t const   * __restrict  __set , int * __restrict  __sig )  __attribute__((__nonnull__(1,2))) ;
1006 extern  __attribute__((__nothrow__)) unsigned int alarm(unsigned int __seconds ) ;
1007 void sigint_handler(void) ;
1008 void sigalrm_handler(void) ;
1009 void save_log(void) ;
1010 unsigned int bwritten ;
1011 void *signal_waiter(void *arg ) 
1012 { int signal___0 ;
1013 
1014   {
1015   arg = (void *)0;
1016   pthread_sigmask(1, (__sigset_t const   * __restrict  )(& signal_set), (__sigset_t * __restrict  )((void *)0));
1017   while (1) {
1018     sigwait((sigset_t const   * __restrict  )(& signal_set), (int * __restrict  )(& signal___0));
1019     switch (signal___0) {
1020     case 2:
1021     case 3:
1022     sigint_handler();
1023     break;
1024     case 14: 
1025     sigalrm_handler();
1026     break;
1027     }
1028   }
1029 }
1030 }
1031 void sigint_handler(void) 
1032 { int i ;
1033 
1034   {
1035   printf((char const   * __restrict  )"^C caught, saving download job...\n");
1036   i = 0;
1037   while (i < nthreads) {
1038     pthread_cancel((wthread + i)->tid);
1039     (wthread + i)->status = (unsigned char )((int )(wthread + i)->status & 15);
1040     i ++;
1041   }
1042   save_log();
1043   exit(0);
1044 }
1045 }
1046 void sigalrm_handler(void) 
1047 { 
1048 
1049   {
1050   printf((char const   * __restrict  )"Signal Alarm came\n");
1051   updateProgressBar((float )bwritten, (float )req->clength);
1052   alarm(1U);
1053   return;
1054 }
1055 }
1056 #pragma merger(0,"/tmp/cil-msdqRXZR.i","-g,-Wall,-W,-pedantic")
1057 extern  __attribute__((__noreturn__)) void pthread_exit(void *__retval ) ;
1058 extern  __attribute__((__nothrow__)) pthread_t pthread_self(void)  __attribute__((__const__)) ;
1059 extern int pthread_setcanceltype(int __type , int *__oldtype ) ;
1060 extern  __attribute__((__nothrow__)) int pthread_mutex_lock(pthread_mutex_t *__mutex )  __attribute__((__nonnull__(1))) ;
1061 extern  __attribute__((__nothrow__)) int pthread_mutex_unlock(pthread_mutex_t *__mutex )  __attribute__((__nonnull__(1))) ;
1062 unsigned int bwritten  =    0U;
1063 pthread_mutex_t bwritten_mutex  =    {{0, 0U, 0, 0, 0U, {0}}};
1064 extern int ( /* missing proto */  pwrite)() ;
1065 void *http_get(void *arg ) 
1066 { struct thread_data *td ;
1067   int sd ;
1068   char *rbuf ;
1069   char *s ;
1070   int dr ;
1071   int dw ;
1072   int i ;
1073   long foffset ;
1074   pthread_t tid ;
1075   void *tmp ;
1076   int *tmp___0 ;
1077   char *tmp___1 ;
1078   int *tmp___2 ;
1079   char *tmp___3 ;
1080   int tmp___4 ;
1081   int *tmp___5 ;
1082   char *tmp___6 ;
1083   size_t tmp___7 ;
1084   ssize_t tmp___8 ;
1085   int *tmp___9 ;
1086   char *tmp___10 ;
1087   char *tmp___11 ;
1088 
1089   {
1090   tid = pthread_self();
1091   pthread_sigmask(0, (__sigset_t const   * __restrict  )(& signal_set), (__sigset_t * __restrict  )((void *)0));
1092   pthread_setcanceltype(1, (int *)((void *)0));
1093   td = (struct thread_data *)arg;
1094   foffset = td->foffset;
1095   tmp = calloc(8192U, sizeof(char ));
1096   rbuf = (char *)tmp;
1097   sd = socket(2, 1, 0);
1098   if (sd == -1) {
1099     tmp___0 = __errno_location();
1100     tmp___1 = strerror(*tmp___0);
1101     Log((char *)"<THREAD #%ld> socket creation failed: %s", tid, tmp___1);
1102     pthread_exit((void *)1);
1103   }
1104   tmp___4 = connect(sd, (struct sockaddr  const  *)(& td->sin), sizeof(struct sockaddr ));
1105   if (tmp___4 == -1) {
1106     tmp___2 = __errno_location();
1107     tmp___3 = strerror(*tmp___2);
1108     Log((char *)"<THREAD #%ld> connection failed: %s", tid, tmp___3);
1109     pthread_exit((void *)1);
1110   }
1111   tmp___7 = strlen((char const   *)(td->getstr));
1112   tmp___8 = send(sd, (void const   *)(td->getstr), tmp___7, 0);
1113   if (tmp___8 == -1) {
1114     tmp___5 = __errno_location();
1115     tmp___6 = strerror(*tmp___5);
1116     Log((char *)"<THREAD #%ld> send failed: %s", tid, tmp___6);
1117     pthread_exit((void *)1);
1118   }
1119   dr = recv(sd, (void *)rbuf, 8192U, 0);
1120   if (dr == -1) {
1121     tmp___9 = __errno_location();
1122     tmp___10 = strerror(*tmp___9);
1123     Log((char *)"<THREAD #%ld> recv failed: %s", tid, tmp___10);
1124     pthread_exit((void *)1);
1125   }
1126   handleHttpRetcode(rbuf);
1127   tmp___11 = strstr((char const   *)rbuf, "HTTP/1.1 206");
1128   if ((unsigned int )tmp___11 == (unsigned int )((void *)0)) {
1129     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"Something unhandled happened, shutting down...\n");
1130     exit(1);
1131   }
1132   s = rbuf;
1133   i = 0;
1134   while (1) {
1135     if ((int )*s == 10) {
1136       if ((int )*(s - 1) == 13) {
1137         if ((int )*(s - 2) == 10) {
1138           if ((int )*(s - 3) == 13) {
1139             s ++;
1140             i ++;
1141             break;
1142           }
1143         }
1144       }
1145     }
1146     s ++;
1147     i ++;
1148   }
1149   td->offset = td->soffset;
1150   if ((long )(dr - i) > foffset) {
1151     dw = pwrite(td->fd, s, foffset - (long )i, td->soffset);
1152   } else {
1153     dw = pwrite(td->fd, s, dr - i, td->soffset);
1154   }
1155   td->offset = td->soffset + (long )dw;
1156   pthread_mutex_lock(& bwritten_mutex);
1157   bwritten += (unsigned int )dw;
1158   pthread_mutex_unlock(& bwritten_mutex);
1159   while (td->offset < foffset) {
1160     memset((void *)rbuf, 8192, 0U);
1161     dr = recv(sd, (void *)rbuf, 8192U, 0);
1162     if (td->offset + (long )dr > foffset) {
1163       dw = pwrite(td->fd, rbuf, foffset - td->offset, td->offset);
1164     } else {
1165       dw = pwrite(td->fd, rbuf, dr, td->offset);
1166     }
1167     td->offset += (long )dw;
1168     pthread_mutex_lock(& bwritten_mutex);
1169     bwritten += (unsigned int )dw;
1170     pthread_mutex_unlock(& bwritten_mutex);
1171     updateProgressBar((float )bwritten, (float )td->clength);
1172   }
1173   if (td->offset == td->foffset) {
1174     td->status = (unsigned char)255;
1175   }
1176   close(sd);
1177   pthread_exit((void *)0);
1178   return ((void *)0);
1179 }
1180 }
1181 #pragma merger(0,"/tmp/cil-qIg3LbHM.i","-g,-Wall,-W,-pedantic")
1182 extern int fclose(FILE *__stream ) ;
1183 extern FILE *fopen(char const   * __restrict  __filename , char const   * __restrict  __modes ) ;
1184 extern size_t fread(void * __restrict  __ptr , size_t __size , size_t __n , FILE * __restrict  __stream ) ;
1185 extern size_t fwrite(void const   * __restrict  __ptr , size_t __size , size_t __n ,
1186                      FILE * __restrict  __s ) ;
1187 extern  __attribute__((__nothrow__)) int unlink(char const   *__name )  __attribute__((__nonnull__(1))) ;
1188 void save_log(void) 
1189 { char *logfile ;
1190   struct hist_data h ;
1191   FILE *fp ;
1192   void *tmp ;
1193   size_t tmp___0 ;
1194   int *tmp___1 ;
1195   char *tmp___2 ;
1196 
1197   {
1198   tmp = calloc(255U, sizeof(char ));
1199   logfile = (char *)tmp;
1200   tmp___0 = strlen((char const   *)((req + 0)->lfile));
1201   if (tmp___0 == 0U) {
1202     snprintf((char * __restrict  )logfile, 255U, (char const   * __restrict  )"aget-%s.log",
1203              (req + 0)->file);
1204   } else {
1205     snprintf((char * __restrict  )logfile, 255U, (char const   * __restrict  )"aget-%s.log",
1206              (req + 0)->lfile);
1207   }
1208   fp = fopen((char const   * __restrict  )logfile, (char const   * __restrict  )"w");
1209   if ((unsigned int )fp == (unsigned int )((void *)0)) {
1210     tmp___1 = __errno_location();
1211     tmp___2 = strerror(*tmp___1);
1212     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"cannot open log file %s for writing: %s\n",
1213             logfile, tmp___2);
1214     exit(1);
1215   }
1216   memcpy((void * __restrict  )(& h.req), (void const   * __restrict  )req, sizeof(struct request ));
1217   memcpy((void * __restrict  )(& h.wthread), (void const   * __restrict  )wthread,
1218          sizeof(struct thread_data ) * (unsigned int )nthreads);
1219   h.nthreads = nthreads;
1220   h.bwritten = (int )bwritten;
1221   printf((char const   * __restrict  )"--> Logfile is: %s, so far %d bytes have been transferred\n",
1222          logfile, h.bwritten);
1223   fwrite((void const   * __restrict  )(& h), sizeof(struct hist_data ), 1U, (FILE * __restrict  )fp);
1224   fclose(fp);
1225   free((void *)logfile);
1226   return;
1227 }
1228 }
1229 int read_log(struct hist_data *h ) 
1230 { char *logfile ;
1231   FILE *fp ;
1232   void *tmp ;
1233   size_t tmp___0 ;
1234   int *tmp___1 ;
1235   char *tmp___2 ;
1236   int *tmp___3 ;
1237   int *tmp___4 ;
1238   char *tmp___5 ;
1239   int tmp___6 ;
1240 
1241   {
1242   tmp = calloc(255U, sizeof(char ));
1243   logfile = (char *)tmp;
1244   tmp___0 = strlen((char const   *)((req + 0)->lfile));
1245   if (tmp___0 == 0U) {
1246     snprintf((char * __restrict  )logfile, 255U, (char const   * __restrict  )"aget-%s.log",
1247              (req + 0)->file);
1248   } else {
1249     snprintf((char * __restrict  )logfile, 255U, (char const   * __restrict  )"aget-%s.log",
1250              (req + 0)->lfile);
1251   }
1252   Log((char *)"Attempting to read log file %s for resuming download job...", logfile);
1253   fp = fopen((char const   * __restrict  )logfile, (char const   * __restrict  )"r");
1254   if ((unsigned int )fp == (unsigned int )((void *)0)) {
1255     tmp___3 = __errno_location();
1256     if (*tmp___3 == 2) {
1257       Log((char *)"Couldn\'t find log file for this download, starting a clean job...");
1258       return (-1);
1259     } else {
1260       tmp___1 = __errno_location();
1261       tmp___2 = strerror(*tmp___1);
1262       fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"cannot open log file %s for reading: %s\n",
1263               logfile, tmp___2);
1264       exit(1);
1265     }
1266   }
1267   fread((void * __restrict  )h, sizeof(struct hist_data ), 1U, (FILE * __restrict  )fp);
1268   bwritten = (unsigned int )h->bwritten;
1269   fclose(fp);
1270   Log((char *)"%d bytes already transferred", bwritten);
1271   tmp___6 = unlink((char const   *)logfile);
1272   if (tmp___6 == -1) {
1273     tmp___4 = __errno_location();
1274     tmp___5 = strerror(*tmp___4);
1275     fprintf((FILE * __restrict  )stderr, (char const   * __restrict  )"read_log: cannot remove stale log file %s: %s\n",
1276             logfile, tmp___5);
1277   }
1278   free((void *)logfile);
1279   return (0);
1280 }
1281 }


syntax highlighted by Code2HTML, v. 0.9.1