int gate_attach(const char *zonename) { zdoor_handle_t zdoor_id; int res; // init the zdoor handle zdoor_id = zdoor_handle_init(); // and create the door for the sshd service res = zdoor_open(zdoor_id, zonename, (char*)gate_service_name, NULL, zdoor_gate_handler); #ifdef DEBUG if (res == 0) { fprintf(stderr, "sucessfully attached a door in zone: %s\n", zonename); } #endif//DEBUG return res; }
int main(int argc, char *argv[]) { //setvbuf(stdout,NULL,_IONBF,0); //setvbuf(stdin,NULL,_IONBF,0); zdoor_handle_t zdid = zdoor_handle_init(); #ifdef DEBUG fprintf(stderr, "[zonedoor] opening door in zone %s and service %s.\r\n", argv[1], argv[2]); fflush(stderr); #endif if (zdoor_open(zdid, argv[1], argv[2], "nomnom", server) < 0){ fprintf(stderr, "[zonedoor] opening door in zone %s and service %s.\r\n", argv[1], argv[2]); exit(1); } //while (getc(stdin) != EOF); pause(); zdoor_handle_destroy(zdid); }
/* the async job thread that handles opening/closing of doors */ void * job_thread(void *arg) { struct zdoor_handle *zhandle; int cont = 1; int res; /* first init the handle */ zhandle = zdoor_handle_init(); enif_mutex_lock(gbl.jlock); while (cont) { struct job *j; while (!gbl.jlist) enif_cond_wait(gbl.jcond, gbl.jlock); j = gbl.jlist; while (j) { gbl.jlist = j->next; enif_mutex_unlock(gbl.jlock); if (j->action == ACT_OPEN) { enif_rwlock_rwlock(gbl.dlock); j->door->next = NULL; if (gbl.dlist != NULL) j->door->next = gbl.dlist; gbl.dlist = j->door; enif_rwlock_rwunlock(gbl.dlock); res = zdoor_open(zhandle, j->door->zonename, j->door->service, j->door, zdoor_cb); ErlNifEnv *env = enif_alloc_env(); ERL_NIF_TERM ret = enif_make_atom(env, "ok"); switch (res) { case ZDOOR_ERROR: ret = enif_make_atom(env, "error"); break; case ZDOOR_NOT_GLOBAL_ZONE: ret = enif_make_atom(env, "not_global"); break; case ZDOOR_ZONE_NOT_RUNNING: ret = enif_make_atom(env, "not_running"); break; case ZDOOR_ZONE_FORBIDDEN: ret = enif_make_atom(env, "eperm"); break; case ZDOOR_ARGS_ERROR: ret = enif_make_atom(env, "badarg"); break; case ZDOOR_OUT_OF_MEMORY: ret = enif_make_atom(env, "enomem"); break; } enif_send(NULL, &j->owner, env, enif_make_tuple3(env, enif_make_atom(env, "zdoor_job"), enif_make_atom(env, "open"), ret)); enif_free_env(env); } else if (j->action == ACT_CLOSE) { enif_rwlock_rwlock(gbl.dlock); enif_rwlock_rwlock(j->door->rlock); if (j->door->rlist) { enif_rwlock_rwunlock(j->door->rlock); enif_rwlock_rwunlock(gbl.dlock); ErlNifEnv *env = enif_alloc_env(); enif_send(NULL, &j->owner, env, enif_make_tuple3(env, enif_make_atom(env, "zdoor_job"), enif_make_atom(env, "close"), enif_make_atom(env, "busy"))); enif_free_env(env); } else { struct door *d = gbl.dlist; if (d == j->door) { gbl.dlist = j->door->next; } else { for (; d; d = d->next) { if (d->next == j->door) break; } if (d) d->next = j->door->next; } enif_rwlock_rwunlock(gbl.dlock); zdoor_close(zhandle, j->door->zonename, j->door->service); door_free(j->door); ErlNifEnv *env = enif_alloc_env(); enif_send(NULL, &j->owner, env, enif_make_tuple3(env, enif_make_atom(env, "zdoor_job"), enif_make_atom(env, "close"), enif_make_atom(env, "ok"))); enif_free_env(env); } } else if (j->action == ACT_QUIT) { cont = 0; } enif_free(j); enif_mutex_lock(gbl.jlock); j = gbl.jlist; } } enif_mutex_unlock(gbl.jlock); zdoor_handle_destroy(zhandle); return NULL; }