auto import //branches/master/...@140412
diff --git a/simulator/wrapsim/SysPower.c b/simulator/wrapsim/SysPower.c
new file mode 100644
index 0000000..fa7ae0a
--- /dev/null
+++ b/simulator/wrapsim/SysPower.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2009 The Android Open Source Project
+ *
+ * Magic entries in /sys/power/.
+ */
+#include "Common.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+/*
+ * Map filename to device index.
+ *
+ * [ not using DeviceIndex -- would be useful if we need to return something
+ * other than a static string ]
+ */
+static const struct {
+    const char*     name;
+    //DeviceIndex     idx;
+    const char*     data;
+} gDeviceMap[] = {
+    { "state",
+        "mem\n" },
+    { "wake_lock",
+        "\n" },
+    { "wake_unlock",
+        "KeyEvents PowerManagerService radio-interface\n" },
+};
+
+/*
+ * Power driver state.
+ *
+ * Right now we just ignore everything written.
+ */
+typedef struct PowerState {
+    int         which;
+} PowerState;
+
+
+/*
+ * Figure out who we are, based on "pathName".
+ */
+static void configureInitialState(const char* pathName, PowerState* powerState)
+{
+    const char* cp = pathName + strlen("/sys/power/");
+    int i;
+
+    powerState->which = -1;
+    for (i = 0; i < (int) (sizeof(gDeviceMap) / sizeof(gDeviceMap[0])); i++) {
+        if (strcmp(cp, gDeviceMap[i].name) == 0) {
+            powerState->which = i;
+            break;
+        }
+    }
+
+    if (powerState->which == -1) {
+        wsLog("Warning: access to unknown power device '%s'\n", pathName);
+        return;
+    }
+}
+
+/*
+ * Free up the state structure.
+ */
+static void freeState(PowerState* powerState)
+{
+    free(powerState);
+}
+
+/*
+ * Read data from the device.
+ *
+ * We don't try to keep track of how much was read -- existing clients just
+ * try to read into a large buffer.
+ */
+static ssize_t readPower(FakeDev* dev, int fd, void* buf, size_t count)
+{
+    PowerState* state = (PowerState*) dev->state;
+    int dataLen;
+
+    wsLog("%s: read %d\n", dev->debugName, count);
+
+    if (state->which < 0 ||
+        state->which >= (int) (sizeof(gDeviceMap)/sizeof(gDeviceMap[0])))
+    {
+        return 0;
+    }
+
+    const char* data = gDeviceMap[state->which].data;
+    size_t strLen = strlen(data);
+
+    while(strLen == 0)
+        sleep(10); // block forever
+
+    ssize_t copyCount = (strLen < count) ? strLen : count;
+    memcpy(buf, data, copyCount);
+    return copyCount;
+}
+
+/*
+ * Ignore the request.
+ */
+static ssize_t writePower(FakeDev* dev, int fd, const void* buf, size_t count)
+{
+    wsLog("%s: write %d bytes\n", dev->debugName, count);
+    return count;
+}
+
+/*
+ * Free up our state before closing down the fake descriptor.
+ */
+static int closePower(FakeDev* dev, int fd)
+{
+    freeState((PowerState*)dev->state);
+    dev->state = NULL;
+    return 0;
+}
+
+/*
+ * Open a power device.
+ */
+FakeDev* wsOpenSysPower(const char* pathName, int flags)
+{
+    FakeDev* newDev = wsCreateFakeDev(pathName);
+    if (newDev != NULL) {
+        newDev->read = readPower;
+        newDev->write = writePower;
+        newDev->ioctl = NULL;
+        newDev->close = closePower;
+
+        PowerState* powerState = calloc(1, sizeof(PowerState));
+
+        configureInitialState(pathName, powerState);
+        newDev->state = powerState;
+    }
+
+    return newDev;
+}
+