From f44333dcb46bc347195ebd0297b4fca2172e334a Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 27 Apr 2022 17:34:18 -0700 Subject: [PATCH] ... --- Makefile.am | 2 -- inc/init.h | 5 +++-- inc/log.h | 3 +-- inc/session.h | 2 +- inc/setup.h | 10 ---------- src/init.c | 29 +++++++++++++++++++++++++++-- src/log.c | 33 +++++++++++++++++++++++++++------ src/session.c | 14 +++++++++++++- src/setup.c | 30 ------------------------------ test/integration/basic.test | Bin 79832 -> 0 bytes 10 files changed, 72 insertions(+), 56 deletions(-) delete mode 100644 inc/setup.h delete mode 100644 src/setup.c delete mode 100755 test/integration/basic.test diff --git a/Makefile.am b/Makefile.am index 978cc66..cb77b55 100644 --- a/Makefile.am +++ b/Makefile.am @@ -81,7 +81,6 @@ seederd_SOURCES = \ src/rss/info.c \ src/rss/init.c \ src/session.c \ - src/setup.c \ src/torrent/add.c \ src/torrent/file.c \ src/torrent/free.c \ @@ -116,7 +115,6 @@ seederd_SOURCES += \ inc/pqueue.h \ inc/rss.h \ inc/session.h \ - inc/setup.h \ inc/torrent.h \ inc/tree.h \ inc/usage.h \ diff --git a/inc/init.h b/inc/init.h index 59e1f91..eb3007e 100644 --- a/inc/init.h +++ b/inc/init.h @@ -2,10 +2,11 @@ #define __INIT_H_ #include +#include #include -#include -#include +#include +#include #include extern struct option long_options[]; diff --git a/inc/log.h b/inc/log.h index db677ea..acc2b30 100644 --- a/inc/log.h +++ b/inc/log.h @@ -51,9 +51,8 @@ struct log_helper { size_t next; }; -int log_entries_init(); void log_message(enum log_level,FILE*,const char*,...); void *log_poll(void*); -void log_shutdown(); +int logging_setup(); #endif diff --git a/inc/session.h b/inc/session.h index 70109da..2b3b404 100644 --- a/inc/session.h +++ b/inc/session.h @@ -19,9 +19,9 @@ struct session { extern struct session session; -void session_clean(); struct torrent *session_find_torrent(uint8_t*,size_t); int session_init(); +int session_setup(); int session_torrent_add(struct torrent*); #endif diff --git a/inc/setup.h b/inc/setup.h deleted file mode 100644 index 950da59..0000000 --- a/inc/setup.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __SETUP_H_ -#define __SETUP_H_ - -#include -#include - -int setup_logging(); -int setup_session(); - -#endif diff --git a/src/init.c b/src/init.c index ab4514c..7b03d6c 100644 --- a/src/init.c +++ b/src/init.c @@ -19,15 +19,19 @@ struct option long_options[] = { {0,0,0,0} }; +static int signal_handler(); + int init(int argc, char **argv) { int c; + + if(signal_handler()<0) { return -1; } - if(setup_session()<0) { return -1; } + if(session_setup()<0) { return -1; } if(defaults()<0) { return -1; } if(opt_load_from_env()<0) { return -1; } - if(setup_logging()<0) { return -1; } + if(logging_setup()<0) { return -1; } while(1) { int option_index = 0; @@ -77,3 +81,24 @@ int init(int argc, char **argv) { return 1; } + +static void handle_interrupt() { + /* + * call exit explicitly will call functions registered + * with atexit and do appropriate cleanup. + */ + exit(EXIT_FAILURE); +} + +static int signal_handler() { + struct sigaction action; + + action.sa_handler = &handle_interrupt; + action.sa_flags = SA_RESETHAND; + if(sigaction(SIGINT,&action,NULL)!=0) { + perror("sigaction"); + return -1; + } + + return 1; +} diff --git a/src/log.c b/src/log.c index 211e2a6..4572150 100644 --- a/src/log.c +++ b/src/log.c @@ -1,13 +1,18 @@ #include +pthread_t logging_thread; +pthread_mutex_t logging_mutex = PTHREAD_MUTEX_INITIALIZER; + static struct log_helper helper; static struct log_entry *log_dequeue(); static void log_enqueue(struct log_entry*); static void log_entries_clean(void*); +static int log_entries_init(); static void log_flush(void*); static void log_print(); static void log_print_prefix(FILE*); +static void log_shutdown(); static struct log_entry *log_dequeue() { // requires logging_mutex to be locked @@ -37,7 +42,11 @@ static void log_enqueue(struct log_entry *p) { pthread_mutex_unlock(&logging_mutex); } -int log_entries_init() { +static void log_entries_clean(void *p) { + free(helper.p); +} + +static int log_entries_init() { helper.start = NULL; helper.end = NULL; helper.next = 0; @@ -51,10 +60,6 @@ int log_entries_init() { return 1; } -static void log_entries_clean(void *p) { - free(helper.p); -} - static void log_flush(void *p) { pthread_mutex_lock(&logging_mutex); @@ -158,7 +163,7 @@ void *log_poll(void *p) { return NULL; } -void log_shutdown() { +static void log_shutdown() { int ret_cancel, ret_join; void *res; @@ -172,3 +177,19 @@ void log_shutdown() { log_msg(LOG_MESSAGE_SHUTDOWN_SUCCESS); } } + +int logging_setup() { + if(log_entries_init()<0) { return -1; } + + if(pthread_create(&logging_thread,NULL,&log_poll,NULL)!=0) { + perror("pthread_create"); + return -1; + } + + if(0!=atexit(&log_shutdown)) { + perror("atexit"); + return -1; + } + + return 1; +} diff --git a/src/session.c b/src/session.c index fa843d1..a9659b6 100644 --- a/src/session.c +++ b/src/session.c @@ -2,11 +2,12 @@ struct session session; +static void session_clean(); static int session_torrent_add_by_infohash(struct torrent*); static int session_torrent_add_by_path(struct torrent*); static int session_torrent_resize(struct hash_map**,size_t); -void session_clean() { +static void session_clean() { struct torrent *p; for(size_t i=0;isize;i++) { @@ -34,6 +35,17 @@ int session_init() { return 1; } +int session_setup() { + if(session_init(&session)<0) { return -1; } + + if(0!=atexit(&session_clean)) { + perror("atexit"); + return -1; + } + + return 1; +} + int session_torrent_add(struct torrent *p) { int i; diff --git a/src/setup.c b/src/setup.c deleted file mode 100644 index 6eccddd..0000000 --- a/src/setup.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -pthread_t logging_thread; -pthread_mutex_t logging_mutex = PTHREAD_MUTEX_INITIALIZER; - -int setup_logging() { - if(log_entries_init()<0) { return -1; } - if(pthread_create(&logging_thread,NULL,&log_poll,NULL)!=0) { - perror("pthread_create"); - return -1; - } - - if(0!=atexit(&log_shutdown)) { - perror("atexit"); - return -1; - } - - return 1; -} - -int setup_session() { - if(session_init(&session)<0) { return -1; } - - if(0!=atexit(&session_clean)) { - perror("atexit"); - return -1; - } - - return 1; -} diff --git a/test/integration/basic.test b/test/integration/basic.test deleted file mode 100755 index 508464c74b4818262b196d9e76d1901f48d33414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79832 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 z zX+X6?nq<1%f6^2-^!al)||(iJyN!}eGT@Fx(5H$u5*7`Qz3l~bVP zmt#jzbXs1QUytaoKAEz9WB-Ervpfz6#Pj7Q5U`bC^0iqJ;@lq3&3yHgjpuMB zZ_kTpAHQsV#roH?9en!D-tHYGzeTm%Rn;YNJ`N42S8p}|KbYT~;D>3U0PK4Y zc_YE&cNqDm_(d}_3r)GQI9BtMiM?9;EqeoNl%{um4H2bsU+36oMwqA z-!$aM0n)NzRf5Ou^16L59L6Q4dhj)Hd{GHClvxkViB}$3`W1D;7EscE(&J_CGa;{#Ty8KsV9dt4cbr8w^K z?u6&urC9tNjn{?sR{T9r<_azT`q;n3?94d-0^R7`KpaR+&4|m%b|)GMX>M1B?^7gW zQqxLX#T9XEZIt+l!+?6@v$Iu`zBf+M@i^Fu_2CdV**OUb?(FO&e4b*0G0v6h#e$`! zstf!I3Vf`F7+*%o$?|_2g~JeZ5VF(U?yOREVd?nsE{>inEp=jPtFau-m{PKaGkZe1 z*A)-+diSsko_igQUB^$nD_!2>i;Y^&6 zf%^RD_4toG=k{=Uyiz-HIOcJuxu~GFveLYU)8|SjHl4|t*!5y@J;TW)g;1t1w4Ck~ zm6j=qs6_AiRsE^#*U;N&!IhqxfaWv3tQp2JM4cEe!-*Lp9f=Q~J3c2FDz1!VOeboW zAHLVyuK0K?va0veQZw9o8}8DZ>8=D%X25**-`(Uqj8g@!9sEV#PieGY*-|#JG{Fvj za4gZ+_gxwv3KYh+KL2TUM{ES@>-#f}p;}O(UB5T@w~C81wf*`&PNQyL-)4o_>ccN^ zylN`3U*GR(%vBxc?HD(;K7Kj(m7$N#0Gt;>(lq68jmPJ-M+p5)0KX-lGFFC8gB&X;JvAKlfDnSil6sc?DBeF<0p{8kJ}~s z`o8PNe^LJ;bQycPef@jG9i@Lk*{|bMx2yfQ9J&g)TJ6s522wCn5rU$DWtwEg-zoDagY=yv>j{;HA5j~Sv30Zul>A0x=vL%Dv*h7t*6=dgJI|KSh3QttvjX^?6P6^(680O zufY4>z+&4q+T26`wFtk~EdC%9Q0)5Ml)l}6?W6rlopuK(V^iyEd|c_5mNJadKl(X+ zR2=H#S}$;4=f36<3wQ&GlBEKG>D(EAIv(`-kMonw#o!?BTln>d+YZ{>=k2de#HT;C NwO?|GO~JNn`~&Eu72f~= -- 2.30.2