STATIC void test_onQueryFunc( const Wilddog_Node_T* p_snapshot, void* arg, Wilddog_Return_T err) { if(err < WILDDOG_HTTP_OK || err >= WILDDOG_HTTP_NOT_MODIFIED) { wilddog_debug("query error!err = %d", err); return; } wilddog_debug("query success!"); if(p_snapshot) { *(Wilddog_Node_T**)arg = wilddog_node_clone(p_snapshot); } return; }
void Observer_CB( const Wilddog_Node_T* p_snapshot, void* arg,Wilddog_Return_T err) { guu_is_wilddog_t *ptr_gwd; ptr_gwd = (guu_is_wilddog_t*)arg; ptr_gwd->observer_finished = TRUE; if(err < WILDDOG_HTTP_OK || err >= WILDDOG_HTTP_NOT_MODIFIED) { wilddog_debug("addObserver failed!"); return; } ptr_gwd->snapshot_clone = wilddog_node_clone(p_snapshot); /* */ // wilddog_debug("addObserver data!"); ptr_gwd->node_val = wilddog_debug_n2jsonString(p_snapshot); //printf("%s\n",ptr_gwd->node_val); #ifdef INLISP if(ptr_gwd->node_val !=NULL) { strncpy(json_buff,ptr_gwd->node_val,JSON_BUFF_LEN); if(newlisp_process_json!=NULL) { newlisp_process_json(); } } #endif // simulate response wilddog_debug_printnode(p_snapshot); printf("\n"); fflush(stdout); wfree(ptr_gwd->node_val); return; }
STATIC void observer_callback ( const Wilddog_Node_T* p_snapshot, void* arg, Wilddog_Return_T err ) { int ret = 0; char cmd[1024]; static int times=0; pid_t pid; char * pstr = NULL; char * pleaf = NULL; Wilddog_Node_T *p_clone = NULL; Wilddog_Str_T *p_key = NULL; char *d = " "; char *ps = NULL; char *args[0]; int i = 0,j = 1; memset(cmd,0,1024); *((*(WATCH_CTX*)arg).isFinished)= TRUE; if(err < WILDDOG_HTTP_OK || err >= WILDDOG_HTTP_NOT_MODIFIED) { wilddog_debug("addObserver failed!"); return; } if(strncmp("yes", (*(WATCH_CTX*)arg).data, strlen("yes")) == 0 && times == 0) { times++; return; } pid = fork(); if(pid == -1) perror("fork"); if(!pid) { p_clone = wilddog_node_clone(p_snapshot); p_key = p_clone->p_wn_key; p_clone->p_wn_key = NULL; pstr = (char *)wilddog_debug_n2jsonString(p_clone); fflush(stdout); /*Handle cmd's arg, add to arg table. Such as "ls -l", "-l" is an arg*/ if((strncmp("no", (*(WATCH_CTX*)arg).quote, strlen("no")) != 0) && p_clone->p_wn_child == NULL && p_clone->d_wn_type == WILDDOG_NODE_TYPE_UTF8STRING) { /*If node is leaf and value is string, seperate to args by space*/ pleaf = wmalloc(strlen(pstr)-1); memcpy(pleaf, pstr+1, strlen(pstr)-2); *(pleaf+strlen(pleaf)) = '\0'; args[0] = strtok( (char *)((*(WATCH_CTX*)arg).cmd), d); while(ps = strtok(NULL,d)) { args[j++] = ps; } args[j++] = strtok(pleaf, d); while(ps = strtok(NULL,d)) { args[j++] = ps; } args[j] = NULL; } else { args[0] = strtok( (char *)((*(WATCH_CTX*)arg).cmd), d); while(ps = strtok(NULL,d)) { args[j++] = ps; } args[j] = wmalloc(strlen(pstr)+1); memcpy(args[j], pstr, strlen(pstr)); args[++j] = NULL; } if(strncmp("yes", (*(WATCH_CTX*)arg).verbose, strlen("yes")) == 0) { printf("exec this cmd and param: "); for(i = 0; i < j; i++) { printf("%s ", args[i]); fflush(stdout); } printf("\n\n"); fflush(stdout); } ret = execvp((char *)((*(WATCH_CTX*)arg).cmd), args); wfree(pstr); wfree(pleaf); for( i = 0; i < j+1; i++) wfree(args[i]); p_clone->p_wn_key = p_key; wilddog_node_delete(p_clone); if(ret == -1) { perror("execv"); exit(EXIT_FAILURE); } } return; }