X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=command.c;h=e3b15a5ae0e44985a6279ac2f8e137d19fb3c9be;hp=9abe04a341f94520a3720167e6610f1940e9fb24;hb=33a282ec9378ca6b2d0707c6e9642a3e6b625cb4;hpb=3cfb1d880ebf22546486316cb74cce21f007eb07 diff --git a/command.c b/command.c index 9abe04a3..e3b15a5a 100644 --- a/command.c +++ b/command.c @@ -30,6 +30,8 @@ #include "user_list.h" #include "server_command_list.h" #include "afs_command_list.h" +#include "sched.h" +#include "signal.h" /** Commands including options must be shorter than this. */ #define MAX_COMMAND_LEN 32768 @@ -42,15 +44,8 @@ extern int mmd_mutex; extern struct misc_meta_data *mmd; extern struct sender senders[]; -static void dummy(int s) +static void dummy(__a_unused int s) { - /* - * At least on Solaris, SIGUSR1 is one-shot, i.e. the signal action is - * restored to the default state once the signal handler has been - * called. - */ - if (s == SIGUSR1) - signal(SIGUSR1, dummy); } static void mmd_dup(struct misc_meta_data *new_mmd) @@ -113,7 +108,7 @@ static char *get_status(struct misc_meta_data *nmmd) char *status, *flags; /* vss status info */ char *ut = uptime_str(); long offset = (nmmd->offset + 500) / 1000; - struct timeval now; + struct timeval current_time; struct tm mtime_tm; /* report real status */ @@ -123,7 +118,7 @@ static char *get_status(struct misc_meta_data *nmmd) localtime_r(&nmmd->mtime, &mtime_tm); strftime(mtime, 29, "%b %d %Y", &mtime_tm); } - gettimeofday(&now, NULL); + gettimeofday(¤t_time, NULL); ret = make_message( "%s: %zu\n" /* file size */ "%s: %s\n" /* mtime */ @@ -146,8 +141,8 @@ static char *get_status(struct misc_meta_data *nmmd) (long unsigned)nmmd->stream_start.tv_sec, (long unsigned)nmmd->stream_start.tv_usec, status_item_list[SI_CURRENT_TIME], - (long unsigned)now.tv_sec, - (long unsigned)now.tv_usec, + (long unsigned)current_time.tv_sec, + (long unsigned)current_time.tv_usec, nmmd->afd.verbose_ls_output @@ -190,30 +185,15 @@ static int check_sender_args(int argc, char * const * argv, struct sender_comman break; case SENDER_DENY: case SENDER_ALLOW: - if (argc != 4 && argc != 5) + if (argc != 4 || parse_cidr(argv[3], scd->host, + sizeof(scd->host), &scd->netmask) == NULL) return -E_COMMAND_SYNTAX; - if (!inet_pton(AF_INET, argv[3], &scd->addr)) - return -E_COMMAND_SYNTAX; - scd->netmask = 32; - if (argc == 5) { - scd->netmask = atoi(argv[4]); - if (scd->netmask < 0 || scd->netmask > 32) - return -E_COMMAND_SYNTAX; - } break; case SENDER_ADD: case SENDER_DELETE: - if (argc != 4 && argc != 5) + if (argc != 4) return -E_COMMAND_SYNTAX; - if (!inet_pton(AF_INET, argv[3], &scd->addr)) - return -E_COMMAND_SYNTAX; - scd->port = -1; - if (argc == 5) { - scd->port = atoi(argv[4]); - if (scd->port < 0 || scd->port > 65535) - return -E_COMMAND_SYNTAX; - } - break; + return parse_fec_url(argv[3], scd); default: return -E_COMMAND_SYNTAX; } @@ -254,7 +234,7 @@ int com_sender(int fd, int argc, char * const * argv) usleep(100 * 1000); continue; } - mmd->sender_cmd_data = scd; + memcpy(&mmd->sender_cmd_data, &scd, sizeof(scd)); mutex_unlock(mmd_mutex); break; } @@ -325,7 +305,7 @@ int com_stat(int fd, int argc, char * const * argv) struct misc_meta_data tmp, *nmmd = &tmp; char *s; - signal(SIGUSR1, dummy); + para_sigaction(SIGUSR1, dummy); if (argc > 1) num = atoi(argv[1]); @@ -662,6 +642,14 @@ out: } +static void reset_signals(void) +{ + para_sigaction(SIGCHLD, SIG_IGN); + para_sigaction(SIGINT, SIG_DFL); + para_sigaction(SIGTERM, SIG_DFL); + para_sigaction(SIGHUP, SIG_DFL); +} + /** * Perform user authentication and execute a command. * @@ -701,11 +689,7 @@ __noreturn void handle_connect(int fd, const char *peername) char *p, *command = NULL; size_t numbytes; - signal(SIGCHLD, SIG_IGN); - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - signal(SIGHUP, SIG_DFL); - + reset_signals(); /* we need a blocking fd here as recv() might return EAGAIN otherwise. */ ret = mark_fd_blocking(fd); if (ret < 0) @@ -794,12 +778,12 @@ __noreturn void handle_connect(int fd, const char *peername) /* valid command and sufficient perms */ alarm(0); argc = split_args(command, &argv, "\n"); - mutex_lock(mmd_mutex); - mmd->num_commands++; - mutex_unlock(mmd_mutex); PARA_NOTICE_LOG("calling com_%s() for %s@%s\n", cmd->name, u->name, peername); ret = cmd->handler(fd, argc, argv); + mutex_lock(mmd_mutex); + mmd->num_commands++; + mutex_unlock(mmd_mutex); if (ret >= 0) goto out; err_out: