diff --git a/interface.c b/interface.c index 8676c1d..62ea4dc 100644 --- a/interface.c +++ b/interface.c @@ -110,9 +110,13 @@ extern int usfd; extern int sfd; extern int use_ids; +extern int daemonize; + extern struct tgl_state *TLS; int readline_deactivated; +void event_incoming (struct bufferevent *bev, short what, void *_arg); + int is_same_word (const char *s, size_t l, const char *word) { return s && word && strlen (word) == l && !memcmp (s, word, l); } @@ -930,10 +934,16 @@ void do_status_offline (int arg_num, struct arg args[], struct in_ev *ev) { } void do_quit (int arg_num, struct arg args[], struct in_ev *ev) { + if (daemonize) + event_incoming (ev->bev, BEV_EVENT_EOF, ev); + //bufferevent_free(ev->bev); do_halt (0); } void do_safe_quit (int arg_num, struct arg args[], struct in_ev *ev) { + if (daemonize) + event_incoming (ev->bev, BEV_EVENT_EOF, ev); + //bufferevent_free(ev->bev); safe_quit = 1; } diff --git a/loop.c b/loop.c index 3e260dc..847de86 100644 --- a/loop.c +++ b/loop.c @@ -217,6 +217,7 @@ void net_loop (void) { if (safe_quit && !TLS->active_queries) { printf ("All done. Exit\n"); do_halt (0); + safe_quit = 0; } if (sigterm_cnt > 0) { do_halt (0); @@ -601,7 +602,7 @@ static void read_incoming (struct bufferevent *bev, void *_arg) { } } -static void event_incoming (struct bufferevent *bev, short what, void *_arg) { +void event_incoming (struct bufferevent *bev, short what, void *_arg) { struct in_ev *ev = _arg; if (what & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { vlogprintf (E_WARNING, "Closing incoming connection\n"); @@ -620,7 +621,7 @@ static void accept_incoming (evutil_socket_t efd, short what, void *arg) { int fd = accept (efd, (struct sockaddr *)&cli_addr, &clilen); assert (fd >= 0); - struct bufferevent *bev = bufferevent_socket_new (TLS->ev_base, fd, 0); + struct bufferevent *bev = bufferevent_socket_new (TLS->ev_base, fd, BEV_OPT_CLOSE_ON_FREE); struct in_ev *e = malloc (sizeof (*e)); e->bev = bev; e->refcnt = 1; diff --git a/main.c b/main.c index db69eba..799b19e 100644 --- a/main.c +++ b/main.c @@ -493,7 +493,7 @@ int disable_auto_accept; int wait_dialog_list; char *logname; -int daemonize; +int daemonize=0; void reopen_logs (void) { @@ -568,6 +568,11 @@ int change_user_group () { if (setuid (pw->pw_uid) < 0) { fprintf (stderr, "change_user_group: failed to assume identity of user %s\n", username); return -1; + } else { + pw = getpwuid(getuid()); + setenv("USER", pw->pw_name, 1); + setenv("HOME", pw->pw_dir, 1); + setenv("SHELL", pw->pw_shell, 1); } } return 0; @@ -741,11 +746,14 @@ void sig_term_handler (int signum __attribute__ ((unused))) { } void do_halt (int error) { + if (daemonize) + return; + if (!readline_disabled) { rl_free_line_state (); rl_cleanup_after_signal (); } - + if (write (1, "halt\n", 5) < 0) { // Sad thing } diff --git a/start-telegram-daemon b/start-telegram-daemon index 85c8584..a498166 100755 --- a/start-telegram-daemon +++ b/start-telegram-daemon @@ -96,7 +96,7 @@ if(open $etchandle, $etcfile) $line =~ s/\s+$//g; $line =~ s/^\s+//g; next unless $line; - next if $line =~ /^\-[dh]/; + next if $line =~ /^\-[h]/; if($line =~ /^[^\-]/) { @@ -112,7 +112,7 @@ if(open $etchandle, $etcfile) $have_l = 1 if $line =~ /^-L\s/; $have_c = 1 if $line =~ /^-c\s/; - $have_u = 1 if $line =~ /^-u\s/; + $have_u = 1 if $line =~ /^-U\s/; push @$params, $line; } @@ -120,7 +120,7 @@ if(open $etchandle, $etcfile) $params = []; } -push @$params, "-u telegramd" unless($have_u); +push @$params, "-U telegramd" unless($have_u); push @$params, "-L $fd_reopened" unless($have_l); push @$params, "-c config$idl" unless($have_c); $params = join " ", @$params;