summaryrefslogtreecommitdiffstats
path: root/dhcpcd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2009-01-15 14:22:40 +0000
committerRoy Marples <roy@marples.name>2009-01-15 14:22:40 +0000
commit5313b78124f566b486748ca071189aba2717d3d4 (patch)
tree9561c9999abfd26c7fff50b0660d2d811130605d /dhcpcd.c
parent3d775d8c76dc953b23371865b65e0d9fce20c906 (diff)
downloaddhcpcd-5313b78124f566b486748ca071189aba2717d3d4.tar.xz
--getinterfaces should be more than sufficient for the control socket.
Diffstat (limited to 'dhcpcd.c')
-rw-r--r--dhcpcd.c54
1 files changed, 25 insertions, 29 deletions
diff --git a/dhcpcd.c b/dhcpcd.c
index 813adb2a..3e849994 100644
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -1111,46 +1111,42 @@ handle_args(struct fd_list *fd, int argc, char **argv)
{
struct interface *ifs, *ifp, *ifl, *ifn, *ift;
int do_exit = 0, do_release = 0, do_reboot = 0, opt, oi = 0;
- char *s, *p;
- ssize_t l, len;
+ ssize_t len;
struct iovec iov[2];
if (fd != NULL) {
/* Special commands for our control socket */
if (strcmp(*argv, "--version") == 0) {
- l = strlen(VERSION) + 1;
- iov[0].iov_base = &l;
+ len = strlen(VERSION) + 1;
+ iov[0].iov_base = &len;
iov[0].iov_len = sizeof(ssize_t);
iov[1].iov_base = UNCONST(VERSION);
- iov[1].iov_len = l;
+ iov[1].iov_len = len;
writev(fd->fd, iov, 2);
return 0;
} else if (strcmp(*argv, "--getinterfaces") == 0) {
- l = 0;
- for (ifp = ifaces; ifp; ifp = ifp->next)
- l += strlen(ifp->name) + 1;
- s = p = xmalloc(l);
- for (ifp = ifaces; ifp; ifp = ifp->next) {
- len = strlen(ifp->name);
- memcpy(p, ifp->name, len);
- p += len;
- *p++ = ' ';
+ len = 0;
+ if (argv[1] == NULL ) {
+ for (ifp = ifaces; ifp; ifp = ifp->next)
+ len++;
+ write(fd->fd, &len, sizeof(len));
+ for (ifp = ifaces; ifp; ifp = ifp->next)
+ send_interface(fd->fd, ifp);
+ return 0;
+ }
+ opt = 0;
+ while (argv[++opt] != NULL) {
+ for (ifp = ifaces; ifp; ifp = ifp->next)
+ if (strcmp(argv[opt], ifp->name) == 0)
+ len++;
+ }
+ write(fd->fd, &len, sizeof(len));
+ opt = 0;
+ while (argv[++opt] != NULL) {
+ for (ifp = ifaces; ifp; ifp = ifp->next)
+ if (strcmp(argv[opt], ifp->name) == 0)
+ send_interface(fd->fd, ifp);
}
- *--p = '\0';
- iov[0].iov_base = &l;
- iov[0].iov_len = sizeof(ssize_t);
- iov[1].iov_base = s;
- iov[1].iov_len = l;
- writev(fd->fd, iov, 2);
- free(s);
- return 0;
- } else if (strcmp(*argv, "--getstates") == 0) {
- l = 0;
- for (ifp = ifaces; ifp; ifp = ifp->next)
- l++;
- write(fd->fd, &l, sizeof(l));
- for (ifp = ifaces; ifp; ifp = ifp->next)
- send_state(fd->fd, ifp);
return 0;
} else if (strcmp(*argv, "--listen") == 0) {
fd->listener = 1;