Add getmtime command for keys

This allows you to check when a key was last modified.

Change-Id: I167844d9a50e26aadfc73a2252b937d2ef09f09d
diff --git a/keystore/keystore.cpp b/keystore/keystore.cpp
index d90b999..ef4c7d4 100644
--- a/keystore/keystore.cpp
+++ b/keystore/keystore.cpp
@@ -1273,6 +1273,39 @@
     return keyStore->removeGrant(filename, granteeData) ? NO_ERROR : KEY_NOT_FOUND;
 }
 
+static ResponseCode getmtime(KeyStore*, int sock, uid_t uid, Value* keyName,
+        Value*, Value*) {
+    char filename[NAME_MAX];
+    encode_key_for_uid(filename, uid, keyName);
+    if (access(filename, R_OK) == -1) {
+        return (errno != ENOENT) ? SYSTEM_ERROR : KEY_NOT_FOUND;
+    }
+
+    int fd = open(filename, O_NOFOLLOW, O_RDONLY);
+    if (fd < 0) {
+        return SYSTEM_ERROR;
+    }
+
+    struct stat s;
+    int ret = fstat(fd, &s);
+    close(fd);
+    if (ret == -1) {
+        return SYSTEM_ERROR;
+    }
+
+    uint8_t *data;
+    int dataLength = asprintf(reinterpret_cast<char**>(&data), "%lu", s.st_mtime);
+    if (dataLength < 0) {
+        return SYSTEM_ERROR;
+    }
+
+    send_code(sock, NO_ERROR);
+    send_message(sock, data, dataLength);
+    free(data);
+
+    return NO_ERROR_RESPONSE_CODE_SENT;
+}
+
 /* Here are the permissions, actions, users, and the main function. */
 enum perm {
     P_TEST     = 1 << TEST,
@@ -1322,6 +1355,7 @@
     {del_key,    CommandCodes[DEL_KEY],    STATE_ANY,      P_DELETE,   {KEY_SIZE, 0, 0}},
     {grant,      CommandCodes[GRANT],      STATE_NO_ERROR, P_GRANT,    {KEY_SIZE, KEY_SIZE, 0}},
     {ungrant,    CommandCodes[UNGRANT],    STATE_NO_ERROR, P_GRANT,    {KEY_SIZE, KEY_SIZE, 0}},
+    {getmtime,   CommandCodes[GETMTIME],   STATE_ANY,      P_SAW,      {KEY_SIZE, 0, 0}},
     {NULL,       0,                        STATE_ANY,      0,          {0, 0, 0}},
 };