• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include <errno.h>
5 
6 #include <cutils/properties.h>
7 #include <cutils/hashmap.h>
8 
9 #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
10 #include <sys/_system_properties.h>
11 
str_hash(void * key)12 static int str_hash(void *key)
13 {
14     return hashmapHash(key, strlen(key));
15 }
16 
str_equals(void * keyA,void * keyB)17 static bool str_equals(void *keyA, void *keyB)
18 {
19     return strcmp(keyA, keyB) == 0;
20 }
21 
announce(char * name,char * value)22 static void announce(char *name, char *value)
23 {
24     unsigned char *x;
25 
26     for(x = (unsigned char *)value; *x; x++) {
27         if((*x < 32) || (*x > 127)) *x = '.';
28     }
29 
30     fprintf(stderr,"%10d %s = '%s'\n", (int) time(0), name, value);
31 }
32 
add_to_watchlist(Hashmap * watchlist,const char * name,const prop_info * pi)33 static 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 
populate_watchlist(const prop_info * pi,void * cookie)45 static 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 
update_watchlist(const prop_info * pi,void * cookie)55 static 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 
watchprops_main(int argc,char * argv[])76 int watchprops_main(int argc, char *argv[])
77 {
78     unsigned serial;
79 
80     Hashmap *watchlist = hashmapCreate(1024, str_hash, str_equals);
81     if (!watchlist)
82         exit(1);
83 
84     __system_property_foreach(populate_watchlist, watchlist);
85 
86     for(serial = 0;;) {
87         serial = __system_property_wait_any(serial);
88         __system_property_foreach(update_watchlist, watchlist);
89     }
90     return 0;
91 }
92