|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <time.h> | 
|  |  | 
|  | #include <cutils/properties.h> | 
|  |  | 
|  | #include <sys/atomics.h> | 
|  |  | 
|  | #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ | 
|  | #include <sys/_system_properties.h> | 
|  |  | 
|  |  | 
|  | extern prop_area *__system_property_area__; | 
|  |  | 
|  | typedef struct pwatch pwatch; | 
|  |  | 
|  | struct pwatch | 
|  | { | 
|  | const prop_info *pi; | 
|  | unsigned serial; | 
|  | }; | 
|  |  | 
|  | static pwatch watchlist[1024]; | 
|  |  | 
|  | static void announce(const prop_info *pi) | 
|  | { | 
|  | char name[PROP_NAME_MAX]; | 
|  | char value[PROP_VALUE_MAX]; | 
|  | char *x; | 
|  |  | 
|  | __system_property_read(pi, name, value); | 
|  |  | 
|  | for(x = value; *x; x++) { | 
|  | if((*x < 32) || (*x > 127)) *x = '.'; | 
|  | } | 
|  |  | 
|  | fprintf(stderr,"%10d %s = '%s'\n", (int) time(0), name, value); | 
|  | } | 
|  |  | 
|  | int watchprops_main(int argc, char *argv[]) | 
|  | { | 
|  | prop_area *pa = __system_property_area__; | 
|  | unsigned serial = pa->serial; | 
|  | unsigned count = pa->count; | 
|  | unsigned n; | 
|  |  | 
|  | if(count >= 1024) exit(1); | 
|  |  | 
|  | for(n = 0; n < count; n++) { | 
|  | watchlist[n].pi = __system_property_find_nth(n); | 
|  | watchlist[n].serial = watchlist[n].pi->serial; | 
|  | } | 
|  |  | 
|  | for(;;) { | 
|  | do { | 
|  | __futex_wait(&pa->serial, serial, 0); | 
|  | } while(pa->serial == serial); | 
|  |  | 
|  | while(count < pa->count){ | 
|  | watchlist[count].pi = __system_property_find_nth(count); | 
|  | watchlist[count].serial = watchlist[n].pi->serial; | 
|  | announce(watchlist[count].pi); | 
|  | count++; | 
|  | if(count == 1024) exit(1); | 
|  | } | 
|  |  | 
|  | for(n = 0; n < count; n++){ | 
|  | unsigned tmp = watchlist[n].pi->serial; | 
|  | if(watchlist[n].serial != tmp) { | 
|  | announce(watchlist[n].pi); | 
|  | watchlist[n].serial = tmp; | 
|  | } | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } |