blob: 0d05aba5161b0dfce683d82aa084ccb29c23b1e2 [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001#include <stdio.h>
2#include <stdlib.h>
3#include <time.h>
Greg Hackmann68e9b6b2013-02-13 10:49:50 -08004#include <errno.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08005
6#include <cutils/properties.h>
Greg Hackmann68e9b6b2013-02-13 10:49:50 -08007#include <cutils/hashmap.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08008
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08009#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
10#include <sys/_system_properties.h>
11
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080012static int str_hash(void *key)
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080013{
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080014 return hashmapHash(key, strlen(key));
15}
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080016
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080017static bool str_equals(void *keyA, void *keyB)
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080018{
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080019 return strcmp(keyA, keyB) == 0;
20}
21
22static void announce(char *name, char *value)
23{
Greg Hackmanneeed45f2014-05-21 10:39:44 -070024 unsigned char *x;
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080025
Greg Hackmanneeed45f2014-05-21 10:39:44 -070026 for(x = (unsigned char *)value; *x; x++) {
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080027 if((*x < 32) || (*x > 127)) *x = '.';
28 }
29
30 fprintf(stderr,"%10d %s = '%s'\n", (int) time(0), name, value);
31}
32
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080033static void add_to_watchlist(Hashmap *watchlist, const char *name,
34 const prop_info *pi)
35{
36 char *key = strdup(name);
37 unsigned *value = malloc(sizeof(unsigned));
38 if (!key || !value)
39 exit(1);
40
41 *value = __system_property_serial(pi);
42 hashmapPut(watchlist, key, value);
43}
44
45static void populate_watchlist(const prop_info *pi, void *cookie)
46{
47 Hashmap *watchlist = cookie;
48 char name[PROP_NAME_MAX];
49 char value_unused[PROP_VALUE_MAX];
50
51 __system_property_read(pi, name, value_unused);
52 add_to_watchlist(watchlist, name, pi);
53}
54
55static void update_watchlist(const prop_info *pi, void *cookie)
56{
57 Hashmap *watchlist = cookie;
58 char name[PROP_NAME_MAX];
59 char value[PROP_VALUE_MAX];
60 unsigned *serial;
61
62 __system_property_read(pi, name, value);
63 serial = hashmapGet(watchlist, name);
64 if (!serial) {
65 add_to_watchlist(watchlist, name, pi);
66 announce(name, value);
67 } else {
68 unsigned tmp = __system_property_serial(pi);
69 if (*serial != tmp) {
70 *serial = tmp;
71 announce(name, value);
72 }
73 }
74}
75
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080076int watchprops_main(int argc, char *argv[])
77{
Mark Salyzynaa907762014-05-08 09:31:43 -070078 unsigned serial;
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080079
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080080 Hashmap *watchlist = hashmapCreate(1024, str_hash, str_equals);
81 if (!watchlist)
Colin Cross81963162013-01-28 17:14:04 -080082 exit(1);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080083
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080084 __system_property_foreach(populate_watchlist, watchlist);
85
Mark Salyzynaa907762014-05-08 09:31:43 -070086 for(serial = 0;;) {
Colin Cross81963162013-01-28 17:14:04 -080087 serial = __system_property_wait_any(serial);
Greg Hackmann68e9b6b2013-02-13 10:49:50 -080088 __system_property_foreach(update_watchlist, watchlist);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080089 }
90 return 0;
91}