auto import from //branches/cupcake/...@125939
diff --git a/init/parser.c b/init/parser.c
index a51691b..6a22d24 100644
--- a/init/parser.c
+++ b/init/parser.c
@@ -158,6 +158,9 @@
         if (!strcmp(s, "nsmod")) return K_insmod;
         if (!strcmp(s, "mport")) return K_import;
         break;
+    case 'k':
+        if (!strcmp(s, "eycodes")) return K_keycodes;
+        break;
     case 'l':
         if (!strcmp(s, "oglevel")) return K_loglevel;
         break;
@@ -183,7 +186,7 @@
         if (!strcmp(s, "tart")) return K_start;
         if (!strcmp(s, "top")) return K_stop;
         if (!strcmp(s, "ymlink")) return K_symlink;
-	if (!strcmp(s, "ysclktz")) return K_sysclktz;
+        if (!strcmp(s, "ysclktz")) return K_sysclktz;
         break;
     case 't':
         if (!strcmp(s, "rigger")) return K_trigger;
@@ -440,6 +443,29 @@
     return 0;
 }
 
+struct service *service_find_by_keychord(int keychord_id)
+{
+    struct listnode *node;
+    struct service *svc;
+    list_for_each(node, &service_list) {
+        svc = node_to_item(node, struct service, slist);
+        if (svc->keychord_id == keychord_id) {
+            return svc;
+        }
+    }
+    return 0;
+}
+
+void service_for_each(void (*func)(struct service *svc))
+{
+    struct listnode *node;
+    struct service *svc;
+    list_for_each(node, &service_list) {
+        svc = node_to_item(node, struct service, slist);
+        func(svc);
+    }
+}
+
 void service_for_each_class(const char *classname,
                             void (*func)(struct service *svc))
 {
@@ -586,7 +612,7 @@
 {
     struct service *svc = state->context;
     struct command *cmd;
-    int kw, kw_nargs;
+    int i, kw, kw_nargs;
 
     if (nargs == 0) {
         return;
@@ -624,6 +650,21 @@
             svc->nr_supp_gids = n - 2;
         }
         break;
+    case K_keycodes:
+        if (nargs < 2) {
+            parse_error(state, "keycodes option requires atleast one keycode\n");
+        } else {
+            svc->keycodes = malloc((nargs - 1) * sizeof(svc->keycodes[0]));
+            if (!svc->keycodes) {
+                parse_error(state, "could not allocate keycodes\n");
+            } else {
+                svc->nkeycodes = nargs - 1;
+                for (i = 1; i < nargs; i++) {
+                    svc->keycodes[i - 1] = atoi(args[i]);
+                }
+            }
+        }
+        break;
     case K_oneshot:
         svc->flags |= SVC_ONESHOT;
         break;