socsvn commit: r256165 - soc2013/ambarisha/head/usr.bin/dms
ambarisha at FreeBSD.org
ambarisha at FreeBSD.org
Mon Aug 19 20:41:32 UTC 2013
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);
More information about the svn-soc-all
mailing list