int sc_context_create(sc_context_t **ctx_out, const sc_context_param_t *parm) { sc_context_t *ctx; struct _sc_ctx_options opts; int r; if (ctx_out == NULL || parm == NULL) return SC_ERROR_INVALID_ARGUMENTS; ctx = calloc(1, sizeof(sc_context_t)); if (ctx == NULL) return SC_ERROR_OUT_OF_MEMORY; memset(&opts, 0, sizeof(opts)); /* set the application name if set in the parameter options */ if (parm->app_name != NULL) ctx->app_name = strdup(parm->app_name); else ctx->app_name = strdup("default"); if (ctx->app_name == NULL) { sc_release_context(ctx); return SC_ERROR_OUT_OF_MEMORY; } set_defaults(ctx, &opts); list_init(&ctx->readers); list_attributes_seeker(&ctx->readers, reader_list_seeker); /* set thread context and create mutex object (if specified) */ if (parm->thread_ctx != NULL) ctx->thread_ctx = parm->thread_ctx; r = sc_mutex_create(ctx, &ctx->mutex); if (r != SC_SUCCESS) { sc_release_context(ctx); return r; } process_config_file(ctx, &opts); sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "==================================="); /* first thing in the log */ sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "opensc version: %s", sc_get_version()); #ifdef HAVE_LTDL_H /* initialize ltdl, if available. See scdl.c for more information */ if (lt_dlinit() != 0) { sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "lt_dlinit() failed"); sc_release_context(ctx); return SC_ERROR_INTERNAL; } #endif #ifdef ENABLE_PCSC ctx->reader_driver = sc_get_pcsc_driver(); /* XXX: remove cardmod pseudoreader driver */ #ifdef ENABLE_MINIDRIVER if(strcmp(ctx->app_name, "cardmod") == 0) { ctx->reader_driver = sc_get_cardmod_driver(); } #endif #elif defined(ENABLE_CTAPI) ctx->reader_driver = sc_get_ctapi_driver(); #elif defined(ENABLE_OPENCT) ctx->reader_driver = sc_get_openct_driver(); #endif load_reader_driver_options(ctx); ctx->reader_driver->ops->init(ctx); load_card_drivers(ctx, &opts); load_card_atrs(ctx); if (opts.forced_card_driver) { /* FIXME: check return value? */ sc_set_card_driver(ctx, opts.forced_card_driver); free(opts.forced_card_driver); } del_drvs(&opts); sc_ctx_detect_readers(ctx); *ctx_out = ctx; return SC_SUCCESS; }
int qdel_main( int argc, char **argv, char **envp) { int c; int errflg = 0; int any_failed = 0; int purge_completed = FALSE; int located = FALSE; char *pc; bool dash_t = false; /* for array submission job handling */ int past_failure = 0; /* for multiple job submission error message tracking */ char job_id[PBS_MAXCLTJOBID]; /* from the command line */ char job_id_out[PBS_MAXCLTJOBID]; char server_out[MAXSERVERNAME] = ""; char rmt_server[MAXSERVERNAME] = ""; char extend[1024]; job_data_container attr; job_data *tmp_data = NULL; int client_retry = 0; #define GETOPT_ARGS "ab:cm:pW:t:" set_env_opts(&attr, envp); process_config_file(&attr); if (hash_find(&attr, "PBS_CLIENTRETRY", &tmp_data)) { client_retry = atoi(tmp_data->value.c_str()); } extend[0] = '\0'; while ((c = getopt(argc, argv, GETOPT_ARGS)) != EOF) { switch (c) { case 'a': /* Async job deletion */ if (extend[0] != '\0') { errflg++; break; } snprintf(extend, sizeof(extend), "%s", DELASYNC); break; case 'b': client_retry = atoi(optarg); break; case 'c': if (extend[0] != '\0') { errflg++; break; } snprintf(extend,sizeof(extend),"%s%ld",PURGECOMP,(long)(time(NULL))); purge_completed = TRUE; break; case 'm': /* add delete message */ if (extend[0] != '\0') { /* extension option already specified */ errflg++; break; } snprintf(extend, sizeof(extend), "%s", optarg); break; case 'p': if (extend[0] != '\0') { errflg++; break; } snprintf(extend, sizeof(extend), "%s1", DELPURGE); break; case 't': dash_t = true; if (extend[0] != '\0') { errflg++; break; } pc = optarg; if (strlen(pc) == 0) { fprintf(stderr, "qdel: illegal -t value (array range cannot be zero length)\n"); errflg++; break; } snprintf(extend,sizeof(extend),"%s%s", ARRAY_RANGE, pc); break; case 'W': if (extend[0] != '\0') { errflg++; break; } pc = optarg; if (strlen(pc) == 0) { fprintf(stderr, "qdel: illegal -W value\n"); errflg++; break; } while (*pc != '\0') { if (!isdigit(*pc)) { fprintf(stderr, "qdel: illegal -W value\n"); errflg++; break; } pc++; } snprintf(extend, sizeof(extend), "%s%s", DELDELAY, optarg); break; default: errflg++; break; } } /* END while (c) */ if (purge_completed) { snprintf(server_out, sizeof(server_out), "%s", pbs_default()); goto cnt; } if ((errflg != 0) || (optind >= argc)) { static char usage[] = "usage: qdel [{ -a | -c | -p | -t | -W delay | -m message}] [-b retry_seconds] [<JOBID>[<JOBID>]|'all'|'ALL']...\n"; fprintf(stderr, "%s", usage); fprintf(stderr, " -a -c, -m, -p, -t, and -W are mutually exclusive\n"); exit(2); } if (client_retry > 0) { cnt2server_conf(client_retry); /* set number of seconds to retry */ } for (;optind < argc;optind++) { int connect; int stat; /* check to see if user specified 'all' to delete all jobs */ snprintf(job_id, sizeof(job_id), "%s", argv[optind]); if ((dash_t == true) && is_array(job_id) == false) { fprintf(stderr, "qdel: Error: job id '%s' isn't a job array but -t was specified.\n", job_id); any_failed = 1; exit(any_failed); } if (get_server(job_id, job_id_out, sizeof(job_id_out), server_out, sizeof(server_out))) { fprintf(stderr, "qdel: illegally formed job identifier: %s\n", job_id); any_failed = 1; exit(any_failed); } cnt: connect = cnt2server(server_out); if (connect <= 0) { any_failed = -1 * connect; if(server_out[0] != 0) fprintf(stderr, "qdel: cannot connect to server %s (errno=%d) %s\n", server_out, any_failed, pbs_strerror(any_failed)); else fprintf(stderr, "qdel: cannot connect to server %s (errno=%d) %s\n", pbs_server, any_failed, pbs_strerror(any_failed)); continue; } int retries = 0; do { stat = pbs_deljob_err(connect, job_id_out, extend, &any_failed); if (any_failed == PBSE_TIMEOUT) { sleep(1); fprintf(stdout, "Connection to server timed out. Trying again"); } } while ((++retries < MAX_RETRIES) && (any_failed == PBSE_TIMEOUT)); if (past_failure == 0) past_failure = any_failed; if (stat && (any_failed != PBSE_UNKJOBID)) { if (!located) { located = TRUE; if (locate_job(job_id_out, server_out, rmt_server)) { pbs_disconnect(connect); strcpy(server_out, rmt_server); goto cnt; } } prt_job_err((char *)"qdel", connect, job_id_out); } if (!located && any_failed != 0 && strcasecmp(job_id, "all")) { fprintf(stderr, "qdel: nonexistent job id: %s\n", job_id); } pbs_disconnect(connect); } if ((past_failure != PBSE_NONE) && (any_failed == PBSE_NONE)) any_failed = past_failure; exit(any_failed); } /* END qdel_main() */