static intgen_t subtree_descend_cb( void *arg1, jdm_fshandle_t *fshandlep, intgen_t fsfd, xfs_bstat_t *statp, char *name ) { intgen_t cbrval = 0; cb_add( NULL, fshandlep, fsfd, statp ); if ( ( statp->bs_mode & S_IFMT ) == S_IFDIR ) { ( void )diriter( fshandlep, fsfd, statp, subtree_descend_cb, NULL, &cbrval, NULL, 0 ); } return cbrval; }
int main(int arg, char** argv) { sbinder_start(); int ret; ret = cb_add(_cb_callback); printf("main 1ret = %d\n",ret); ret = cb_add(_cb_callback1); printf("main 2ret = %d\n",ret); ret = cb_invoke(10); printf("main 3ret = %d\n",ret); sleep(5); ret = cb_invoke(11); printf("main 4ret = %d\n",ret); sleep(5); ret = cb_remove(_cb_callback1); printf("main 5ret = %d\n",ret); startThread(13); printf("main 6ret = %d\n",ret); startThread(14); printf("main 7ret = %d\n",ret); startThread(15); printf("main 8ret = %d\n",ret); startThread(16); printf("main 9ret = %d\n",ret); startThread(17); printf("main 10ret = %d\n",ret); ret = cb_invoke(12); printf("main 11ret = %d\n",ret); return sbinder_serv(); }
static intgen_t subtreelist_parse( jdm_fshandle_t *fshandlep, intgen_t fsfd, xfs_bstat_t *rootstatp, char *subtreebuf[], ix_t subtreecnt ) { ix_t subtreeix; /* add the root ino to the dump */ cb_add( NULL, fshandlep, fsfd, rootstatp ); /* do a recursive descent for each subtree specified */ for ( subtreeix = 0 ; subtreeix < subtreecnt ; subtreeix++ ) { intgen_t cbrval = 0; char *currentpath = subtreebuf[ subtreeix ]; ASSERT( *currentpath != '/' ); ( void )diriter( fshandlep, fsfd, rootstatp, subtreelist_parse_cb, ( void * )currentpath, &cbrval, NULL, 0 ); if ( cbrval != 1 ) { mlog( MLOG_NORMAL | MLOG_ERROR | MLOG_INOMAP, "%s: %s\n", cbrval == 0 ? _("subtree not present") : _("invalid subtree specified"), currentpath ); return -1; } } return 0; }
/** * Real initialization, called after the config is parsed */ int diameter_peer_init_real() { pid_list_t *i,*j; if (!config) { LM_ERR("diameter_peer_init_real(): Configuration was not parsed yet. Aborting...\n"); goto error; } log_dp_config(config); dp_first_pid = shm_malloc(sizeof(pid_t)); if (!dp_first_pid){ LOG_NO_MEM("shm",sizeof(pid_t)); goto error; } *dp_first_pid = getpid(); shutdownx = shm_malloc(sizeof(int)); if (!shutdownx){ LOG_NO_MEM("shm",sizeof(int)); goto error; } *shutdownx = 0; shutdownx_lock = lock_alloc(); if (!shutdownx_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } shutdownx_lock = lock_init(shutdownx_lock); handlers_lock = lock_alloc(); if (!handlers_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } handlers_lock = lock_init(handlers_lock); handlers = shm_malloc(sizeof(handler_list)); if (!handlers){ LOG_NO_MEM("shm",sizeof(handler_list)); goto error; } handlers->head=0; handlers->tail=0; /* init the pid list */ pid_list = shm_malloc(sizeof(pid_list_head_t)); if (!pid_list){ LOG_NO_MEM("shm",sizeof(pid_list_head_t)); goto error; } bzero(pid_list,sizeof(pid_list_head_t)); pid_list_lock = lock_alloc(); pid_list_lock = lock_init(pid_list_lock); /* init shared mem pointers before forking */ timer_cdp_init(); worker_init(); /* init the peer manager */ peer_manager_init(config); /* init diameter transactions */ cdp_trans_init(); /* init the session */ if (!cdp_sessions_init(config->sessions_hash_size)) goto error; /* add callback for messages - used to implement the API */ cb_add(api_callback,0); return 1; error: if (shutdownx) shm_free(shutdownx); if (config) free_dp_config(config); i = pid_list->head; while(i){ j = i->next; shm_free(i); i = j; } shm_free(pid_list); lock_get(pid_list_lock); lock_destroy(pid_list_lock); lock_dealloc((void*)pid_list_lock); return 0; }
static intgen_t subtreelist_parse_cb( void *arg1, jdm_fshandle_t *fshandlep, intgen_t fsfd, xfs_bstat_t *statp, char *name ) { intgen_t cbrval = 0; /* arg1 is used to carry the tail of the subtree path */ char *subpath = ( char * )arg1; /* temporarily terminate the subpath at the next slash */ char *nextslash = strchr( subpath, '/' ); if ( nextslash ) { *nextslash = 0; } /* if the first element of the subpath doesn't match this * directory entry, try the next entry. */ if ( strcmp( subpath, name )) { if ( nextslash ) { *nextslash = '/'; } return 0; } /* it matches, so add ino to list and continue down the path */ cb_add( NULL, fshandlep, fsfd, statp ); if ( nextslash ) { /* if we're not at the end of the path, yet the current * path element is not a directory, complain and abort the * iteration in a way which terminates the application */ if ( ( statp->bs_mode & S_IFMT ) != S_IFDIR ) { *nextslash = '/'; return 2; } /* repair the subpath */ *nextslash = '/'; /* peel the first element of the subpath and recurse */ ( void )diriter( fshandlep, fsfd, statp, subtreelist_parse_cb, ( void * )( nextslash + 1 ), &cbrval, NULL, 0 ); return cbrval; } else { /* we've reached the specified subpath, so if we're * at a directory, recurse down and add all children * to the inomap. */ if ( ( statp->bs_mode & S_IFMT ) != S_IFDIR ) { return 1; } ( void )diriter( fshandlep, fsfd, statp, subtree_descend_cb, NULL, &cbrval, 0, 0 ); return 1; } }
/** * Initialize the CDiameterPeer from a configuration file. * The file is kept as dtd. See configdtd.h for the DTD and ConfigExample.xml. * @param cfg_filename - file with the configuration * @returns 1 on success, 0 on error */ int diameter_peer_init(char *cfg_filename) { pid_list_t *i,*j; config = parse_dp_config(cfg_filename); if (!config) { LOG(L_ERR,"ERROR:init_diameter_peer(): Error loading configuration file. Aborting...\n"); goto error; } log_dp_config(L_INFO,config); dp_first_pid = shm_malloc(sizeof(pid_t)); if (!dp_first_pid){ LOG_NO_MEM("shm",sizeof(pid_t)); goto error; } *dp_first_pid = getpid(); shutdownx = shm_malloc(sizeof(int)); if (!shutdownx){ LOG_NO_MEM("shm",sizeof(int)); goto error; } *shutdownx = 0; shutdownx_lock = lock_alloc(); if (!shutdownx_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } shutdownx_lock = lock_init(shutdownx_lock); handlers_lock = lock_alloc(); if (!handlers_lock){ LOG_NO_MEM("shm",sizeof(gen_lock_t)); goto error; } handlers_lock = lock_init(handlers_lock); handlers = shm_malloc(sizeof(handler_list)); if (!handlers){ LOG_NO_MEM("shm",sizeof(handler_list)); goto error; } handlers->head=0; handlers->tail=0; /* init the pid list */ pid_list = shm_malloc(sizeof(pid_list_head_t)); pid_list_lock = lock_alloc(); pid_list_lock = lock_init(pid_list_lock); /* init shared mem pointers before forking */ timer_cdp_init(); worker_init(); /* init the peer manager */ peer_manager_init(config); /* init the msg_handler */ //msg_timer_init(); /* init the session */ if (!session_init()) goto error; #ifdef CDP_FOR_SER /* init diameter transactions */ trans_init(); /* add callback for messages - used to implement the API */ cb_add(api_callback,0); #endif /*********** Added by Vitalis to initialize the transactions **********/ /* init diameter transactions */ trans_init(); /* add callback for messages - used to implement the API */ cb_add(api_callback,0); /*******End of addition ***********/ return 1; error: if (shutdownx) shm_free(shutdownx); if (config) free_dp_config(config); i = pid_list->head; while(i){ j = i->next; shm_free(i); i = j; } shm_free(pid_list); lock_get(pid_list_lock); lock_destroy(pid_list_lock); lock_dealloc((void*)pid_list_lock); return 0; }