| #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <time.h> | 
 | #include <errno.h> | 
 |  | 
 | #include <cutils/properties.h> | 
 | #include <cutils/hashmap.h> | 
 |  | 
 | #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ | 
 | #include <sys/_system_properties.h> | 
 |  | 
 | static int str_hash(void *key) | 
 | { | 
 |     return hashmapHash(key, strlen(key)); | 
 | } | 
 |  | 
 | static bool str_equals(void *keyA, void *keyB) | 
 | { | 
 |     return strcmp(keyA, keyB) == 0; | 
 | } | 
 |  | 
 | static void announce(char *name, char *value) | 
 | { | 
 |     unsigned char *x; | 
 |      | 
 |     for(x = (unsigned char *)value; *x; x++) { | 
 |         if((*x < 32) || (*x > 127)) *x = '.'; | 
 |     } | 
 |  | 
 |     fprintf(stderr,"%10d %s = '%s'\n", (int) time(0), name, value); | 
 | } | 
 |  | 
 | static void add_to_watchlist(Hashmap *watchlist, const char *name, | 
 |         const prop_info *pi) | 
 | { | 
 |     char *key = strdup(name); | 
 |     unsigned *value = malloc(sizeof(unsigned)); | 
 |     if (!key || !value) | 
 |         exit(1); | 
 |  | 
 |     *value = __system_property_serial(pi); | 
 |     hashmapPut(watchlist, key, value); | 
 | } | 
 |  | 
 | static void populate_watchlist(const prop_info *pi, void *cookie) | 
 | { | 
 |     Hashmap *watchlist = cookie; | 
 |     char name[PROP_NAME_MAX]; | 
 |     char value_unused[PROP_VALUE_MAX]; | 
 |  | 
 |     __system_property_read(pi, name, value_unused); | 
 |     add_to_watchlist(watchlist, name, pi); | 
 | } | 
 |  | 
 | static void update_watchlist(const prop_info *pi, void *cookie) | 
 | { | 
 |     Hashmap *watchlist = cookie; | 
 |     char name[PROP_NAME_MAX]; | 
 |     char value[PROP_VALUE_MAX]; | 
 |     unsigned *serial; | 
 |  | 
 |     __system_property_read(pi, name, value); | 
 |     serial = hashmapGet(watchlist, name); | 
 |     if (!serial) { | 
 |         add_to_watchlist(watchlist, name, pi); | 
 |         announce(name, value); | 
 |     } else { | 
 |         unsigned tmp = __system_property_serial(pi); | 
 |         if (*serial != tmp) { | 
 |             *serial = tmp; | 
 |             announce(name, value); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | int watchprops_main(int argc, char *argv[]) | 
 | { | 
 |     unsigned serial; | 
 |      | 
 |     Hashmap *watchlist = hashmapCreate(1024, str_hash, str_equals); | 
 |     if (!watchlist) | 
 |         exit(1); | 
 |  | 
 |     __system_property_foreach(populate_watchlist, watchlist); | 
 |  | 
 |     for(serial = 0;;) { | 
 |         serial = __system_property_wait_any(serial); | 
 |         __system_property_foreach(update_watchlist, watchlist); | 
 |     } | 
 |     return 0; | 
 | } |