socsvn commit: r256167 - soc2013/ambarisha/head/usr.bin/dmget

ambarisha at FreeBSD.org ambarisha at FreeBSD.org
Mon Aug 19 20:45:06 UTC 2013


Author: ambarisha
Date: Mon Aug 19 20:45:05 2013
New Revision: 256167
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256167

Log:
  Cleaner error reporting in client (dmget)
  

Modified:
  soc2013/ambarisha/head/usr.bin/dmget/dmget.c
  soc2013/ambarisha/head/usr.bin/dmget/utils.c

Modified: soc2013/ambarisha/head/usr.bin/dmget/dmget.c
==============================================================================
--- soc2013/ambarisha/head/usr.bin/dmget/dmget.c	Mon Aug 19 20:44:02 2013	(r256166)
+++ soc2013/ambarisha/head/usr.bin/dmget/dmget.c	Mon Aug 19 20:45:05 2013	(r256167)
@@ -25,17 +25,7 @@
 static int 	 siginfo;
 
 static int 	 dmg_error;
-static char	*dmg_errstr;
-
-static void *
-Malloc(size_t size)
-{
-	void *ptr = malloc(size);
-	if (ptr == NULL) {
-		/* Notifiy ENOMEM and exit gracefully */
-	}
-	return ptr;
-}
+static char	 dmg_errstr[512];
 
 void dmSigHandler(int signal)
 {
@@ -59,7 +49,12 @@
 	sigaddset(&sm, SIGINFO);
 
 	sigprocmask(SIG_BLOCK, &sm, NULL);
-	ret = Write(sock, buf, bufsize);
+	ret = write(sock, buf, bufsize);
+	if (ret == -1) {
+		fprintf(stderr, "dmget: Write failed (%s)\n", strerror(errno));
+		strcpy(dmg_errstr, "Write failed - ");
+		strcat(dmg_errstr, strerror(errno));
+	}
 	sigprocmask(SIG_UNBLOCK, &sm, NULL);
 
 	return ret;
@@ -73,18 +68,18 @@
 	/* If the first read was an error return 
 	 * because that could be because of a signal
 	 * */
-	ret = Read(sock, buf, bufsize);
-	if (ret == -1 || ret == 0) 
+	ret = read(sock, buf, bufsize);
+	if (ret == -1 || ret == 0) {
+		fprintf(stderr, "dmget: read failed (%s)\n", strerror(errno));
 		return ret;
-		
+	}
+
 	/* But if we've already started reading, we keep reading */
 	while ((ret == -1 && errno == EINTR) || n > 0 && n < bufsize) {
 		ret = read(sock, buf + n, bufsize - n);	
 		if (ret == 0) {
-			/* Read ended prematurely
-			 * Set dmg_error appropriately and return
-			 */
-
+			fprintf(stderr, "dmget: Remote end closed connection\n");
+			strcpy(dmg_errstr, "Remote end closed connection");
 			break;
 		}
 		
@@ -94,6 +89,7 @@
 
 	if (ret != -1)
 		return(n);
+
 	return(ret);
 }
 
@@ -109,7 +105,12 @@
 	bufsize += strlen(dmreq.URL) + 1;
 	bufsize += strlen(dmreq.path) + 1;
 
-	*reqbuf = (char *) Malloc(bufsize);
+	*reqbuf = (char *) malloc(bufsize);
+	if (*reqbuf == NULL) {
+		fprintf(stderr, "dmget: Insufficient memory");
+		strcpy(dmg_errstr, "Insufficient memory");
+		return -1;
+	}
 	
 	memcpy(*reqbuf, &bufsize, sizeof(bufsize));
 	i += sizeof(bufsize);
@@ -159,7 +160,11 @@
 	int i = 0, len;
 	struct dmres *dmres;
 
-	dmres = (struct dmres*) Malloc(sizeof(struct dmres));
+	dmres = (struct dmres*) malloc(sizeof(struct dmres));
+	if (dmres == NULL) {
+		fprintf(stderr, "dmget: mk_dmres: Insufficient memory\n");
+		return NULL;
+	}
 
 	memcpy(&(dmres->status), buf + i, sizeof(dmres->status));
 	i += sizeof(dmres->status);
@@ -168,7 +173,12 @@
 	i += sizeof(dmres->errcode);
 
 	len = strlen(buf + i);
-	dmres->errstr = (char *) Malloc(len);
+	dmres->errstr = (char *) malloc(len);
+	if (dmres->errstr == NULL) {
+		fprintf(stderr, "dmget: mk_dmres: Insufficient memory\n");
+		free(dmres);
+		return NULL;
+	}
 	strcpy(dmres->errstr, buf + i);
 
 	return dmres;
@@ -189,7 +199,7 @@
 	msg.op = DMSIG;
 	msg.buf = &signal;
 	msg.len = sizeof(signal);
-	return (send_msg(sock, msg));
+	return (send_dmmsg(sock, msg));
 }
 
 static int
@@ -221,57 +231,73 @@
 	*((int *) CMSG_DATA(cmptr)) = fd;
 
 	ret = sendmsg(sock, &msg, 0);
-	if (ret == -1)
+	if (ret == -1) {
+		fprintf(stderr, "dmget: Sending local file fd to daemon failed\n");
 		return (-1);
-	else
-		return (0);
-}
+	} 
 
-static int
-Write_fd(int sock, int fd)
-{
-	int ret = write_fd(sock, fd);
-	if (ret == -1) {
-		perror("Write_fd():");
-	} else {
-		printf("Write_fd(): Success\n");
-	}
+	return (0);
 }
 
 static int
 send_request(int sock, struct dmreq dmreq)
 {
 	char *reqbuf;
-	int bufsize, err, fd;
+	int bufsize, ret, fd;
 
 	bufsize = mk_reqbuf(dmreq, &reqbuf, DMREQ);
-	err = sigsafe_write(sock, reqbuf, bufsize);
+	if (bufsize == -1)
+		return -1;
+
+	ret = sigsafe_write(sock, reqbuf, bufsize);
+	free(reqbuf);
+
+	if (ret == -1)
+		return -1;
 
 	if (dmreq.flags & O_STDOUT)
 		fd = STDOUT_FILENO;
 	else
 		fd = open(dmreq.path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
 
-	Write_fd(sock, fd);
-	close(fd);	
+	ret = write_fd(sock, fd);
 
-	free(reqbuf);
-	return(err);
+	if (!(dmreq.flags & O_STDOUT))
+		close(fd);	
+
+	return(ret);
 }
 
 struct dmauth *
 mk_dmauth(char *buf, int bufsize)
 {
 	int i = 0, len;
-	struct dmauth *dmauth = (struct dmauth *) Malloc(sizeof(struct dmauth));
+	struct dmauth *dmauth = (struct dmauth *) malloc(sizeof(struct dmauth));
+	if (dmauth == NULL) {
+		fprintf(stderr, "dmget: mk_dmauth: Insufficient memory\n");
+		return NULL;
+	}
 
 	len = strlen(buf + i);	
-	dmauth->scheme = (char *) Malloc(len + 1);
+	dmauth->scheme = (char *) malloc(len + 1);
+	if (dmauth->scheme == NULL) {
+		fprintf(stderr, "dmget: mk_dmauth: Insufficient memory\n");
+		free(dmauth);
+		return NULL;
+	}
+
 	strncpy(dmauth->scheme, buf + i, len);
 	i += len + 1;
 
 	len = strlen(buf + i);
-	dmauth->host = (char *) Malloc(len + 1);
+	dmauth->host = (char *) malloc(len + 1);
+	if (dmauth->host == NULL) {
+		fprintf(stderr, "dmget: mk_dmauth: Insufficient memory\n");
+		free(dmauth->scheme);
+		free(dmauth);
+		return NULL;
+	}
+
 	strncpy(dmauth->host, buf + i, len);
 	i += len + 1;
 
@@ -293,18 +319,26 @@
 static int
 send_dmauth(int sock, struct dmauth *dmauth)
 {
-	int ulen = strlen(dmauth->user) + 1;
-	int bufsize = ulen + strlen(dmauth->pwd) + 1;
-	char *buf = (char *) Malloc(bufsize);
+	int ret, ulen, bufsize;
+	char *buf;
+	struct dmmsg msg;
+	
+	ulen = strlen(dmauth->user) + 1;
+	bufsize = ulen + strlen(dmauth->pwd) + 1;
 
+	buf = (char *) malloc(bufsize);
+	if (buf == NULL) {
+		fprintf(stderr, "dmget: send_dmauth: Insufficient memory\n");
+		return -1;
+	}
 	strcpy(buf, dmauth->user);
 	strcpy(buf + ulen, dmauth->user);
 
-	struct dmmsg msg;
 	msg.op = DMAUTHRESP;
 	msg.buf = buf;
 	msg.len = bufsize;
-	send_msg(sock, msg);
+	ret = send_dmmsg(sock, msg);
+	return (ret);	
 }
 
 int
@@ -315,20 +349,33 @@
 	struct dmres *dmres;
 	struct xferstat xs;
 	struct dmauth *dmauth;
-	sock = Socket(AF_UNIX, SOCK_STREAM, 0);
+
+	sock = socket(AF_UNIX, SOCK_STREAM, 0);
+	if (sock == -1) {
+		fprintf(stderr, "dmget: Could not create socket"
+				" (%s)\n", strerror(errno));
+		return -1;
+	}
 
 	dms_addr.sun_family = AF_UNIX;
 	strncpy(dms_addr.sun_path, DMS_UDS_PATH, sizeof(dms_addr.sun_path));
-	err = Connect(sock, (struct sockaddr *) &dms_addr, sizeof(dms_addr));
+	ret = connect(sock, (struct sockaddr *) &dms_addr, sizeof(dms_addr));
+	if (ret == -1) {
+		fprintf(stderr, "dmget: Could not connect to daemon"
+				" (%s)\n", strerror(errno));
+		return -1;
+	}
 
 	if (siginfo || sigint) 
 		goto signal;
 
-	send_request(sock, dmreq);
+	ret = send_request(sock, dmreq);
+	if (ret == -1)
+		return -1;
 
 	while (!sigint) {
 		struct dmmsg *msg;
-		msg = recv_msg(sock);				
+		msg = recv_dmmsg(sock);				
 		if (msg == NULL) {
 			goto failure;
 		}
@@ -341,7 +388,7 @@
 		switch(msg->op) {
 		case DMRESP:
 			dmres = mk_dmres(msg->buf, msg->len);
-			free_msg(&msg);
+			free_dmmsg(&msg);
 			if (dmres->status == 0){
 				/* set dmLastErr* */
 				rm_dmres(&dmres);
@@ -353,16 +400,23 @@
 		case DMSTAT:
 			force = *((int *)(msg->buf));
 			memcpy(&xs, (msg->buf) + sizeof(force), sizeof(xs));
-			free_msg(&msg);
+			free_dmmsg(&msg);
 			dmStatDisplayMethod(&xs, force);
 			break;
 		case DMAUTHREQ:
 			dmauth = mk_dmauth(msg->buf, msg->len);
-			if (dmAuthMethod(dmauth) == -1) {
-				
+			ret = dmAuthMethod(dmauth);
+			if (ret == -1) {
+				fprintf(stderr, "dmget: Authentication failed\n");
+				strcpy(dmauth->user, "");
+				strcpy(dmauth->pwd, "");
 			}
+
 			send_dmauth(sock, dmauth);
 			rm_dmauth(&dmauth);
+
+			if (ret == -1)
+				goto failure;
 			break;
 		default:
 			break;

Modified: soc2013/ambarisha/head/usr.bin/dmget/utils.c
==============================================================================
--- soc2013/ambarisha/head/usr.bin/dmget/utils.c	Mon Aug 19 20:44:02 2013	(r256166)
+++ soc2013/ambarisha/head/usr.bin/dmget/utils.c	Mon Aug 19 20:45:05 2013	(r256167)
@@ -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;


More information about the svn-soc-all mailing list