Date: Thu, 26 Sep 2013 12:30:28 GMT From: ambarisha@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r257719 - in soc2013/ambarisha/head/usr.bin: dmget dms Message-ID: <201309261230.r8QCUSQn068334@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ambarisha Date: Thu Sep 26 12:30:28 2013 New Revision: 257719 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257719 Log: Fixed the compilation warnings in dms and dmget Added: soc2013/ambarisha/head/usr.bin/dmget/utils.h soc2013/ambarisha/head/usr.bin/dms/mirror.h soc2013/ambarisha/head/usr.bin/dms/utils.h Modified: soc2013/ambarisha/head/usr.bin/dmget/dmget.c soc2013/ambarisha/head/usr.bin/dmget/dmget.h soc2013/ambarisha/head/usr.bin/dmget/fetch.c soc2013/ambarisha/head/usr.bin/dmget/utils.c soc2013/ambarisha/head/usr.bin/dms/dms.c soc2013/ambarisha/head/usr.bin/dms/mirror.c soc2013/ambarisha/head/usr.bin/dms/utils.c soc2013/ambarisha/head/usr.bin/dms/worker.c Modified: soc2013/ambarisha/head/usr.bin/dmget/dmget.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dmget/dmget.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dmget/dmget.c Thu Sep 26 12:30:28 2013 (r257719) @@ -8,10 +8,11 @@ #include <stdlib.h> #include <string.h> #include <fcntl.h> - +#include <signal.h> #include "dm.h" #include "dmget.h" +#include "utils.h" dm_auth_t dmAuthMethod; stat_display_t dmStatDisplayMethod; @@ -222,12 +223,12 @@ } static int -send_signal(int sock) +send_signal(int sock, int sig) { struct dmmsg msg; msg.op = DMSIG; - msg.buf = &signal; - msg.len = sizeof(signal); + msg.buf = (char *)&sig; + msg.len = sizeof(sig); return (send_dmmsg(sock, msg)); } @@ -409,8 +410,13 @@ goto failure; } - if (sigint || siginfo) { - send_signal(sock); + if (sigint) { + send_signal(sock, SIGINT); + goto signal; + } + + if (siginfo) { + send_signal(sock, SIGINFO); goto signal; } Modified: soc2013/ambarisha/head/usr.bin/dmget/dmget.h ============================================================================== --- soc2013/ambarisha/head/usr.bin/dmget/dmget.h Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dmget/dmget.h Thu Sep 26 12:30:28 2013 (r257719) @@ -17,7 +17,7 @@ char *scheme; char *host; char user[AUTH_USERLEN+1]; - char pwd[AUTH_PWDLEN+1] + char pwd[AUTH_PWDLEN+1]; }; extern int dmLastErrCode; Modified: soc2013/ambarisha/head/usr.bin/dmget/fetch.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dmget/fetch.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dmget/fetch.c Thu Sep 26 12:30:28 2013 (r257719) @@ -261,7 +261,7 @@ dmreq.B_size = B_size; dmreq.S_size = S_size; dmreq.URL = URL; - dmreq.path = path; + dmreq.path = (char *)path; dmreq.T_secs = T_secs; if (i_flag) dmreq.i_filename = i_filename; Modified: soc2013/ambarisha/head/usr.bin/dmget/utils.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dmget/utils.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dmget/utils.c Thu Sep 26 12:30:28 2013 (r257719) @@ -1,13 +1,15 @@ -#include <sys/socket.h> #include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> #include <errno.h> +#include <sys/socket.h> + #include "dm.h" /* Utils for handling messages */ -extern char *dm_errstr; - int send_dmmsg(int socket, struct dmmsg msg) { @@ -50,7 +52,7 @@ struct dmmsg *msg = (struct dmmsg *) malloc(sizeof(struct dmmsg)); if (msg == NULL) { fprintf(stderr, "send_dmmsg: malloc: insufficient memory\n"); - return -1; + return NULL; } err = read(sock, &bufsize, sizeof(bufsize)); @@ -68,7 +70,7 @@ err = read(sock, &(msg->op), sizeof(msg->op)); if (err == 0) { - fprintf(stderr,stderr, "recv_dmmsg: remote end" + fprintf(stderr, "recv_dmmsg: remote end" " closed connection\n"); goto error; } else if (err == -1) { @@ -89,7 +91,7 @@ err = read(sock, msg->buf, bufsize); if (err == 0) { msg->len = 0; - fprintf(stderr,stderr, "recv_dmmsg: remote end" + fprintf(stderr,"recv_dmmsg: remote end" " closed connection\n"); free(msg->buf); free(msg); Added: soc2013/ambarisha/head/usr.bin/dmget/utils.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/ambarisha/head/usr.bin/dmget/utils.h Thu Sep 26 12:30:28 2013 (r257719) @@ -0,0 +1,20 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <sys/socket.h> + +#include "dm.h" + +/* Utils for handling messages */ + +int +send_dmmsg(int socket, struct dmmsg msg); + +struct dmmsg * +recv_dmmsg(int sock); + +void +free_dmmsg(struct dmmsg **msg); Modified: soc2013/ambarisha/head/usr.bin/dms/dms.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/dms.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dms/dms.c Thu Sep 26 12:30:28 2013 (r257719) @@ -10,22 +10,25 @@ #include <err.h> #include <fetch.h> #include <pthread.h> +#include <signal.h> #include "dm.h" #include "dms.h" +#include "utils.h" +#include "mirror.h" static int dm_err; static char dm_errstr[512]; int stop; - struct dmjob *jobs; pthread_mutex_t job_queue_mutex; extern struct dmmirr *mirrors; extern pthread_mutex_t mirror_list_mutex; -void *run_worker(struct dmjob *job); +extern void *run_worker(void *); +extern int send_report(int, struct dmrep); static int read_fd(int sock) @@ -349,97 +352,31 @@ static void run_event_loop(int socket) { - int i, ret, maxfd = socket; + int ret, csock; + struct sockaddr_un cliaddr; + size_t cliaddrlen; struct dmjob *cur; void *retptr; - fd_set fdset; jobs = NULL; job_queue_mutex = PTHREAD_MUTEX_INITIALIZER; + mirrors = NULL; mirror_list_mutex = PTHREAD_MUTEX_INITIALIZER; load_mirrors(); signal(SIGINT, sigint_handler); while (!stop) { - - /* Prepare fdset and make select call */ - FD_ZERO(&fdset); - maxfd = socket; - FD_SET(socket, &fdset); - - /* Acquire job queue lock */ - ret = pthread_mutex_lock(&job_queue_mutex); - if (ret == -1) { - fprintf(stderr, "handle_request: Attempt to acquire" - " job queue mutex failed\n"); - return -1; - } - - cur = jobs; - while (cur != NULL) { - FD_SET(cur->client, &fdset); - if (cur->client > maxfd) - maxfd = cur->client; - cur = cur->next; - } - - ret = pthread_mutex_unlock(&job_queue_mutex); - if (ret == -1) { - fprintf(stderr, "handle_request: Couldn't release " - "job queue lock\n"); - - return -1; - } - /* Job queue lock released */ - - ret = select(maxfd + 1, &fdset, NULL, NULL, NULL); - if (ret == -1) { + cliaddrlen = sizeof(cliaddr); + csock = accept(socket, (struct sockaddr *) &cliaddr, + &cliaddrlen); + if (csock == -1) { fprintf(stderr, "run_event_loop: " - "select: %s\n", strerror(errno)); + "select: %s\n", strerror(errno)); goto wrap_up; } - /* Acquire job queue lock */ - ret = pthread_mutex_lock(&job_queue_mutex); - if (ret == -1) { - fprintf(stderr, "handle_request: Attempt to acquire" - " job queue mutex failed\n"); - return -1; - } - - cur = jobs; - while (cur != NULL) { - ret = service_job(cur, &fdset); - if (ret > 0) { - close(cur->client); - jobs = rm_job(jobs, cur); - rm_dmjob(&cur); - } - cur = cur->next; - } - - ret = pthread_mutex_unlock(&job_queue_mutex); - if (ret == -1) { - fprintf(stderr, "handle_request: Couldn't release " - "job queue lock\n"); - - return -1; - } - /* Job queue lock released */ - - if (FD_ISSET(socket, &fdset)) { - struct sockaddr_un cliaddr; - size_t cliaddrlen = sizeof(cliaddr); - int csock = accept(socket, (struct sockaddr *) &cliaddr, - &cliaddrlen); - if (csock == -1) { - fprintf(stderr, "run_event_loop: " - "select: %s\n", strerror(errno)); - goto wrap_up; - } - handle_request(csock); - } + handle_request(csock); } wrap_up: @@ -449,7 +386,7 @@ if (ret == -1) { fprintf(stderr, "handle_request: Attempt to acquire" " job queue mutex failed\n"); - return -1; + return; } cur = jobs; @@ -467,7 +404,7 @@ fprintf(stderr, "handle_request: Couldn't release " "job queue lock\n"); - return -1; + return; } /* Job queue lock released */ Modified: soc2013/ambarisha/head/usr.bin/dms/mirror.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/mirror.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dms/mirror.c Thu Sep 26 12:30:28 2013 (r257719) @@ -1,15 +1,19 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <pthread.h> + #include <errno.h> #include <sys/time.h> + #include "dm.h" #include "dms.h" +#include "mirror.h" #define MAX_SAMPLES 256 #define MAX_CONNS 5 #define MIRRORS_FILE "mirrors.list" -struct dmmirr *mirrors; -pthread_mutex_t mirror_list_mutex; - static const char *MIRROR_LIST[] = { "ftp.freebsd.org" }; Added: soc2013/ambarisha/head/usr.bin/dms/mirror.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/ambarisha/head/usr.bin/dms/mirror.h Thu Sep 26 12:30:28 2013 (r257719) @@ -0,0 +1,12 @@ +#ifndef _MIRROR_H_ +#define _MIRROR_H_ + +struct dmmirr *mirrors; +pthread_mutex_t mirror_list_mutex; + +int load_mirrors(void); +int save_mirrors(void); +void update_mirror(struct dmmirr *, struct xferstat *); +struct dmmirr *get_mirror(void); + +#endif Modified: soc2013/ambarisha/head/usr.bin/dms/utils.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/utils.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dms/utils.c Thu Sep 26 12:30:28 2013 (r257719) @@ -1,13 +1,15 @@ -#include <sys/socket.h> #include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> #include <errno.h> +#include <sys/socket.h> + #include "dm.h" /* Utils for handling messages */ -extern char *dm_errstr; - int send_dmmsg(int socket, struct dmmsg msg) { @@ -50,7 +52,7 @@ struct dmmsg *msg = (struct dmmsg *) malloc(sizeof(struct dmmsg)); if (msg == NULL) { fprintf(stderr, "send_dmmsg: malloc: insufficient memory\n"); - return -1; + return NULL; } err = read(sock, &bufsize, sizeof(bufsize)); @@ -68,7 +70,7 @@ err = read(sock, &(msg->op), sizeof(msg->op)); if (err == 0) { - fprintf(stderr,stderr, "recv_dmmsg: remote end" + fprintf(stderr, "recv_dmmsg: remote end" " closed connection\n"); goto error; } else if (err == -1) { @@ -89,7 +91,7 @@ err = read(sock, msg->buf, bufsize); if (err == 0) { msg->len = 0; - fprintf(stderr,stderr, "recv_dmmsg: remote end" + fprintf(stderr,"recv_dmmsg: remote end" " closed connection\n"); free(msg->buf); free(msg); Added: soc2013/ambarisha/head/usr.bin/dms/utils.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/ambarisha/head/usr.bin/dms/utils.h Thu Sep 26 12:30:28 2013 (r257719) @@ -0,0 +1,20 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <sys/socket.h> + +#include "dm.h" + +/* Utils for handling messages */ + +int +send_dmmsg(int socket, struct dmmsg msg); + +struct dmmsg * +recv_dmmsg(int sock); + +void +free_dmmsg(struct dmmsg **msg); Modified: soc2013/ambarisha/head/usr.bin/dms/worker.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/worker.c Thu Sep 26 10:33:15 2013 (r257718) +++ soc2013/ambarisha/head/usr.bin/dms/worker.c Thu Sep 26 12:30:28 2013 (r257719) @@ -1,7 +1,10 @@ #include <sys/socket.h> #include <sys/stat.h> +#include <sys/select.h> #include <stdint.h> +#include <stdlib.h> +#include <pthread.h> #include <err.h> #include <string.h> #include <errno.h> @@ -10,15 +13,16 @@ #include <unistd.h> #include "dms.h" +#include "utils.h" #include "dm.h" +#include "mirror.h" +#define TMP_EXT ".tmp" static const char *prefixes = " kMGTP"; extern struct dmjob *jobs; extern pthread_mutex_t job_queue_mutex; -#define TMP_EXT ".tmp" - static int authenticate(struct url *url) { @@ -316,6 +320,50 @@ } static int +check_signal(int signum, struct dmjob *dmjob) +{ + struct timeval tv; + struct dmmsg *msg; + int *sig, ret; + fd_set fds; + + if (signum == SIGINT && dmjob->sigint != 0) + return 1; + if (signum == SIGINFO && dmjob->siginfo != 0) + return 1; + if (signum == SIGALRM && dmjob->sigalrm != 0) + return 1; + + do { + FD_ZERO(&fds); + FD_SET(dmjob->client, &fds); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + ret = select(dmjob->client + 1, &fds, NULL, NULL, &tv); + msg = recv_dmmsg(dmjob->client); + sig = (int *)msg->buf; + if (*sig == SIGINT) + dmjob->sigint = 1; + else if (*sig == SIGINFO) + dmjob->siginfo = 1; + else if (*sig == SIGALRM) + dmjob->sigalrm = 1; + + } while (ret == 1); + + if (signum == SIGINT && dmjob->sigint != 0) + return dmjob->sigint; + if (signum == SIGINFO && dmjob->siginfo != 0) + return dmjob->siginfo; + if (signum == SIGALRM && dmjob->sigalrm != 0) + return dmjob->sigalrm; + + return 0; +} + +static int fetch(struct dmjob *dmjob, FILE *f, struct url_stat us) { struct stat sb, nsb; @@ -393,12 +441,9 @@ if (dmjob->timeout) alarm(dmjob->timeout); - if (dmjob->sigalrm || dmjob->sigint) + if (check_signal(SIGALRM, dmjob) || check_signal(SIGINT, dmjob)) goto signal; - if (dmjob->sigint) - goto signal; - /* check that size is as expected */ /*if (dmreq->S_size) { if (us.size == -1) { @@ -511,7 +556,7 @@ * from scratch if we want the whole file */ dmjob->url->offset = 0; - if (dmjob->sigint) + if (check_signal(SIGINT, dmjob)) goto signal; } @@ -555,13 +600,13 @@ /* suck in the data */ dmjob->siginfo_en = 1; - while (!dmjob->sigint) { + while (!check_signal(SIGINT, dmjob)) { if (us.size != -1 && us.size - count < dmreq->B_size && us.size - count >= 0) size = us.size - count; else size = dmreq->B_size; - if (dmjob->siginfo) { + if (check_signal(SIGINFO, dmjob)) { stat_end(&xs, dmjob); dmjob->siginfo = 0; } @@ -570,7 +615,7 @@ break; if ((readcnt = fread(buf, 1, size, f)) < size) { - if (ferror(f) && errno == EINTR && !dmjob->sigint) + if (ferror(f) && errno == EINTR && !check_signal(SIGINT, dmjob)) clearerr(f); else if (readcnt == 0) { break; @@ -581,7 +626,7 @@ stat_update(&xs, count += readcnt, dmjob); for (ptr = buf; readcnt > 0; ptr += wr, readcnt -= wr) if ((wr = fwrite(ptr, 1, readcnt, of)) < readcnt) { - if (ferror(of) && errno == EINTR && !dmjob->sigint) + if (ferror(of) && errno == EINTR && !check_signal(SIGINT, dmjob)) clearerr(of); else break; @@ -590,7 +635,7 @@ break; } - if (!dmjob->sigalrm) + if (!check_signal(SIGALRM, dmjob)) dmjob->sigalrm = ferror(f) && errno == ETIMEDOUT; dmjob->siginfo_en = 0; @@ -616,9 +661,9 @@ } /* timed out or interrupted? */ - if (dmjob->sigalrm) + if (check_signal(SIGALRM, dmjob)) warnx("transfer timed out"); - if (dmjob->sigint) { + if (check_signal(SIGINT, dmjob)) { warnx("transfer interrupted"); goto failure; } @@ -627,7 +672,7 @@ if (f == NULL) goto failure; - if (!dmjob->sigalrm) { + if (!check_signal(SIGALRM, dmjob)) { /* check the status of our files */ if (ferror(f)) warn("%s", dmreq->URL); @@ -648,7 +693,7 @@ * If the transfer timed out and we didn't know how much to * expect, assume the worst (i.e. we didn't get all of it) */ - if (dmjob->sigalrm && us.size == -1) { + if (check_signal(SIGALRM, dmjob) && us.size == -1) { warnx("%s may be truncated", dmreq->path); goto failure_keep; } @@ -829,36 +874,6 @@ return fetch(dmjob, f, us); } -/* TODO: This handler isn't registered as SIGUSR1 interrupts the download - * Figure out a proper way to handle this - * */ -void -sig_handler(int sig) -{ - struct dmjob *tmp = jobs; - struct dmmsg *msg; - int *clisig; - pthread_t tid = pthread_self(); - if (sig == SIGUSR1) { - /* TODO: Umm...Locking? */ - while (tmp != NULL) { - if (pthread_equal(tid, tmp->worker) != 0) - break; - tmp = tmp->next; - } - - msg = recv_dmmsg(tmp->client); - clisig = msg->buf; - if (*clisig == SIGINT) - tmp->sigint = 1; - else if (*clisig == SIGINFO) - tmp->siginfo = 1; - else if (*clisig == SIGALRM) { - tmp->sigalrm = 1; - } - } -} - int send_report(int sock, struct dmrep report) { @@ -908,7 +923,7 @@ if (ret == -1) { fprintf(stderr, "handle_request: Attempt to acquire" " job queue mutex failed\n"); - return -1; + return NULL; } tmp = jobs; @@ -926,7 +941,7 @@ fprintf(stderr, "handle_request: Couldn't release " "job queue lock\n"); - return -1; + return NULL; } /* Job queue lock released */ @@ -942,7 +957,7 @@ if (ret == -1) { fprintf(stderr, "handle_request: Attempt to acquire" " job queue mutex failed\n"); - return -1; + return NULL; } /* Serve any outstanding requests from the local tmp file */ @@ -972,8 +987,7 @@ if (ret == -1) { fprintf(stderr, "handle_request: Couldn't release " "job queue lock\n"); - - return -1; + return NULL; } /* Job queue lock released */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309261230.r8QCUSQn068334>