diff --git a/netcfg/netcfg.c b/netcfg/netcfg.c
index 204bf1d..eec1b2f 100644
--- a/netcfg/netcfg.c
+++ b/netcfg/netcfg.c
@@ -24,13 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-void die(const char *reason)
-{
-    perror(reason);
-    exit(1);
-}
-
-const char *ipaddr(in_addr_t addr)
+static const char *ipaddr(in_addr_t addr)
 {
     struct in_addr in_addr;
 
@@ -38,13 +32,13 @@
     return inet_ntoa(in_addr);
 }
 
-void usage(void)
+static void usage(void)
 {
-    fprintf(stderr,"usage: netcfg [<interface> {dhcp|up|down}]\n");
+    fprintf(stderr,"usage: netcfg [<interface> dhcp]\n");
     exit(1);
 }
 
-int dump_interface(const char *name)
+static int dump_interface(const char *name)
 {
     unsigned addr, flags;
     unsigned char hwbuf[ETH_ALEN];
@@ -69,7 +63,7 @@
     return 0;
 }
 
-int dump_interfaces(void)
+static int dump_interfaces(void)
 {
     DIR *d;
     struct dirent *de;
@@ -85,56 +79,11 @@
     return 0;
 }
 
-int set_hwaddr(const char *name, const char *asc) {
-    struct ether_addr *addr = ether_aton(asc);
-    if (!addr) {
-        printf("Failed to parse '%s'\n", asc);
-        return -1;
-    }
-    return ifc_set_hwaddr(name, addr->ether_addr_octet);
-}
-
-struct 
-{
-    const char *name;
-    int nargs;
-    void *func;
-} CMDS[] = {
-    { "dhcp",   1, do_dhcp },
-    { "up",     1, ifc_up },
-    { "down",   1, ifc_down },
-    { "deldefault", 1, ifc_remove_default_route },
-    { "hwaddr", 2, set_hwaddr },
-    { 0, 0, 0 },
-};
-
-static int call_func(void *_func, unsigned nargs, char **args)
-{
-    switch(nargs){
-    case 1: {
-        int (*func)(char *a0) = _func;
-        return func(args[0]);
-    }
-    case 2: {
-        int (*func)(char *a0, char *a1) = _func;
-        return func(args[0], args[1]);
-    }
-    case 3: {
-        int (*func)(char *a0, char *a1, char *a2) = _func;
-        return func(args[0], args[1], args[2]);
-    }
-    default:
-        return -1;
-    }
-}
-
 int main(int argc, char **argv)
 {
-    char *iname;
-    int n;
-    
     if(ifc_init()) {
-        die("Cannot perform requested operation");
+        perror("Cannot perform requested operation");
+        exit(1);
     }
 
     if(argc == 1) {
@@ -143,41 +92,23 @@
         return result;
     }
 
-    if(argc < 3) usage();
+    if(argc != 3) usage();
 
-    iname = argv[1];
+    char* iname = argv[1];
+    char* action = argv[2];
     if(strlen(iname) > 16) usage();
 
-    argc -= 2;
-    argv += 2;
-    while(argc > 0) {
-        for(n = 0; CMDS[n].name; n++){
-            if(!strcmp(argv[0], CMDS[n].name)) {
-                char *cmdname = argv[0];
-                int nargs = CMDS[n].nargs;
-                
-                argv[0] = iname;
-                if(argc < nargs) {
-                    fprintf(stderr, "not enough arguments for '%s'\n", cmdname);
-                    ifc_close();
-                    exit(1);
-                }
-                if(call_func(CMDS[n].func, nargs, argv)) {
-                    fprintf(stderr, "action '%s' failed (%s)\n", cmdname, strerror(errno));
-                    ifc_close();
-                    exit(1);
-                }
-                argc -= nargs;
-                argv += nargs;
-                goto done;
-            }
+    if (!strcmp(action, "dhcp")) {
+        if (do_dhcp(iname)) {
+            fprintf(stderr, "dhcp failed: %s\n", strerror(errno));
+            ifc_close();
+            exit(1);
         }
-        fprintf(stderr,"no such action '%s'\n", argv[0]);
+    } else {
+        fprintf(stderr,"no such action '%s'\n", action);
         usage();
-    done:
-        ;
     }
-    ifc_close();
 
+    ifc_close();
     return 0;
 }
