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