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