/* Copyright 2001 2002 Debajyoti Bera */ /* This file is part of mGet. * mGet is free Software; please refer to COPYING for terms and conditions */ /*-----------------------------------------------------------------------/ * Header file for mGet: multithreaded wget * contains important structures for the program * and included files */ #ifndef __MGET_H #define __MGET_H #include "common.h" #include "mgetutil.h" #include "http_connect.h" #include /* to handle Ctrl-C signal ans write log */ #include void catch_interrupt_signal(int); #if defined(HAVE_GETOPT_LONG) || defined(HAVE_GETOPT_GETOPT_H) #include #elif defined(HAVE_GETOPT_STDLIB_H) #include /* getopt() is in POSIX, so at least it is in unistd #else error "getopt or getopt_long is not supported" */ #endif #if defined (HAVE_GETOPT_LONG) # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif #if !defined(HAVE_INET_NTOP) char *inet_ntop(int , INADDR *, char *, size_t ); #endif #ifndef INET_ADDRSTRLEN #define INET_ADDRSTRLEN 33 #endif #define GET_STR \ "GET %s://%s HTTP/1.1 \r\nHOST:%s\r\nUser-Agent: mGet/"VERSION"\r\nPragma:no-cache\r\nCache-Control:no-cache\r\nAccept:*/*\r\nRange: bytes=%ld-%ld\r\n%s%s%s%sConnection:close\r\n\r\n" #define GET_STR_NO_RANGE \ "GET %s://%s HTTP/1.1 \r\nHOST:%s\r\nUser-Agent: mGet/"VERSION"\r\nPragma:no-cache\r\nCache-Control:no-cache\r\nAccept:*/*\r\n%s%s%s%sConnection:close\r\n\r\n" #define HEAD_STR_HTTP \ "HEAD %s://%s HTTP/1.1 \r\nHOST:%s\r\nUser-Agent: mGet/"VERSION"\r\nPragma:no-cache\r\nCache-Control:no-cache\r\nAccept:*/*\r\nRange: bytes=1-2\r\n%s%s%s%sConnection:close\r\n\r\n" #define HEAD_STR_FTP \ "GET %s://%s HTTP/1.1 \r\nHOST:%s\r\nUser-Agent: mGet/"VERSION"\r\nPragma:no-cache\r\nCache-Control:no-cache\r\nAccept:*/*\r\nRange: bytes=1-2\r\n%s%s%s%sConnection:close\r\n\r\n" //------------- Typedefs ------------------// typedef struct sockaddr SADDR; typedef struct sockaddr_in SADDR_IN; typedef struct in_addr INADDR; typedef struct hostent HOST; typedef unsigned char byte; //------------- Global Variables ----------// int num_segment=1; //number of segment the file can be broken into, default 1 int proxy_port=PROXY_PORT, port=PORT; char *proxy=NULL; char *file_name=NULL; //name of the file to get char *save_file_name=NULL; //name of the file to save char *user_name=NULL, *user_passwd=NULL, *host_name=NULL; pthread_t *thread_id; //pointer to store thread ids FILE *file=NULL, *outfile=NULL; int thread_timeout_second=60; int RETRY_TIME=5; //retry for socket create/connect error char *protocol; //default char *referrer=NULL; int rollback=0; //rollback, default=0 ;DO U REALLY NEED TO ROLLBACK char error_buffer[1024]={0}; //parameters BOOL PROXY=FALSE; //default ... no proxy BOOL PROXY_AUTH=FALSE; //default...no authorization BOOL REFERRER=FALSE; //default no referrer BOOL SUPPORT_RESUME=TRUE; //default, support resume BOOL HAS_LENGTH=TRUE; //default file length is returned BOOL PROTO_HTTP=TRUE; //default protocol: HTTP BOOL VERBOSE=FALSE; //how much to babble :) BOOL USE_HTTP_CONNECT=FALSE; //use connect protocol in HTTP int curr_threads=0; pthread_mutex_t thread_done_mutex; pthread_cond_t thread_done_cond; pthread_mutex_t file_mutex; SOCKET s; //primary socket SADDR_IN saddr; /* HOST *host; */ //------------- Structures ----------------// struct request{ long size_file; char *version; //HTTP version of server, actually 9 fields int status_code; //status-code of file }; //contains the informations for a request typedef struct request REQUEST; struct present_page{ unsigned int page_id; //maybe needed to identify a page long size_total; //total size: reduntant long range_start; //start byte long range_end; //end byte long range_size; // range size: reduntant SOCKET sock; //thread socket long present_seek_pos; //present lseek position long present_read_pos; //present position till which file is read }; //contains the information for the present page typedef struct present_page PPAGE; //error codes #define ERR_M_OK 0 #define ERR_M_SOCKERR -1 //socket create error #define ERR_M_CONNERR -2 //connect error #define ERR_M_TIMEOUT -3 //timeout #define SIZE_PER_SEGMENT 10240 #define ALLOWANCE 1024 //------------- Function Declarations ------// void print_usage(); //prints usage information and exits void get_options(int , char **); //get the options void err_exit(char *, int, SOCKET); //print error,process by option and exit void init_socket(); //initialize the main sock int get_head(REQUEST *); //get the header for this request void get_name_passwd(void); //get the user name and password void process_thread(REQUEST *); //start the threads for the request void* start_thread(void *); //function on each thread int start_thread_sock(PPAGE *); //thread socket function int get_thread_request(PPAGE *); //thread specific download routine inline int do_timeout(PPAGE *); //code to handle timeout inline void print_segments(); //to print individual segment status and values int check_file_segment_num(int, int); //checks if the number of segment is not too large /* writing log for resuming later */ void write_log_file(FILE *); void read_log_file(char *); void cleanup(); /* maybe any cleanup function */ REQUEST main_request; PPAGE *ppage; char *sep="+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";//separator string /*char *info=" ------------ mGet - "VERSION"--------------\n ----------------- Made by -----------------\n -------- Arindam Chakraborty 98071 --------\n -------- Ashutosh Kumar 98091 --------\n -------- Chinmoy Dutta 98115 --------\n -------- Debajyoti Bera 98117 --------\n ----- as a part of Assignment #1, CS425 ---\n"; */ #endif //----------- end of mget.h --------------//