int drmaa_control(const char *job_id, int action, char *errmsg, size_t errlen) { drmaa_session_t *c = NULL; int rc = 0; DEBUG(("-> drmaa_control(job_id=%s,action=%d)", job_id, action)); GET_DRMAA_SESSION(c); pthread_mutex_lock(&c->conn_mutex); switch (action) { /* * We cannot know whether we did suspend job * in other way than remembering this inside DRMAA session. */ case DRMAA_CONTROL_SUSPEND: drmaa_find_job(c, job_id, NULL, DRMAA_JOB_SUSPENDED); rc = pbs_sigjob(c->pbs_conn, (char*)job_id, "SIGSTOP", NULL); break; case DRMAA_CONTROL_RESUME: drmaa_find_job(c, job_id, NULL, DRMAA_JOB_RESUMED); rc = pbs_sigjob(c->pbs_conn, (char*)job_id, "SIGCONT", NULL); break; case DRMAA_CONTROL_HOLD: rc = pbs_holdjob(c->pbs_conn, (char*)job_id, USER_HOLD, NULL); break; case DRMAA_CONTROL_RELEASE: rc = pbs_rlsjob(c->pbs_conn, (char*)job_id, USER_HOLD, NULL); break; case DRMAA_CONTROL_TERMINATE: rc = pbs_deljob(c->pbs_conn, (char*)job_id, NULL); /* deldelay=N -- delay between SIGTERM and SIGKILL (default 0)*/ break; } pthread_mutex_unlock(&c->conn_mutex); RELEASE_DRMAA_SESSION(c); DEBUG(("<- drmaa_control() =%d", rc)); if (rc) RAISE_PBS(); else return DRMAA_ERRNO_SUCCESS; }
int main(int argc, char **argv, char **envp) /* qrls */ { int c; int errflg=0; int any_failed=0; int u_cnt, o_cnt, s_cnt, n_cnt, p_cnt; char *pc; char job_id[PBS_MAXCLTJOBID]; /* from the command line */ char job_id_out[PBS_MAXCLTJOBID]; char server_out[MAXSERVERNAME]; char rmt_server[MAXSERVERNAME]; #define MAX_HOLD_TYPE_LEN 32 char hold_type[MAX_HOLD_TYPE_LEN+1]; #define GETOPT_ARGS "h:" /*test for real deal or just version and exit*/ execution_mode(argc, argv); #ifdef WIN32 winsock_init(); #endif hold_type[0]='\0'; while ((c = getopt(argc, argv, GETOPT_ARGS)) != EOF) switch (c) { case 'h': while (isspace((int)*optarg)) optarg++; if (strlen(optarg) == 0) { fprintf(stderr, "qrls: illegal -h value\n"); errflg++; break; } pc = optarg; u_cnt = o_cnt = s_cnt = n_cnt = p_cnt = 0; while (*pc) { if (*pc == 'u') u_cnt++; else if (*pc == 'o') o_cnt++; else if (*pc == 's') s_cnt++; else if (*pc == 'p') p_cnt++; else if (*pc == 'n') n_cnt++; else { fprintf(stderr, "qrls: illegal -h value\n"); errflg++; break; } pc++; } if (n_cnt && (u_cnt + o_cnt + s_cnt + p_cnt)) { fprintf(stderr, "qrls: illegal -h value\n"); errflg++; break; } strcpy(hold_type, optarg); break; default : errflg++; } if (errflg || optind >= argc) { static char usage[]="usage: qrls [-h hold_list] job_identifier...\n"; static char usag2[]=" qrls --version\n"; fprintf(stderr, "%s", usage); fprintf(stderr, "%s", usag2); exit(2); } /*perform needed security library initializations (including none)*/ if (CS_client_init() != CS_SUCCESS) { fprintf(stderr, "qrls: unable to initialize security library.\n"); exit(1); } for (; optind < argc; optind++) { int connect; int stat=0; int located = FALSE; strcpy(job_id, argv[optind]); if (get_server(job_id, job_id_out, server_out)) { fprintf(stderr, "qrls: illegally formed job identifier: %s\n", job_id); any_failed = 1; continue; } cnt: connect = cnt2server(server_out); if (connect <= 0) { fprintf(stderr, "qrls: cannot connect to server %s (errno=%d)\n", pbs_server, pbs_errno); any_failed = pbs_errno; continue; } stat = pbs_rlsjob(connect, job_id_out, hold_type, NULL); if (stat && (pbs_errno != PBSE_UNKJOBID)) { prt_job_err("qrls", connect, job_id_out); any_failed = pbs_errno; } else if (stat && (pbs_errno == PBSE_UNKJOBID) && !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("qrls", connect, job_id_out); any_failed = pbs_errno; } pbs_disconnect(connect); } /*cleanup security library initializations before exiting*/ CS_close_app(); exit(any_failed); }