merge cupcake into donut
diff --git a/liblog/logd_write.c b/liblog/logd_write.c
index 80867d1..96da38b 100644
--- a/liblog/logd_write.c
+++ b/liblog/logd_write.c
@@ -143,12 +143,16 @@
     /* XXX: This needs to go! */
     if (!strcmp(tag, "HTC_RIL") ||
         !strcmp(tag, "RILJ") ||
+        !strcmp(tag, "RILB") ||
         !strcmp(tag, "RILC") ||
         !strcmp(tag, "RILD") ||
         !strcmp(tag, "RIL") ||
         !strcmp(tag, "AT") ||
         !strcmp(tag, "GSM") ||
-        !strcmp(tag, "STK"))
+        !strcmp(tag, "STK") ||
+        !strcmp(tag, "CDMA") ||
+        !strcmp(tag, "PHONE") ||
+        !strcmp(tag, "SMS"))
             log_id = LOG_ID_RADIO;
 
     vec[0].iov_base   = (unsigned char *) &prio;
diff --git a/rootdir/init.rc b/rootdir/init.rc
index bcabecb..e1f1e8a 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -34,6 +34,24 @@
     write /proc/sys/kernel/sched_latency_ns 10000000
     write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000
 
+# Create cgroup mount points for process groups
+    mkdir /dev/cpuctl
+    mount cgroup none /dev/cpuctl cpu
+    chown sytem system /dev/cpuctl
+    chown system system /dev/cpuctl/tasks
+    chmod 0777 /dev/cpuctl/tasks
+    write /dev/cpuctl/cpu.shares 1024
+
+    mkdir /dev/cpuctl/fg_boost
+    chown system system /dev/cpuctl/fg_boost/tasks
+    chmod 0777 /dev/cpuctl/fg_boost/tasks
+    write /dev/cpuctl/fg_boost/cpu.shares 1024
+
+    mkdir /dev/cpuctl/bg_non_interactive
+    chown system system /dev/cpuctl/bg_non_interactive/tasks
+    chmod 0777 /dev/cpuctl/bg_non_interactive/tasks
+    write /dev/cpuctl/bg_non_interactive/cpu.shares 1024
+
 # mount mtd partitions
     # Mount /system rw first to give the filesystem a chance to save a checkpoint
     mount yaffs2 mtd@system /system 
diff --git a/toolbox/getevent.c b/toolbox/getevent.c
index 14372cb..256720d 100644
--- a/toolbox/getevent.c
+++ b/toolbox/getevent.c
@@ -28,6 +28,7 @@
 {
     uint8_t *bits = NULL;
     ssize_t bits_size = 0;
+    const char* label;
     int i, j, k;
     int res, res2;
     
@@ -45,21 +46,48 @@
                 return 1;
             }
         }
+        res2 = 0;
         switch(i) {
+            case EV_SYN:
+                label = "SYN";
+                break;
             case EV_KEY:
                 res2 = ioctl(fd, EVIOCGKEY(res), bits + bits_size);
+                label = "KEY";
+                break;
+            case EV_REL:
+                label = "REL";
+                break;
+            case EV_ABS:
+                label = "ABS";
+                break;
+            case EV_MSC:
+                label = "MSC";
                 break;
             case EV_LED:
                 res2 = ioctl(fd, EVIOCGLED(res), bits + bits_size);
+                label = "LED";
                 break;
             case EV_SND:
                 res2 = ioctl(fd, EVIOCGSND(res), bits + bits_size);
+                label = "SND";
                 break;
             case EV_SW:
                 res2 = ioctl(fd, EVIOCGSW(bits_size), bits + bits_size);
+                label = "SW ";
+                break;
+            case EV_REP:
+                label = "REP";
+                break;
+            case EV_FF:
+                label = "FF ";
+                break;
+            case EV_PWR:
+                label = "PWR";
                 break;
             default:
                 res2 = 0;
+                label = "???";
         }
         for(j = 0; j < res; j++) {
             for(k = 0; k < 8; k++)
@@ -70,9 +98,9 @@
                     else
                         down = ' ';
                     if(count == 0)
-                        printf("    type %04x:", i);
+                        printf("    %s (%04x):", label, i);
                     else if((count & 0x7) == 0 || i == EV_ABS)
-                        printf("\n              ");
+                        printf("\n               ");
                     printf(" %04x%c", j * 8 + k, down);
                     if(i == EV_ABS) {
                         struct input_absinfo abs;
@@ -264,7 +292,16 @@
 
 static void usage(int argc, char *argv[])
 {
-    fprintf(stderr, "Usage: %s [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-q] [-c count] [-r] [device]\n", argv[0]);
+    fprintf(stderr, "Usage: %s [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-p] [-q] [-c count] [-r] [device]\n", argv[0]);
+    fprintf(stderr, "    -t: show time stamps\n");
+    fprintf(stderr, "    -n: don't print newlines\n");
+    fprintf(stderr, "    -s: print switch states for given bits\n");
+    fprintf(stderr, "    -S: print all switch states\n");
+    fprintf(stderr, "    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32)\n");
+    fprintf(stderr, "    -p: show possible events (errs, dev, name, pos. events)\n");
+    fprintf(stderr, "    -q: quiet (clear verbosity mask)\n");
+    fprintf(stderr, "    -c: print given number of events then exit\n");
+    fprintf(stderr, "    -r: print rate events are received\n");
 }
 
 int getevent_main(int argc, char *argv[])
@@ -290,7 +327,7 @@
 
     opterr = 0;
     do {
-        c = getopt(argc, argv, "tns:Sv::qc:rh");
+        c = getopt(argc, argv, "tns:Sv::pqc:rh");
         if (c == EOF)
             break;
         switch (c) {
@@ -317,6 +354,12 @@
                 print_flags |= PRINT_DEVICE | PRINT_DEVICE_NAME | PRINT_DEVICE_INFO | PRINT_VERSION;
             print_flags_set = 1;
             break;
+        case 'p':
+            print_flags = PRINT_DEVICE_ERRORS | PRINT_DEVICE | PRINT_DEVICE_NAME | PRINT_POSSIBLE_EVENTS;
+            print_flags_set = 1;
+            if(dont_block == -1)
+                dont_block = 1;
+            break;
         case 'q':
             print_flags = 0;
             print_flags_set = 1;
diff --git a/toolbox/route.c b/toolbox/route.c
index adf5c69..86fc35b 100644
--- a/toolbox/route.c
+++ b/toolbox/route.c
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <stdarg.h>
 
 #include <errno.h>
 #include <string.h>
@@ -14,9 +15,14 @@
 #include <arpa/inet.h>
 #include <linux/route.h>
 
-static void die(const char *s)
+static void die(const char *fmt, ...)
 {
-    fprintf(stderr,"error: %s (%s)\n", s, strerror(errno));
+    va_list p;
+
+    va_start(p, fmt);
+    fprintf(stderr,"error(%s): ", strerror(errno));
+    fprintf(stderr, fmt, p);
+    va_end(p);
     exit(-1);
 }
 
@@ -36,9 +42,10 @@
 	}                                       \
 } while(0)		
 
-/* current support two kinds of usage */
+/* current support the following routing entries */
 /* route add default dev wlan0 */
 /* route add default gw 192.168.20.1 dev wlan0 */
+/* route add net 192.168.1.1 netmask 255.255.255.0 gw 172.24.192.10 */
 
 int route_main(int argc, char *argv[])
 {
@@ -68,7 +75,7 @@
 				  EXPECT_NEXT(argc, argv);
 				  rt.rt_flags = RTF_UP | RTF_HOST;
 				  rt.rt_dev = argv[0];
-				  if (ioctl(s, SIOCADDRT, &rt) < 0) die("SIOCADDRT");
+				  if (ioctl(s, SIOCADDRT, &rt) < 0) die("SIOCADDRT\n");
 				}else if(!strcmp(argv[0], "gw")) {
 				  EXPECT_NEXT(argc, argv);
 				  rt.rt_flags = RTF_UP | RTF_GATEWAY;
@@ -76,22 +83,44 @@
 				  if(isdigit(argv[0][0])){
 					init_sockaddr_in((struct sockaddr_in *)&(rt.rt_gateway), argv[0]);
 				  }else{
-					die("expecting an IP address for parameter \"gw\"");
+					die("expecting an IP address for parameter \"gw\"\n");
 				  }
 				  EXPECT_NEXT(argc, argv);
 				  if(!strcmp(argv[0], "dev")) {
 					EXPECT_NEXT(argc, argv);
 					rt.rt_dev = argv[0];
 					if (ioctl(s, SIOCADDRT, &rt) < 0){
-					  die("SIOCADDRT");
+					  die("SIOCADDRT\n");
 					}
 				  }
 				}
-			}
+			} else  {
+                          char keywords[3][5] = { "net", "mask", "gw" };
+                          struct sockaddr_in *paddr[3] = { &rt.rt_dst, &rt.rt_genmask, &rt.rt_gateway };
+                          int k = 0;
+
+                          memset((char *) &rt, 0, sizeof(struct rtentry));
+                          rt.rt_flags = RTF_UP | RTF_GATEWAY;
+                          do {
+                            if(!strcmp(argv[0], keywords[k])) {
+                              EXPECT_NEXT(argc, argv);
+                              if(isdigit(argv[0][0])) {
+                                init_sockaddr_in(paddr[k], argv[0]);
+                              } else {
+                                die("expecting an IP/MASK address for parameter %s\n", keywords[k]);
+                              }
+                              if(k < 2) EXPECT_NEXT(argc, argv);
+                            } else {
+                              die("expecting keyword(s)\n");
+                            }
+                          } while(++k < 3);
+                          if(ioctl(s, SIOCADDRT, &rt) < 0) {
+                            die("SIOCADDRT\n");
+                          }
+                        }
         }
 		ADVANCE(argc, argv);
     }
 
     return 0;
 }
-