PFS: UDS code cleanup:

- coalesce lots of duplicate code
- avoid using errno as much as possible
- fix bugs in some error handling cases
This commit is contained in:
David van Moolenbroek 2011-03-25 10:52:53 +00:00
parent 7a9e3651fd
commit 14e641cb8c
2 changed files with 128 additions and 610 deletions

View file

@ -190,8 +190,8 @@ PUBLIC int uds_open(message *dev_m_in, message *dev_m_out)
/* likely error: get_block() failed */ /* likely error: get_block() failed */
uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT, uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT,
(cp_grant_id_t) dev_m_in->IO_GRANT, errno); (cp_grant_id_t) dev_m_in->IO_GRANT, rc);
return errno; return rc;
} }
/* Process the response */ /* Process the response */
@ -375,8 +375,7 @@ PRIVATE int uds_perform_read(int minor, endpoint_t m_source,
if (!(uds_fd_table[minor].mode & S_IRUSR)) { if (!(uds_fd_table[minor].mode & S_IRUSR)) {
/* socket is shutdown for reading */ /* socket is shutdown for reading */
errno = EPIPE; return EPIPE;
return -1;
} }
if (uds_fd_table[minor].size == 0) { if (uds_fd_table[minor].size == 0) {
@ -509,15 +508,13 @@ PRIVATE int uds_perform_write(int minor, endpoint_t m_source,
if (!(uds_fd_table[minor].mode & S_IWUSR)) { if (!(uds_fd_table[minor].mode & S_IWUSR)) {
/* socket is shutdown for writing */ /* socket is shutdown for writing */
errno = EPIPE; return EPIPE;
return -1;
} }
if (size > PIPE_BUF) { if (size > PIPE_BUF) {
/* message is too big to ever write to the PIPE */ /* message is too big to ever write to the PIPE */
errno = EMSGSIZE; return EMSGSIZE;
return -1;
} }
if (uds_fd_table[minor].type == SOCK_STREAM || if (uds_fd_table[minor].type == SOCK_STREAM ||
@ -530,12 +527,10 @@ PRIVATE int uds_perform_write(int minor, endpoint_t m_source,
if (uds_fd_table[minor].err == ECONNRESET) { if (uds_fd_table[minor].err == ECONNRESET) {
uds_fd_table[minor].err = 0; uds_fd_table[minor].err = 0;
errno = ECONNRESET; return ECONNRESET;
} else { } else {
errno = ENOTCONN; return ENOTCONN;
} }
return -1;
} else { } else {
peer = uds_fd_table[minor].peer; peer = uds_fd_table[minor].peer;
@ -562,8 +557,7 @@ PRIVATE int uds_perform_write(int minor, endpoint_t m_source,
} }
if (peer == -1) { if (peer == -1) {
errno = ENOENT; return ENOENT;
return -1;
} }
} }
@ -704,23 +698,12 @@ PUBLIC int uds_read(message *dev_m_in, message *dev_m_out)
bytes = uds_perform_read(minor, dev_m_in->m_source, bytes = uds_perform_read(minor, dev_m_in->m_source,
uds_fd_table[minor].io_gr_size, 0); uds_fd_table[minor].io_gr_size, 0);
if (bytes == -1) { uds_set_reply(dev_m_out, TASK_REPLY,
uds_fd_table[minor].endpoint,
uds_fd_table[minor].io_gr,
bytes);
uds_set_reply(dev_m_out, TASK_REPLY, return bytes;
uds_fd_table[minor].endpoint,
uds_fd_table[minor].io_gr,
errno);
return errno;
} else {
uds_set_reply(dev_m_out, TASK_REPLY,
uds_fd_table[minor].endpoint,
uds_fd_table[minor].io_gr,
bytes);
return bytes;
}
} }
PUBLIC int uds_write(message *dev_m_in, message *dev_m_out) PUBLIC int uds_write(message *dev_m_in, message *dev_m_out)
@ -767,29 +750,17 @@ PUBLIC int uds_write(message *dev_m_in, message *dev_m_out)
bytes = uds_perform_write(minor, dev_m_in->m_source, bytes = uds_perform_write(minor, dev_m_in->m_source,
uds_fd_table[minor].io_gr_size, 0); uds_fd_table[minor].io_gr_size, 0);
if (bytes == -1) { uds_set_reply(dev_m_out, TASK_REPLY,
uds_fd_table[minor].endpoint,
uds_fd_table[minor].io_gr,
bytes);
uds_set_reply(dev_m_out, TASK_REPLY, return bytes;
uds_fd_table[minor].endpoint,
uds_fd_table[minor].io_gr,
errno);
return errno;
} else {
uds_set_reply(dev_m_out, TASK_REPLY,
uds_fd_table[minor].endpoint,
uds_fd_table[minor].io_gr,
bytes);
return bytes;
}
} }
PUBLIC int uds_ioctl(message *dev_m_in, message *dev_m_out) PUBLIC int uds_ioctl(message *dev_m_in, message *dev_m_out)
{ {
int minor; int rc, minor;
#if DEBUG == 1 #if DEBUG == 1
static int call_count = 0; static int call_count = 0;
@ -828,103 +799,141 @@ PUBLIC int uds_ioctl(message *dev_m_in, message *dev_m_out)
case NWIOSUDSCONN: case NWIOSUDSCONN:
/* connect to a listening socket -- connect() */ /* connect to a listening socket -- connect() */
return do_connect(dev_m_in, dev_m_out); rc = do_connect(dev_m_in, dev_m_out);
break;
case NWIOSUDSACCEPT: case NWIOSUDSACCEPT:
/* accept an incoming connection -- accept() */ /* accept an incoming connection -- accept() */
return do_accept(dev_m_in, dev_m_out); rc = do_accept(dev_m_in, dev_m_out);
break;
case NWIOSUDSBLOG: case NWIOSUDSBLOG:
/* set the backlog_size and put the socket into the /* set the backlog_size and put the socket into the
* listening state -- listen() * listening state -- listen()
*/ */
return do_listen(dev_m_in, dev_m_out); rc = do_listen(dev_m_in, dev_m_out);
break;
case NWIOSUDSTYPE: case NWIOSUDSTYPE:
/* set the type for this socket (i.e. /* set the type for this socket (i.e.
* SOCK_STREAM, SOCK_DGRAM, etc) -- socket() * SOCK_STREAM, SOCK_DGRAM, etc) -- socket()
*/ */
return do_socket(dev_m_in, dev_m_out); rc = do_socket(dev_m_in, dev_m_out);
break;
case NWIOSUDSADDR: case NWIOSUDSADDR:
/* set the address for this socket -- bind() */ /* set the address for this socket -- bind() */
return do_bind(dev_m_in, dev_m_out); rc = do_bind(dev_m_in, dev_m_out);
break;
case NWIOGUDSADDR: case NWIOGUDSADDR:
/* get the address for this socket -- getsockname() */ /* get the address for this socket -- getsockname() */
return do_getsockname(dev_m_in, dev_m_out); rc = do_getsockname(dev_m_in, dev_m_out);
break;
case NWIOGUDSPADDR: case NWIOGUDSPADDR:
/* get the address for the peer -- getpeername() */ /* get the address for the peer -- getpeername() */
return do_getpeername(dev_m_in, dev_m_out); rc = do_getpeername(dev_m_in, dev_m_out);
break;
case NWIOSUDSSHUT: case NWIOSUDSSHUT:
/* shutdown a socket for reading, writing, or /* shutdown a socket for reading, writing, or
* both -- shutdown() * both -- shutdown()
*/ */
return do_shutdown(dev_m_in, dev_m_out); rc = do_shutdown(dev_m_in, dev_m_out);
break;
case NWIOSUDSPAIR: case NWIOSUDSPAIR:
/* connect two sockets -- socketpair() */ /* connect two sockets -- socketpair() */
return do_socketpair(dev_m_in, dev_m_out); rc = do_socketpair(dev_m_in, dev_m_out);
break;
case NWIOGUDSSOTYPE: case NWIOGUDSSOTYPE:
/* get socket type -- getsockopt(SO_TYPE) */ /* get socket type -- getsockopt(SO_TYPE) */
return do_getsockopt_sotype(dev_m_in, dev_m_out); rc = do_getsockopt_sotype(dev_m_in, dev_m_out);
break;
case NWIOGUDSPEERCRED: case NWIOGUDSPEERCRED:
/* get peer endpoint -- getsockopt(SO_PEERCRED) */ /* get peer endpoint -- getsockopt(SO_PEERCRED) */
return do_getsockopt_peercred(dev_m_in, dev_m_out); rc = do_getsockopt_peercred(dev_m_in, dev_m_out);
break;
case NWIOSUDSTADDR: case NWIOSUDSTADDR:
/* set target address -- sendto() */ /* set target address -- sendto() */
return do_sendto(dev_m_in, dev_m_out); rc = do_sendto(dev_m_in, dev_m_out);
break;
case NWIOGUDSFADDR: case NWIOGUDSFADDR:
/* get from address -- recvfrom() */ /* get from address -- recvfrom() */
return do_recvfrom(dev_m_in, dev_m_out); rc = do_recvfrom(dev_m_in, dev_m_out);
break;
case NWIOGUDSSNDBUF: case NWIOGUDSSNDBUF:
/* get the send buffer size -- getsockopt(SO_SNDBUF) */ /* get the send buffer size -- getsockopt(SO_SNDBUF) */
return do_getsockopt_sndbuf(dev_m_in, dev_m_out); rc = do_getsockopt_sndbuf(dev_m_in, dev_m_out);
break;
case NWIOSUDSSNDBUF: case NWIOSUDSSNDBUF:
/* set the send buffer size -- setsockopt(SO_SNDBUF) */ /* set the send buffer size -- setsockopt(SO_SNDBUF) */
return do_setsockopt_sndbuf(dev_m_in, dev_m_out); rc = do_setsockopt_sndbuf(dev_m_in, dev_m_out);
break;
case NWIOGUDSRCVBUF: case NWIOGUDSRCVBUF:
/* get the send buffer size -- getsockopt(SO_SNDBUF) */ /* get the send buffer size -- getsockopt(SO_SNDBUF) */
return do_getsockopt_rcvbuf(dev_m_in, dev_m_out); rc = do_getsockopt_rcvbuf(dev_m_in, dev_m_out);
break;
case NWIOSUDSRCVBUF: case NWIOSUDSRCVBUF:
/* set the send buffer size -- setsockopt(SO_SNDBUF) */ /* set the send buffer size -- setsockopt(SO_SNDBUF) */
return do_setsockopt_rcvbuf(dev_m_in, dev_m_out); rc = do_setsockopt_rcvbuf(dev_m_in, dev_m_out);
break;
case NWIOSUDSCTRL: case NWIOSUDSCTRL:
/* set the control data -- sendmsg() */ /* set the control data -- sendmsg() */
return do_sendmsg(dev_m_in, dev_m_out); rc = do_sendmsg(dev_m_in, dev_m_out);
break;
case NWIOGUDSCTRL: case NWIOGUDSCTRL:
/* set the control data -- recvmsg() */ /* set the control data -- recvmsg() */
return do_recvmsg(dev_m_in, dev_m_out); rc = do_recvmsg(dev_m_in, dev_m_out);
break;
default: default:
@ -934,14 +943,17 @@ PUBLIC int uds_ioctl(message *dev_m_in, message *dev_m_out)
* IOCTLs. Any not for us simply get a EBADIOCTL * IOCTLs. Any not for us simply get a EBADIOCTL
* response. * response.
*/ */
uds_fd_table[minor].syscall_done = 1;
uds_set_reply(dev_m_out, TASK_REPLY,
dev_m_in->IO_ENDPT,
(cp_grant_id_t) dev_m_in->IO_GRANT,
EBADIOCTL);
return EBADIOCTL; rc = EBADIOCTL;
} }
if (rc != SUSPEND)
uds_fd_table[minor].syscall_done = 1;
uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT,
(cp_grant_id_t) dev_m_in->IO_GRANT, rc);
return rc;
} }
PUBLIC int uds_status(message *dev_m_in, message *dev_m_out) PUBLIC int uds_status(message *dev_m_in, message *dev_m_out)
@ -985,36 +997,25 @@ PUBLIC int uds_status(message *dev_m_in, message *dev_m_out)
uds_fd_table[i].io_gr_size, uds_fd_table[i].io_gr_size,
0); 0);
if (bytes == -1) { if (bytes == SUSPEND) {
uds_set_reply(dev_m_out,
DEV_REVIVE,
uds_fd_table[i].endpoint,
uds_fd_table[i].io_gr,
errno);
return errno;
} else if (bytes == SUSPEND) {
dev_m_out->m_type = dev_m_out->m_type =
DEV_NO_STATUS; DEV_NO_STATUS;
return OK; return OK;
} else { }
uds_fd_table[i].suspended = uds_fd_table[i].suspended =
UDS_NOT_SUSPENDED; UDS_NOT_SUSPENDED;
uds_set_reply(dev_m_out, uds_set_reply(dev_m_out,
DEV_REVIVE, DEV_REVIVE,
uds_fd_table[i].endpoint, uds_fd_table[i].endpoint,
uds_fd_table[i].io_gr, uds_fd_table[i].io_gr,
bytes); bytes);
return bytes; return bytes;
}
case UDS_SUSPENDED_WRITE: case UDS_SUSPENDED_WRITE:
@ -1023,36 +1024,25 @@ PUBLIC int uds_status(message *dev_m_in, message *dev_m_out)
uds_fd_table[i].io_gr_size, uds_fd_table[i].io_gr_size,
0); 0);
if (bytes == -1) { if (bytes == SUSPEND) {
uds_set_reply(dev_m_out,
DEV_REVIVE,
uds_fd_table[i].endpoint,
uds_fd_table[i].io_gr,
errno);
return errno;
} else if (bytes == SUSPEND) {
dev_m_out->m_type = dev_m_out->m_type =
DEV_NO_STATUS; DEV_NO_STATUS;
return OK; return OK;
} else { }
uds_fd_table[i].suspended = uds_fd_table[i].suspended =
UDS_NOT_SUSPENDED; UDS_NOT_SUSPENDED;
uds_set_reply(dev_m_out, uds_set_reply(dev_m_out,
DEV_REVIVE, DEV_REVIVE,
uds_fd_table[i].endpoint, uds_fd_table[i].endpoint,
uds_fd_table[i].io_gr, uds_fd_table[i].io_gr,
bytes); bytes);
return bytes; return bytes;
}
case UDS_SUSPENDED_CONNECT: case UDS_SUSPENDED_CONNECT:
case UDS_SUSPENDED_ACCEPT: case UDS_SUSPENDED_ACCEPT:

File diff suppressed because it is too large Load diff