Date: Mon, 19 Aug 2013 20:41:32 GMT From: ambarisha@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r256165 - soc2013/ambarisha/head/usr.bin/dms Message-ID: <201308192041.r7JKfWKa027484@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ambarisha Date: Mon Aug 19 20:41:32 2013 New Revision: 256165 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256165 Log: Cleaner error reporting in worker Modified: soc2013/ambarisha/head/usr.bin/dms/dms.c soc2013/ambarisha/head/usr.bin/dms/utils.c soc2013/ambarisha/head/usr.bin/dms/worker.c Modified: soc2013/ambarisha/head/usr.bin/dms/dms.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/dms.c Mon Aug 19 20:39:15 2013 (r256164) +++ soc2013/ambarisha/head/usr.bin/dms/dms.c Mon Aug 19 20:41:32 2013 (r256165) @@ -14,45 +14,14 @@ #include "dm.h" #include "dms.h" +static int dm_err; +static char dm_errstr[512]; + int stop; struct dmjob *jobs; void *run_worker(struct dmjob *job); -static struct dmjob * -add_job(struct dmjob *head, struct dmjob *new) -{ - new->prev = NULL; - new->next = NULL; - - if (head == NULL) - return new; - - head->prev = new; - new->next = head; -} - -static struct dmjob * -rm_job(struct dmjob *head, struct dmjob *job) -{ - if (head == NULL) - return NULL; - - if (job == NULL) - return head; - - if (job->next != NULL) - job->next->prev = job->prev; - - if (job->prev != NULL) - job->prev->next = job->next; - - if (job == head) - return job->next; - - return head; -} - static int read_fd(int sock) { @@ -79,19 +48,34 @@ msg.msg_iov = iov; msg.msg_iovlen = 1; - if ( (n = recvmsg(sock, &msg, 0)) <= 0) - return (n); + if ( (n = recvmsg(sock, &msg, 0)) <= 0) { + strcpy(dm_errstr, "Couldn't recieve output file descriptor"); + fprintf(stderr, "read_fd: recvmsg: %s\n", strerror(errno)); + return -1; + } if ( (cmptr = CMSG_FIRSTHDR(&msg)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) { - if (cmptr->cmsg_level != SOL_SOCKET) - /* ERROR : control level != SOL_SOCKET */; + if (cmptr->cmsg_level != SOL_SOCKET) { + strcpy(dm_errstr, "Couldn't recieve" + "output file descriptor"); + fprintf(stderr, "read_fd: recvmsg:" + "control level != SOL_SOCKET\n"); + return -1; + } - if (cmptr->cmsg_type != SCM_RIGHTS) - /* ERROR : control type != SCM_RIGHTS */; + if (cmptr->cmsg_type != SCM_RIGHTS) { + strcpy(dm_errstr, "Couldn't recieve" + "output file descriptor"); + fprintf(stderr, "read_fd: recvmsg:" + "control type != SCM_RIGHTS\n"); + return -1; + } newfd = *((int *) CMSG_DATA(cmptr)); } else { + strcpy(dm_errstr, "Couldn't recieve output file descriptor"); + fprintf(stderr, "read_fd: Invalid control message header\n"); newfd = -1; } @@ -99,16 +83,50 @@ } static struct dmjob * +add_job(struct dmjob *head, struct dmjob *new) +{ + new->prev = NULL; + new->next = NULL; + + if (head == NULL) + return new; + + head->prev = new; + new->next = head; +} + +static struct dmjob * +rm_job(struct dmjob *head, struct dmjob *job) +{ + if (job->next != NULL) + job->next->prev = job->prev; + + if (job->prev != NULL) + job->prev->next = job->next; + + if (job == head) + return job->next; + + return head; +} + +static struct dmjob * mk_dmjob(struct dmreq *dmreq, int client) { - struct dmjob *dmjob = (struct dmjob *) Malloc(sizeof(struct dmjob)); + struct dmjob *dmjob = (struct dmjob *) malloc(sizeof(struct dmjob)); + if (dmjob == NULL) { + fprintf(stderr, "mk_dmjob: malloc: insufficient memory\n"); + strcpy(dm_errstr, "Insufficient memory\n"); + } + dmjob->request = dmreq; + dmjob->ofd = read_fd(client); if (dmjob->ofd == -1) { - /* Handle error */ free(dmjob); return NULL; } + dmjob->client = client; dmjob->sigint = 0; dmjob->sigalrm = 0; @@ -124,9 +142,13 @@ { int i = 0; - struct dmreq *dmreq = (struct dmreq *) Malloc(sizeof(struct dmreq)); - if (dmreq == NULL) + struct dmreq *dmreq = (struct dmreq *) malloc(sizeof(struct dmreq)); + if (dmreq == NULL) { + fprintf(stderr, "mk_dmreq: malloc: insufficient memory\n"); + strcpy(dm_errstr, "Insufficient memory"); return NULL; + } + memcpy(&(dmreq->v_level), rcvbuf + i, sizeof(dmreq->v_level)); i += sizeof(dmreq->v_level); @@ -152,17 +174,38 @@ i += sizeof(dmreq->flags); int sz = strlen(rcvbuf+i); - dmreq->i_filename = (char *) Malloc(sz); + dmreq->i_filename = (char *) malloc(sz); + if (dmreq->i_filename == NULL) { + fprintf(stderr, "mk_dmreq: malloc: insufficient memory\n"); + strcpy(dm_errstr, "Insufficient memory"); + free(dmreq); + return NULL; + } strcpy(dmreq->i_filename, rcvbuf+i); i += sz + 1; sz = strlen(rcvbuf+i); - dmreq->URL = (char *) Malloc(sz); + dmreq->URL = (char *) malloc(sz); + if (dmreq->URL == NULL) { + fprintf(stderr, "mk_dmreq: malloc: insufficient memory\n"); + strcpy(dm_errstr, "Insufficient memory"); + free(dmreq->i_filename); + free(dmreq); + return NULL; + } strcpy(dmreq->URL, rcvbuf+i); i += sz + 1; sz = strlen(rcvbuf+i); - dmreq->path = (char *) Malloc(sz); + dmreq->path = (char *) malloc(sz); + if (dmreq->path == NULL) { + fprintf(stderr, "mk_dmreq: malloc: insufficient memory\n"); + strcpy(dm_errstr, "Insufficient memory"); + free(dmreq->i_filename); + free(dmreq->URL); + free(dmreq); + return NULL; + } strcpy(dmreq->path, rcvbuf+i); i += sz + 1; @@ -172,6 +215,9 @@ static void rm_dmreq(struct dmreq **dmreq) { + if (*dmreq == NULL) + return; + free((*dmreq)->i_filename); free((*dmreq)->URL); free((*dmreq)->path); @@ -179,40 +225,62 @@ *dmreq = NULL; } +static void +rm_dmjob(struct dmjob **dmjob) +{ + if (*dmjob == NULL) + return; + rm_dmreq(&((*dmjob)->request)); + free((*dmjob)->url); +} + static int handle_request(int csock) { struct dmreq *dmreq; struct dmmsg *msg; struct dmjob *dmjob; + struct dmrep report; int ret; pid_t pid; - msg = recv_msg(csock); + msg = recv_dmmsg(csock); if (msg == NULL) { - /* set dms_error */ + report.status = -1; + report.errcode = FETCH_UNKNOWN; + report.errstr = dm_errstr; + send_report(csock, report); return -1; } switch (msg->op) { case DMREQ: - dmreq = mk_dmreq(msg->buf, msg->len); - dmjob = mk_dmjob(dmreq, csock); + if ((dmreq = mk_dmreq(msg->buf, msg->len)) == NULL) + goto error; + + if ((dmjob = mk_dmjob(dmreq, csock)) == NULL) + goto error; + jobs = add_job(jobs, dmjob); pthread_create(&(dmjob->worker), NULL, run_worker, dmjob); pthread_detach(dmjob->worker); - break; + goto done; default: + free_dmmsg(&msg); goto error; - break; } -success: - ret = 0; - goto done; + error: + report.status = -1; + report.errcode = FETCH_UNKNOWN; + report.errstr = dm_errstr; + send_report(csock, report); + + rm_dmreq(&dmreq); + rm_dmjob(&dmjob); ret = -1; done: - free_msg(&msg); + free_dmmsg(&msg); return ret; } @@ -238,6 +306,7 @@ run_event_loop(int socket) { int i, ret, maxfd = socket; + state_t state; struct dmjob *cur; void *retptr; jobs = NULL; @@ -259,14 +328,20 @@ cur = cur->next; } - Select(maxfd + 1, &fdset, NULL, NULL, NULL); + ret = select(maxfd + 1, &fdset, NULL, NULL, NULL); + if (ret == -1) { + fprintf(stderr, "run_event_loop: " + "select: %s\n", strerror(errno)); + goto wrap_up; + } cur = jobs; while (cur != NULL) { - ret = service_job(cur, &fdset); - if (ret == DONE) { + state = service_job(cur, &fdset); + if (state == DONE) { close(cur->client); jobs = rm_job(jobs, cur); + rm_dmjob(&cur); } cur = cur->next; } @@ -274,12 +349,18 @@ if (FD_ISSET(socket, &fdset)) { struct sockaddr_un cliaddr; size_t cliaddrlen = sizeof(cliaddr); - int csock = Accept(socket, (struct sockaddr *) &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); } } +wrap_up: /* Notify all running workers that we've to wrap up */ cur = jobs; while (cur != NULL) { @@ -294,13 +375,30 @@ int main(int argc, char **argv) { - int sock = Socket(AF_UNIX, SOCK_STREAM, 0); + int sock, err; + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock == -1) { + fprintf(stderr, "main: socket: %s\n", strerror(errno)); + exit(1); + } + struct sockaddr_un sunaddr; sunaddr.sun_family = AF_UNIX; strcpy(sunaddr.sun_path, DMS_UDS_PATH); - int err = Bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)); - err = Listen(sock, MAX_LISTEN_QUEUE); + err = bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)); + if (err == -1) { + fprintf(stderr, "main: bind: %s\n", strerror(errno)); + close(sock); + exit(1); + } + + err = listen(sock, MAX_LISTEN_QUEUE); + if (err == -1) { + fprintf(stderr, "main: listen: %s\n", strerror(errno)); + close(sock); + exit(1); + } run_event_loop(sock); Modified: soc2013/ambarisha/head/usr.bin/dms/utils.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/utils.c Mon Aug 19 20:39:15 2013 (r256164) +++ soc2013/ambarisha/head/usr.bin/dms/utils.c Mon Aug 19 20:41:32 2013 (r256165) @@ -4,165 +4,22 @@ #include "dm.h" -void * -Malloc(size_t size) -{ - void *ptr = malloc(size); - if (ptr == NULL) { - perror("Malloc():"); - /* Notifiy ENOMEM and exit gracefully */ - } - return ptr; -} - -ssize_t -Read(int fd, void *buf, size_t size) -{ - ssize_t err = read(fd, buf, size); - if (err == -1) { - perror("Read(): "); - } else if (err != size) { - printf("Warning: %d bytes received %d expected", err, size); - } else { - printf("Read() : Success\n"); - } - - return err; -} - -int -Socket(int domain, int type, int flags) -{ - int err = socket(domain, type, flags); - if (err == -1) { - perror("Socket():"); - } else { - printf("Socket(): Success\n"); - } - - return err; -} - -int -Write(int fd, void *buf, size_t size) -{ - int err = write(fd, buf, size); - if (err == -1) { - perror("Write():"); - } else { - printf("Write(): Success\n"); - } - return err; -} - -int -Socketpair(int domain, int type, int protocol, int socket_vector[2]) -{ - int err = socketpair(domain, type, protocol, socket_vector); - if (err == -1) { - perror("Socketpair():"); - } else { - printf("Socketpair() : Success\n"); - } - return err; -} - -int -Bind(int socket, const struct sockaddr *addr, socklen_t addrlen) -{ - int err = bind(socket, addr, addrlen); - if (err == -1) { - perror("Bind():"); - } else { - printf("Bind() : Success\n"); - } - return err; -} - -int -Accept(int socket, struct sockaddr *addr, socklen_t *addrlen) -{ - int err = accept(socket, addr, addrlen); - if (err == -1) { - perror("Accept():"); - } else { - printf("Accept() : Success\n"); - } - return err; -} - -int -Connect(int socket, struct sockaddr *addr, socklen_t addrlen) -{ - int err = connect(socket, addr, addrlen); - if (err == -1) { - perror("Connect():"); - } else { - printf("Connect() : Success\n"); - } - return err; -} - -int -Listen(int socket, int backlog) -{ - int err = listen(socket, backlog); - if (err == -1) { - perror("Listen():"); - } else { - printf("Listen() : Success\n"); - } - return err; -} - -int -Peel(int sock, struct dmmsg *msg) -{ - int bufsize = 0; - int err; - err = Read(sock, &bufsize, sizeof(bufsize)); - if (err == 0) - return (err); - bufsize -= sizeof(bufsize); - - err = Read(sock, &(msg->op), sizeof(msg->op)); - if (err == 0) - return (err); - bufsize -= sizeof(msg->op); +/* Utils for handling messages */ - msg->buf = (char *) Malloc(bufsize); - msg->len = bufsize; - - err = Read(sock, msg->buf, bufsize); - if (err == 0) { - free(msg->buf); - msg->len = 0; - } - - return bufsize; -} - -int -Select(int maxfd, fd_set *rset, fd_set *wset, fd_set *xset, - const struct timeval *timeout) -{ - int err = select(maxfd, rset, wset, xset, timeout); - if (err == -1) { - perror("Select():"); - } else { - printf("Select(): Success\n"); - } - return err; -} +extern char *dm_errstr; int -send_msg(int socket, struct dmmsg msg) +send_dmmsg(int socket, struct dmmsg msg) { int bufsize = sizeof(bufsize); // Buffer size bufsize += 1; // Op bufsize += msg.len; // Signal number - char *sndbuf = (char *) Malloc(bufsize); + char *sndbuf = (char *) malloc(bufsize); + if (sndbuf == NULL) { + fprintf(stderr, "send_dmmsg: malloc: insufficient memory\n"); + return -1; + } int i = 0; memcpy(sndbuf + i, &bufsize, sizeof(bufsize)); @@ -174,64 +31,87 @@ memcpy(sndbuf + i, msg.buf, msg.len); i += msg.len; - int nbytes = Write(socket, sndbuf, bufsize); + int nbytes = write(socket, sndbuf, bufsize); free(sndbuf); + + if (nbytes == -1) { + fprintf(stderr, "send_dmmsg: write: %s\n", + strerror(errno)); + } return (nbytes); } struct dmmsg * -recv_msg(int sock) +recv_dmmsg(int sock) { int bufsize = 0; int err; - struct dmmsg *msg = (struct dmmsg *) Malloc(sizeof(struct dmmsg)); - err = Read(sock, &bufsize, sizeof(bufsize)); + struct dmmsg *msg = (struct dmmsg *) malloc(sizeof(struct dmmsg)); + if (msg == NULL) { + fprintf(stderr, "send_dmmsg: malloc: insufficient memory\n"); + return -1; + } + + err = read(sock, &bufsize, sizeof(bufsize)); if (err == 0) { - /* set dms_error */ -#if DEBUG - fprintf(stderr, "recv_msg: remote end closed connection\n"); -#endif - free(msg); - return (NULL); + fprintf(stderr, "recv_dmmsg: remote end" + " closed connection\n"); + goto error; + } else if (err == -1) { + fprintf(stderr, "recv_dmmsg: %s\n", strerror(errno)); + goto error; } bufsize -= sizeof(bufsize); - err = Read(sock, &(msg->op), sizeof(msg->op)); + err = read(sock, &(msg->op), sizeof(msg->op)); if (err == 0) { - /* set dms_error */ -#if DEBUG - fprintf(stderr, "recv_msg: remote end closed connection\n"); -#endif - free(msg); - return (NULL); + fprintf(stderr,stderr, "recv_dmmsg: remote end" + " closed connection\n"); + goto error; + } else if (err == -1) { + fprintf(stderr, "recv_dmmsg: %s\n", strerror(errno)); + goto error; } + bufsize -= sizeof(msg->op); - msg->buf = (char *) Malloc(bufsize); + msg->buf = (char *) malloc(bufsize); + if (msg == NULL) { + fprintf(stderr, "send_dmmsg: malloc: insufficient memory\n"); + goto error; + } + msg->len = bufsize; - err = Read(sock, msg->buf, bufsize); + err = read(sock, msg->buf, bufsize); if (err == 0) { - free(msg->buf); msg->len = 0; - /* set dms_error */ -#if DEBUG - fprintf(stderr, "recv_msg: remote end closed connection\n"); -#endif + fprintf(stderr,stderr, "recv_dmmsg: remote end" + " closed connection\n"); + free(msg->buf); free(msg); return (NULL); + } else if (err == -1) { + fprintf(stderr, "recv_dmmsg: %s\n", strerror(errno)); + free(msg->buf); + goto error; } + return msg; +error: + free(msg); + return NULL; } void -free_msg(struct dmmsg **msg) +free_dmmsg(struct dmmsg **msg) { - + if (*msg == NULL) + return; free((*msg)->buf); free(*msg); *msg = NULL; Modified: soc2013/ambarisha/head/usr.bin/dms/worker.c ============================================================================== --- soc2013/ambarisha/head/usr.bin/dms/worker.c Mon Aug 19 20:39:15 2013 (r256164) +++ soc2013/ambarisha/head/usr.bin/dms/worker.c Mon Aug 19 20:41:32 2013 (r256165) @@ -13,6 +13,7 @@ #include "dm.h" +static const char *prefixes = " kMGTP"; extern struct dmjob *jobs; #define TMP_EXT ".tmp" @@ -23,6 +24,7 @@ struct dmmsg msg; struct dmjob *cur = jobs; while (cur != NULL) { + /* TODO: May be a more thorough comparison? */ if (cur->url == url) break; cur = cur->next; @@ -36,7 +38,11 @@ hlen = strlen(url->host) + 1; bufsize += schlen + hlen + sizeof(url->port); - msg.buf = (char *) Malloc(bufsize); + msg.buf = (char *) malloc(bufsize); + if (msg.buf == NULL) { + fprintf(stderr, "fetch: authenticate: Insufficient memory\n"); + return -1; + } strcpy(msg.buf, url->scheme); i += schlen; @@ -48,14 +54,24 @@ msg.op = DMAUTHREQ; msg.len = bufsize; - send_msg(cur->client, msg); + ret = send_dmmsg(cur->client, msg); + if (ret == -1) { + free(msg.buf); + return -1; + } struct dmmsg *rcvmsg; - rcvmsg = recv_msg(cur->client); + rcvmsg = recv_dmmsg(cur->client); + if (rcvmsg == NULL) { + free(msg.buf); + return -1; + } strncpy(url->user, rcvmsg->buf, sizeof(url->user)); strncpy(url->pwd, rcvmsg->buf + strlen(rcvmsg->buf) + 1, sizeof(url->pwd)); - free_msg(&rcvmsg); + free_dmmsg(&rcvmsg); + + return 1; // TODO: Verify this } static int @@ -67,7 +83,12 @@ static void stat_send(int csock, struct xferstat *xs, int force) { - char *buf = (char *) Malloc(sizeof(struct xferstat) + sizeof(force)); + char *buf = (char *) malloc(sizeof(struct xferstat) + sizeof(force)); + if (buf == NULL) { + fprintf(stderr, "stat_send: Insufficient memory\n"); + return; + } + *((int *) buf) = force; memcpy(buf + sizeof(force), xs, sizeof(struct xferstat)); @@ -76,13 +97,11 @@ msg.op = DMSTAT; msg.buf = buf; msg.len = sizeof(*xs) + sizeof(force); - send_msg(csock, msg); - - free(msg.buf); + send_dmmsg(csock, msg); + free(buf); return; } -static const char *prefixes = " kMGTP"; static const char * stat_bytes(off_t bytes) { @@ -171,7 +190,7 @@ /* parse URL */ if (*dmreq->URL == '\0') { - warnx("empty URL"); + fprintf(stderr, "warning: mk_url: URL empty\n"); goto failure; } if ((dmjob->url = fetchParseURL(dmreq->URL)) == NULL) { @@ -230,6 +249,7 @@ /* set the protocol timeout. */ fetchTimeout = dmjob->timeout; + r = 0; goto success; signal: @@ -238,6 +258,7 @@ free(dmjob->url->doc); free(dmjob->url); dmjob->url = NULL; + r = -1; success: return (r); } @@ -266,6 +287,8 @@ count = 0; r = mk_url(dmjob, flags); + if (r == -1) + return -1; /* Initialize signal flags */ dmjob->sigint = 0; @@ -476,7 +499,7 @@ if (dmreq->B_size < MINBUFSIZE) dmreq->B_size = MINBUFSIZE; - buf = (char *) Malloc(dmreq->B_size); + buf = (char *) malloc(dmreq->B_size); /* suck in the data */ dmjob->siginfo_en = 1; @@ -634,16 +657,29 @@ tmpreq.flags = dmjob->request->flags; tmpreq.family = dmjob->request->family; - tmpreq.i_filename = (char *) Malloc(strlen(dmreq->i_filename)); + tmpreq.i_filename = (char *) malloc(strlen(dmreq->i_filename)); + if (tmpreq.i_filename == NULL) { + fprintf(stderr, "dmXGet: Insufficient memory\n"); + return NULL; + } + strcpy(tmpreq.i_filename, dmreq->i_filename); - tmpreq.URL = (char *) Malloc(strlen(dmreq->URL)); + tmpreq.URL = (char *) malloc(strlen(dmreq->URL)); + if (tmpreq.URL == NULL) { + fprintf(stderr, "dmXGet: Insufficient memory\n"); + free(tmpreq.i_filename); + return NULL; + } + strcpy(tmpreq.URL, dmreq->URL); tmpjob.url = NULL; ret = mk_url(&tmpjob, flags); - if (ret <= 0) { - + if (ret == -1) { + free(tmpreq.i_filename); + free(tmpreq.URL); + return NULL; } /* special case : -s flag @@ -666,7 +702,14 @@ goto success; } */ - tmpreq.path = (char *) Malloc(strlen(dmreq->path) + strlen(TMP_EXT)); + tmpreq.path = (char *) malloc(strlen(dmreq->path) + strlen(TMP_EXT)); + if (tmpreq.path == NULL) { + fprintf(stderr, "dmXGet: Insufficient memory\n"); + free(tmpreq.i_filename); + free(tmpreq.path); + free(tmpreq.URL); + return NULL; + } strcpy(tmpreq.path, dmreq->path); strcat(tmpreq.path, TMP_EXT); @@ -687,35 +730,6 @@ return f; } -static void -send_report(int sock, struct dmrep report, char op) -{ - char *buf; - int bufsize = sizeof(report) - sizeof(report.errstr); - int errlen = strlen(report.errstr); - bufsize += errlen; - - buf = (char *) Malloc(bufsize); - int i = 0; - - memcpy(buf + i, &(report.status), sizeof(report.status)); - i += sizeof(report.status); - - memcpy(buf + i, &(report.errcode), sizeof(report.errcode)); - i += sizeof(report.errcode); - - strcpy(buf + i, report.errstr); - i += errlen; - - struct dmmsg msg; - msg.op = op; - msg.buf = buf; - msg.len = bufsize; - send_msg(sock, msg); - - free(buf); -} - /* TODO: This handler isn't registered as SIGUSR1 interrupts the download * Figure out a proper way to handle this * */ @@ -733,7 +747,7 @@ tmp = tmp->next; } - msg = recv_msg(tmp->client); + msg = recv_dmmsg(tmp->client); clisig = msg->buf; if (*clisig == SIGINT) tmp->sigint = 1; @@ -745,19 +759,52 @@ } } +int +send_report(int sock, struct dmrep report) +{ + char *buf; + int i = 0; + int bufsize = sizeof(report) - sizeof(report.errstr); + int errlen = strlen(report.errstr); + + bufsize += errlen; + buf = (char *) malloc(bufsize); + if (buf == NULL) { + fprintf(stderr, "send_report: Insufficient memory\n"); + return -1; + } + + memcpy(buf + i, &(report.status), sizeof(report.status)); + i += sizeof(report.status); + + memcpy(buf + i, &(report.errcode), sizeof(report.errcode)); + i += sizeof(report.errcode); + + strcpy(buf + i, report.errstr); + i += errlen; + + struct dmmsg msg; + msg.op = DMRESP; + msg.buf = buf; + msg.len = bufsize; + send_dmmsg(sock, msg); + + free(buf); +} + void * run_worker(struct dmjob *dmjob) { struct dmrep report; struct dmjob *tmp; struct url_stat us; - int err; + int ret; FILE *f; char *tmppath; char flags[8]; /* check if this is a duplicate */ - mk_url(dmjob, flags); + ret = mk_url(dmjob, flags); tmp = jobs; while (tmp != NULL) { if (tmp != dmjob && compare_jobs(tmp, dmjob) == 0) { @@ -780,23 +827,24 @@ } if (f == NULL) { - err = -1; + ret = -1; } else { fseek(f, 0, SEEK_SET); - err = fetch(dmjob, f, us); + ret = fetch(dmjob, f, us); } - report.status = err; + report.status = ret; report.errcode = fetchLastErrCode; report.errstr = fetchLastErrString; - send_report(dmjob->client, report, DMRESP); + send_report(dmjob->client, report); tmp->state = DONE; tmp = tmp->next; } + /* remove the local tmp file */ if (f != NULL) { - tmppath = (char *) Malloc(strlen(dmjob->request->path) + strlen(TMP_EXT)); + tmppath = (char *) malloc(strlen(dmjob->request->path) + strlen(TMP_EXT)); strcpy(tmppath, dmjob->request->path); strcat(tmppath, TMP_EXT);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308192041.r7JKfWKa027484>