1
/*___INFO__MARK_BEGIN__*/
2
/*************************************************************************
4
* The Contents of this file are made available subject to the terms of
5
* the Sun Industry Standards Source License Version 1.2
7
* Sun Microsystems Inc., March, 2001
10
* Sun Industry Standards Source License Version 1.2
11
* =================================================
12
* The contents of this file are subject to the Sun Industry Standards
13
* Source License Version 1.2 (the "License"); You may not use this file
14
* except in compliance with the License. You may obtain a copy of the
15
* License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
17
* Software provided under this License is provided on an "AS IS" basis,
18
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
19
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
20
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
21
* See the License for the specific provisions governing your rights and
22
* obligations concerning the Software.
24
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
26
* Copyright: 2001 by Sun Microsystems, Inc.
28
* All Rights Reserved.
30
************************************************************************/
31
/*___INFO__MARK_END__*/
37
#include "sge_all_listsL.h"
38
#include "parse_qsubL.h"
39
#include "parse_job_cull.h"
40
#include "sge_mailrec.h"
41
#include "parse_qsub.h"
42
#include "sge_feature.h"
43
#include "sge_userset.h"
44
#include "sge_parse_num_par.h"
46
#include "sge_options.h"
49
#include "cull_parse_util.h"
50
#include "sge_string.h"
51
#include "sge_stdlib.h"
52
#include "sge_answer.h"
53
#include "sge_range.h"
55
#include "sge_ulong.h"
57
#include "sge_centry.h"
60
#include "sge_answer.h"
62
#include "msg_common.h"
64
static int sge_parse_priority(lList **alpp, int *valp, char *priority_str);
65
static int var_list_parse_from_environment(lList **lpp, char **envp);
66
static int sge_parse_hold_list(char *hold_str, u_long32 prog_number);
67
static int sge_parse_mail_options(lList **alpp, char *mail_str, u_long32 prog_number);
68
static int cull_parse_destination_identifier_list(lList **lpp, char *dest_str);
69
static int sge_parse_checkpoint_interval(char *time_str);
70
static int set_yn_option (lList **opts, u_long32 opt, char *arg, char *value,
79
** prog_number - program number (QSUB, QSH etc.)
80
** arg_list - argument string list, e.g. argv,
81
** knows qsub, qalter and qsh options
82
** envp - pointer to environment
83
** pcmdline - NULL or pointer to list, SPA_Type
84
** set to contain the parsed options
85
** flags - FLG_USE_PSEUDOS: apply the following syntax:
86
** the first non-switch token is the job script, what
87
** follows are job arguments, mark the tokens as "script"
88
** or "jobarg" in the SPA_switch field
89
** 0: dont do that, if a non-switch occurs, add it to
90
** the list with SPA_switch "" (an argument to a non-existing
92
** FLG_QALTER: change treatment of non-options to qalter-specific
93
** pseudo options (only if FLG_USE_PSEUDOS is given) and changes
97
** answer list, AN_Type or NULL if everything ok, the following stati can occur:
98
** STATUS_EUNKNOWN - bad internal error like NULL pointer received or no memory
99
** STATUS_EEXIST - option has been specified more than once, should be treated
101
** STATUS_ESEMANTIC - option that should have an argument had none
102
** STATUS_ESYNTAX - error parsing option argument
106
** MT-NOTE: cull_parse_cmdline() is MT safe
108
lList *cull_parse_cmdline(
109
u_long32 prog_number,
116
lList *answer = NULL;
118
char i_opt[SGE_PATH_MAX + 1];
121
u_long32 is_qalter = flags & FLG_QALTER;
122
bool is_hold_option = false;
123
int hard_soft_flag = 0;
125
DENTER(TOP_LAYER, "cull_parse_cmdline");
127
if (!arg_list || !pcmdline) {
128
answer_list_add(&answer, MSG_PARSE_NULLPOINTERRECEIVED,
129
STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR);
135
/* reset hard/soft flag */
139
/*----------------------------------------------------------------------------*/
142
if (!strcmp("-a", *sp)) {
145
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
146
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
147
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
150
/* next field(s) is "date_time" */
153
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
154
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,"-a");
159
if (!ulong_parse_date_time_from_string(&timeval, NULL, *sp)) {
160
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
161
MSG_ANSWER_WRONGTIMEFORMATEXSPECIFIEDTOAOPTION_S, *sp);
165
ep_opt = sge_add_arg(pcmdline, a_OPT, lUlongT, *(sp - 1), *sp);
166
lSetUlong(ep_opt, SPA_argval_lUlongT, timeval);
172
/*-----------------------------------------------------------------------------*/
173
/* "-A account_string" */
175
if (!strcmp("-A", *sp)) {
177
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
178
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
179
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
182
/* next field is account_string */
185
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
186
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-A");
190
DPRINTF(("\"-A %s\"\n", *sp));
192
ep_opt = sge_add_arg(pcmdline, A_OPT, lStringT, *(sp - 1), *sp);
193
lSetString(ep_opt, SPA_argval_lStringT, *sp);
199
/*----------------------------------------------------------------------------*/
205
if (prog_number == QRSTAT) {
206
/* "-ar advance_reservation */
208
if (!strcmp("-ar", *sp)) {
209
lList *ar_id_list = NULL;
213
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC,
214
ANSWER_QUALITY_ERROR,
215
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,
220
DPRINTF(("\"-ar %s\"\n", *sp));
222
ulong_list_parse_from_string(&ar_id_list, &answer, *sp, ",");
224
ep_opt = sge_add_arg(pcmdline, ar_OPT, lListT, *(sp - 1), *sp);
225
lSetList(ep_opt, SPA_argval_lListT, ar_id_list);
231
/* "-ar advance_reservation */
233
if (!strcmp("-ar", *sp)) {
239
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC,
240
ANSWER_QUALITY_ERROR,
241
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,
246
if (!parse_ulong_val(&ar_id_d, NULL, TYPE_INT, *sp, NULL, 0)) {
247
answer_list_add(&answer, MSG_PARSE_INVALID_AR_MUSTBEUINT,
248
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
254
answer_list_add(&answer, MSG_PARSE_INVALID_AR_MUSTBEUINT,
255
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
261
ep_opt = sge_add_arg(pcmdline, ar_OPT, lUlongT, *(sp - 1), *sp);
262
lSetUlong(ep_opt, SPA_argval_lUlongT, ar_id);
268
/*----------------------------------------------------------------------------*/
269
/* "-ac context_list */
270
if (!strcmp("-ac", *sp)) {
271
lList *variable_list = NULL;
272
lListElem* lep = NULL;
274
/* next field is context_list */
277
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
278
MSG_PARSE_ACOPTIONMUSTHAVECONTEXTLISTLISTARGUMENT);
282
DPRINTF(("\"-ac %s\"\n", *sp));
283
i_ret = var_list_parse_from_string(&variable_list, *sp, 0);
285
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
286
MSG_ANSWER_WRONGCONTEXTLISTFORMATAC_S , *sp);
289
ep_opt = sge_add_arg(pcmdline, ac_OPT, lListT, *(sp - 1), *sp);
290
lep = lCreateElem(VA_Type);
291
lSetString(lep, VA_variable, "+");
292
lInsertElem(variable_list, NULL, lep);
293
lSetList(ep_opt, SPA_argval_lListT, variable_list);
300
/*----------------------------------------------------------------------------*/
303
if (!is_qalter && !strcmp("-b", *sp)) {
304
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
305
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
306
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
309
/* next field is "y|n" */
312
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
313
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,"-b");
317
DPRINTF(("\"-b %s\"\n", *sp));
319
if (set_yn_option(pcmdline, b_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
328
/*-----------------------------------------------------------------------------*/
329
/* "-c [op] interval */
331
if (!strcmp("-c", *sp)) {
335
/* next field is [op] interval */
338
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
339
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-c");
343
DPRINTF(("\"%s %s\"\n", *(sp - 1), *sp));
345
attr = sge_parse_checkpoint_attr(*sp);
347
interval = sge_parse_checkpoint_interval(*sp);
349
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
350
MSG_PARSE_CARGUMENTINVALID);
353
ep_opt = sge_add_arg(pcmdline, c_OPT, lLongT, *(sp - 1), *sp);
354
lSetLong(ep_opt, SPA_argval_lLongT, (long) interval);
356
else if (attr == -1) {
357
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
358
MSG_PARSE_CSPECIFIERINVALID);
362
ep_opt = sge_add_arg(pcmdline, c_OPT, lIntT, *(sp - 1), *sp);
363
lSetInt(ep_opt, SPA_argval_lIntT, attr);
370
/*-----------------------------------------------------------------------------*/
371
/* "-cell cell_name or -ckpt ckpt_object" */
373
/* This is another small change that needed to be made to allow DRMAA to
374
* resuse this method. The -cat option doesn't actually exist for any
375
* command line utility. It is a qsub style representation of the
376
* DRMAA_JOB_CATEGORY attribute. It will be processed and removed by the
377
* drmaa_job2sge_job method. */
378
if (!strcmp ("-cat", *sp) || !strcmp("-cell", *sp) || !strcmp("-ckpt", *sp)) {
380
/* next field is job_cat or cell_name or ckpt_object*/
383
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
384
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, *(sp - 1));
388
DPRINTF(("\"%s %s\"\n", *(sp - 1), *sp));
390
ep_opt = sge_add_arg(pcmdline, 0, lStringT, *(sp - 1), *sp);
391
lSetString(ep_opt, SPA_argval_lStringT, *sp);
397
/*-----------------------------------------------------------------------------*/
400
if (!strcmp("-clear", *sp)) {
402
DPRINTF(("\"%s\"\n", *sp));
403
ep_opt = sge_add_noarg(pcmdline, clear_OPT, *sp, NULL);
409
/*-----------------------------------------------------------------------------*/
412
if (!strcmp("-explain", *sp)) {
414
DPRINTF(("\"%s\"\n", *sp));
415
ep_opt = sge_add_noarg(pcmdline, explain_OPT, *sp, NULL);
421
/*-----------------------------------------------------------------------------*/
424
if (!strcmp("-xml", *sp)) {
426
DPRINTF(("\"%s\"\n", *sp));
427
ep_opt = sge_add_noarg(pcmdline, xml_OPT, *sp, NULL);
433
/*-----------------------------------------------------------------------------*/
434
/* "-cwd" is mapped as -wd with NULL path, this case is handled in the second parsing stage*/
436
if (!strcmp("-cwd", *sp)) {
437
ep_opt = sge_add_noarg(pcmdline, wd_OPT, "-wd", NULL);
438
DPRINTF(("\"%s\"\n", *sp));
444
/*-----------------------------------------------------------------------------*/
445
/* "-C directive_prefix" */
446
if (!strcmp("-C", *sp)) {
448
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
449
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
450
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
453
/* next field is directive_prefix */
456
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
457
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-C");
461
DPRINTF(("\"-C %s\"\n", *sp));
463
ep_opt = sge_add_arg(pcmdline, C_OPT, lStringT, *(sp - 1), *sp);
465
if (strlen(*sp) > 0) {
466
lSetString(ep_opt, SPA_argval_lStringT, *sp);
473
/*----------------------------------------------------------------------------*/
475
if (!strcmp("-d", *sp)) {
479
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
480
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
481
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
484
/* next field is "time" */
487
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
488
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-d");
492
DPRINTF(("\"-d %s\"\n", *sp));
494
if (!parse_ulong_val(&timeval, NULL, TYPE_TIM, *sp, tmp, sizeof(tmp)-1)) {
495
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
496
MSG_ANSWER_WRONGTIMEFORMATEXSPECIFIEDTODOPTION_S, *sp);
500
ep_opt = sge_add_arg(pcmdline, d_OPT, lUlongT, *(sp-1), *sp);
501
lSetUlong(ep_opt, SPA_argval_lUlongT, timeval);
508
/*----------------------------------------------------------------------------*/
509
/* "-dc simple_context_list */
510
if (!strcmp("-dc", *sp)) {
511
lList *variable_list = NULL;
512
lListElem* lep = NULL;
514
/* next field is simple_context_list */
517
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
518
MSG_PARSE_DCOPTIONMUSTHAVESIMPLECONTEXTLISTARGUMENT);
522
DPRINTF(("\"-dc %s\"\n", *sp));
523
i_ret = var_list_parse_from_string(&variable_list, *sp, 0);
525
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
526
MSG_PARSE_WRONGCONTEXTLISTFORMATDC_S, *sp);
529
ep_opt = sge_add_arg(pcmdline, dc_OPT, lListT, *(sp - 1), *sp);
530
lep = lCreateElem(VA_Type);
531
lSetString(lep, VA_variable, "-");
532
lInsertElem(variable_list, NULL, lep);
533
lSetList(ep_opt, SPA_argval_lListT, variable_list);
541
/*----------------------------------------------------------------------------*/
542
/* "-display -- only for qsh " */
544
if (!strcmp("-display", *sp)) {
545
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
546
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
547
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
550
/* next field is display to redirect interactive jobs to */
553
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
554
MSG_PARSE_DISPLAYOPTIONMUSTHAVEARGUMENT);
558
DPRINTF(("\"-display %s\"\n", *sp));
560
ep_opt = sge_add_arg(pcmdline, display_OPT, lStringT, *(sp - 1), *sp);
561
lSetString(ep_opt, SPA_argval_lStringT, *sp);
568
/*----------------------------------------------------------------------------*/
571
if (!strcmp("-dl", *sp)) {
574
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
575
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
576
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
579
/* next field(s) is "date_time" */
582
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
583
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,"-dl");
587
if (!ulong_parse_date_time_from_string(&timeval, NULL, *sp)) {
588
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
589
MSG_PARSE_WRONGTIMEFORMATXSPECTODLOPTION_S, *sp);
593
ep_opt = sge_add_arg(pcmdline, dl_OPT, lUlongT, *(sp - 1), *sp);
594
lSetUlong(ep_opt, SPA_argval_lUlongT, timeval);
600
/*----------------------------------------------------------------------------*/
604
if (!strcmp("-e", *sp)) {
605
lList *path_list = NULL;
607
if (prog_number == QRSUB) {
608
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
609
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
610
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
616
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
617
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-e");
621
DPRINTF(("\"-e %s\"\n", *sp));
623
if (prog_number == QRSUB) {
625
if (!ulong_parse_date_time_from_string(&timeval, NULL, *sp)) {
626
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
627
MSG_ANSWER_WRONGTIMEFORMATEXSPECIFIEDTOAOPTION_S, *sp);
630
ep_opt = sge_add_arg(pcmdline, e_OPT, lUlongT, *(sp-1), *sp);
631
lSetUlong(ep_opt, SPA_argval_lUlongT, timeval);
633
/* next field is path_name */
634
i_ret = cull_parse_path_list(&path_list, *sp);
636
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
637
MSG_PARSE_WRONGPATHLISTFORMATXSPECTOEOPTION_S, *sp);
640
ep_opt = sge_add_arg(pcmdline, e_OPT, lListT, *(sp-1), *sp);
641
lSetList(ep_opt, SPA_argval_lListT, path_list);
648
/*----------------------------------------------------------------------------*/
652
if (!strcmp("-i", *sp)) {
653
lList *path_list = NULL;
655
/* next field is path_name */
658
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
659
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-i");
663
DPRINTF(("\"-i %s\"\n", *sp));
665
i_ret = cull_parse_path_list(&path_list, *sp);
667
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
668
MSG_PARSE_WRONGPATHLISTFORMATXSPECTOEOPTION_S, *sp);
671
ep_opt = sge_add_arg(pcmdline, i_OPT, lListT, *(sp - 1), *sp);
672
lSetList(ep_opt, SPA_argval_lListT, path_list);
674
/* Save it for later comparison */
681
/*-----------------------------------------------------------------------------*/
682
/* "-h [hold_list]" */
684
if (!strcmp("-h", *sp)) {
688
is_hold_option = true;
691
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
692
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
693
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
697
/* next field is hold_list */
700
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
701
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,"-h");
704
hold = sge_parse_hold_list(*sp, prog_number);
706
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
707
MSG_PARSE_UNKNOWNHOLDLISTXSPECTOHOPTION_S, *sp);
713
hold = MINUS_H_TGT_USER;
715
DPRINTF(("\"-h %s\"\n", *sp));
717
ep_opt = sge_add_arg(pcmdline, h_OPT, lIntT, cmd_switch, cmd_arg);
718
lSetInt(ep_opt, SPA_argval_lIntT, hold);
724
/*-----------------------------------------------------------------------------*/
727
if (!strcmp("-hard", *sp)) {
729
DPRINTF(("\"%s\"\n", *sp));
732
ep_opt = sge_add_noarg(pcmdline, hard_OPT, *sp, NULL);
738
/*----------------------------------------------------------------------------*/
741
if(!strcmp("-he", *sp)) {
742
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
744
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S,
746
answer_list_add(&answer, str, STATUS_EEXIST, ANSWER_QUALITY_WARNING);
748
/* next field is yes/no switch */
751
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
752
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-he");
756
DPRINTF(("\"-he %s\"\n", *sp));
758
if (set_yn_option(pcmdline, he_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
765
/*-----------------------------------------------------------------------------*/
768
if (!strcmp("-help", *sp)) {
769
DPRINTF(("\"%s\"\n", *sp));
771
ep_opt = sge_add_noarg(pcmdline, help_OPT, *sp, NULL);
778
/*-----------------------------------------------------------------------------*/
779
/* "-hold_jid jid[,jid,...]" */
781
if (!strcmp("-hold_jid", *sp)) {
782
lList *jid_hold_list = NULL;
784
/* next field is hold_list */
787
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
788
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-hold_jid");
792
DPRINTF(("\"-hold_jid %s\"\n", *sp));
793
i_ret = cull_parse_jid_hold_list(&jid_hold_list, *sp);
795
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
796
MSG_PARSE_WRONGJIDHOLDLISTFORMATXSPECTOHOLDJIDOPTION_S, *sp);
799
ep_opt = sge_add_arg(pcmdline, hold_jid_OPT, lListT, *(sp - 1), *sp);
800
lSetList(ep_opt, SPA_argval_lListT, jid_hold_list);
806
/*-----------------------------------------------------------------------------*/
807
/* "-hold_jid_ad jid[,jid,...]" */
809
if (!strcmp("-hold_jid_ad", *sp)) {
810
lList *jid_ad_hold_list = NULL;
812
/* next field is hold_list */
815
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
816
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-hold_jid_ad");
820
DPRINTF(("\"-hold_jid_ad %s\"\n", *sp));
821
i_ret = cull_parse_jid_hold_list(&jid_ad_hold_list, *sp);
823
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
824
MSG_PARSE_WRONGJIDHOLDLISTFORMATXSPECTOHOLDJIDADOPTION_S, *sp);
827
ep_opt = sge_add_arg(pcmdline, hold_jid_ad_OPT, lListT, *(sp - 1), *sp);
828
lSetList(ep_opt, SPA_argval_lListT, jid_ad_hold_list);
834
/*-----------------------------------------------------------------------------*/
837
if (!strcmp("-j", *sp)) {
839
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
840
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
841
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
844
/* next field is "y|n" */
847
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
848
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-j");
852
DPRINTF(("\"-j %s\"\n", *sp));
854
if (set_yn_option(pcmdline, j_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
862
/*----------------------------------------------------------------------------*/
865
if (!strcmp("-js", *sp)) {
871
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
872
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-js");
876
if (!parse_ulong_val(&jobshare_d, NULL, TYPE_INT, *sp, NULL, 0)) {
877
answer_list_add(&answer, MSG_PARSE_INVALIDJOBSHAREMUSTBEUINT,
878
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
884
if (jobshare_d < 0) {
885
answer_list_add(&answer, MSG_PARSE_INVALIDJOBSHAREMUSTBEUINT,
886
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
891
jobshare = jobshare_d;
893
ep_opt = sge_add_arg(pcmdline, js_OPT, lUlongT, *(sp - 1), *sp);
894
lSetUlong(ep_opt, SPA_argval_lUlongT, jobshare);
900
/*---------------------------------------------------------------------------*/
901
/* "-l resource_list" */
903
if (!strcmp("-l", *sp)) {
904
lList *resource_list = NULL;
906
/* next field is resource_list */
909
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
910
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-l" );
914
DPRINTF(("\"-l %s\"\n", *sp));
916
resource_list = centry_list_parse_from_string(NULL, *sp, false);
917
if (!resource_list) {
918
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
919
MSG_PARSE_WRONGRESOURCELISTFORMATXSPECTOLOPTION_S, *sp);
923
ep_opt = sge_add_arg(pcmdline, l_OPT, lListT, *(sp - 1), *sp);
924
lSetList(ep_opt, SPA_argval_lListT, resource_list);
925
lSetInt(ep_opt, SPA_argval_lIntT, hard_soft_flag);
932
/*----------------------------------------------------------------------------*/
933
/* "-m mail_options */
935
if (!strcmp("-m", *sp)) {
938
/* next field is mail_options */
941
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
942
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-m");
946
DPRINTF(("\"-m %s\"\n", *sp));
947
mail_options = sge_parse_mail_options(&answer, *sp, prog_number);
949
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
950
MSG_PARSE_WRONGMAILOPTIONSLISTFORMATXSPECTOMOPTION_S, *sp);
954
ep_opt = sge_add_arg(pcmdline, m_OPT, lIntT, *(sp - 1), *sp);
955
lSetInt(ep_opt, SPA_argval_lIntT, mail_options);
961
/*-----------------------------------------------------------------------------*/
962
/* "-masterq destination_identifier_list" */
964
if (!strcmp("-masterq", *sp)) {
965
lList *id_list = NULL;
967
/* next field is destination_identifier */
970
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
971
MSG_PARSE_XOPTIONMUSTHAVEDESTIDLISTARGUMENT_S, "-masterq");
975
DPRINTF(("\"-masterq %s\"\n", *sp));
976
i_ret = cull_parse_destination_identifier_list(&id_list, *sp);
978
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
979
MSG_PARSE_WRONGDESTIDLISTFORMATXSPECTOXOPTION_SS, *sp, "-masterq");
982
ep_opt = sge_add_arg(pcmdline, masterq_OPT, lListT, *(sp - 1), *sp);
983
lSetList(ep_opt, SPA_argval_lListT, id_list);
984
lSetInt(ep_opt, SPA_argval_lIntT, 0);
990
/*-----------------------------------------------------------------------------*/
993
if (!strcmp("-M", *sp)) {
994
lList *mail_list = NULL;
996
/* next field is mail_list */
999
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1000
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-M" );
1004
DPRINTF(("\"-M %s\"\n", *sp));
1006
i_ret = mailrec_parse(&mail_list, *sp);
1008
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1009
MSG_PARSE_WRONGMAILLISTFORMATXSPECTOMOPTION_S, *sp);
1012
ep_opt = sge_add_arg(pcmdline, M_OPT, lListT, *(sp - 1), *sp);
1013
lSetList(ep_opt, SPA_argval_lListT, mail_list);
1019
/*----------------------------------------------------------------------------*/
1022
if (!strcmp("-N", *sp)) {
1024
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1025
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1026
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
1029
/* next field is name */
1032
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1033
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-N" );
1036
if (strchr(*sp, '/')) {
1037
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1038
MSG_PARSE_ARGUMENTTONOPTIONMUSTNOTCONTAINBSL );
1043
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1044
MSG_PARSE_EMPTYSTRINGARGUMENTTONOPTIONINVALID );
1048
DPRINTF(("\"-N %s\"\n", *sp));
1049
ep_opt = sge_add_arg(pcmdline, N_OPT, lStringT, *(sp - 1), *sp);
1050
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1056
/*----------------------------------------------------------------------------*/
1059
if (!strcmp("-notify", *sp)) {
1061
DPRINTF(("\"-notify\"\n"));
1063
ep_opt = sge_add_noarg(pcmdline, notify_OPT, *sp, NULL);
1069
/*----------------------------------------------------------------------------*/
1070
/* -now y[es]|n[o] */
1072
if(!strcmp("-now", *sp)) {
1073
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1074
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1075
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp);
1077
/* next field is yes/no switch */
1080
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1081
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-now" );
1085
DPRINTF(("\"-now %s\"\n", *sp));
1087
if (set_yn_option(pcmdline, now_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
1095
/*----------------------------------------------------------------------------*/
1096
/* "-o path_name" */
1098
if (!strcmp("-o", *sp)) {
1099
lList *stdout_path_list = NULL;
1101
/* next field is path_name */
1104
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1105
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-o" );
1109
DPRINTF(("\"-o %s\"\n", *sp));
1110
i_ret = cull_parse_path_list(&stdout_path_list, *sp);
1112
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1113
MSG_PARSE_WRONGSTDOUTPATHLISTFORMATXSPECTOOOPTION_S, *sp );
1116
ep_opt = sge_add_arg(pcmdline, o_OPT, lListT, *(sp - 1), *sp);
1117
lSetList(ep_opt, SPA_argval_lListT, stdout_path_list);
1119
if (i_opt != NULL) {
1120
if (strcmp(i_opt, *sp) == 0) {
1121
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1122
MSG_PARSE_SAMEPATHFORINPUTANDOUTPUT_SS, i_opt, *sp );
1131
/*----------------------------------------------------------------------------*/
1132
/* "-ot override tickets */
1134
if (!strcmp("-ot", *sp)) {
1140
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1141
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-ot");
1145
if (!parse_ulong_val(&otickets_d, NULL, TYPE_INT, *sp, NULL, 0)) {
1146
answer_list_add(&answer, MSG_PARSE_INVALIDOTICKETSMUSTBEUINT,
1147
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1152
if (otickets_d < 0) {
1153
answer_list_add(&answer, MSG_PARSE_INVALIDOTICKETSMUSTBEUINT,
1154
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1158
otickets = otickets_d;
1160
ep_opt = sge_add_arg(pcmdline, ot_OPT, lIntT, *(sp - 1), *sp);
1161
lSetUlong(ep_opt, SPA_argval_lUlongT, otickets);
1167
/*----------------------------------------------------------------------------*/
1170
if (!strcmp("-p", *sp)) {
1175
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1176
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-p" );
1180
if (sge_parse_priority(&answer, &priority, *sp)) {
1184
ep_opt = sge_add_arg(pcmdline, p_OPT, lIntT, *(sp - 1), *sp);
1185
lSetInt(ep_opt, SPA_argval_lIntT, priority);
1191
/*----------------------------------------------------------------------------*/
1195
if (!strcmp("-P", *sp)) {
1197
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1198
sprintf(str, MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S,
1200
answer_list_add(&answer, str, STATUS_EEXIST, ANSWER_QUALITY_WARNING);
1203
/* next field is the projects name */
1206
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1207
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-P");
1211
DPRINTF(("\"-P %s\"\n", *sp));
1212
ep_opt = sge_add_arg(pcmdline, P_OPT, lStringT, *(sp - 1), *sp);
1213
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1219
/*----------------------------------------------------------------------------*/
1220
if (!strcmp("-pe", *sp)) {
1221
lList *pe_range = NULL;
1222
dstring d_arg = DSTRING_INIT;
1224
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1225
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1226
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp );
1229
/* next field must be the pe_name ... */
1232
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1233
MSG_PARSE_PEOPTIONMUSTHAVEPENAMEARGUMENT );
1234
sge_dstring_free(&d_arg);
1238
/* ... followed by a range */
1241
answer_list_add(&answer, MSG_PARSE_PEOPTIONMUSTHAVERANGEAS2NDARGUMENT,
1242
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1243
sge_dstring_free(&d_arg);
1247
range_list_parse_from_string(&pe_range, &answer, *sp,
1248
false, false, INF_ALLOWED);
1251
sge_dstring_free(&d_arg);
1254
sge_dstring_append(&d_arg, *(sp-1));
1255
sge_dstring_append(&d_arg, " ");
1256
sge_dstring_append(&d_arg, *sp);
1257
ep_opt = sge_add_arg(pcmdline, pe_OPT, lStringT, *(sp - 2), sge_dstring_get_string(&d_arg));
1258
lSetString(ep_opt, SPA_argval_lStringT, *(sp - 1));
1259
lSetList(ep_opt, SPA_argval_lListT, pe_range);
1263
sge_dstring_free(&d_arg);
1267
/*-----------------------------------------------------------------------------*/
1268
/* "-q destination_identifier_list" */
1270
if (!strcmp("-q", *sp)) {
1271
lList *id_list = NULL;
1273
/* next field is destination_identifier */
1276
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1277
MSG_PARSE_XOPTIONMUSTHAVEDESTIDLISTARGUMENT_S, "-q");
1281
DPRINTF(("\"-q %s\"\n", *sp));
1282
i_ret = cull_parse_destination_identifier_list(&id_list, *sp);
1284
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1285
MSG_PARSE_WRONGDESTIDLISTFORMATXSPECTOXOPTION_SS, *sp, "-q");
1288
ep_opt = sge_add_arg(pcmdline, q_OPT, lListT, *(sp - 1), *sp);
1289
lSetList(ep_opt, SPA_argval_lListT, id_list);
1290
lSetInt(ep_opt, SPA_argval_lIntT, hard_soft_flag);
1296
/*-----------------------------------------------------------------------------*/
1299
if (!strcmp("-r", *sp)) {
1302
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1303
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1304
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp );
1307
/* next field is "y|n" */
1310
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1311
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-r" );
1315
DPRINTF(("\"-r %s\"\n", *sp));
1317
if ((strcasecmp("y", *sp) == 0) || (strcasecmp("yes", *sp) == 0)) {
1318
ep_opt = sge_add_arg(pcmdline, r_OPT, lIntT, *(sp - 1), *sp);
1319
lSetInt(ep_opt, SPA_argval_lIntT, 1);
1320
} else if ((strcasecmp ("n", *sp) == 0) || (strcasecmp ("no", *sp) == 0)) {
1321
ep_opt = sge_add_arg(pcmdline, r_OPT, lIntT, *(sp - 1), *sp);
1322
lSetInt(ep_opt, SPA_argval_lIntT, 2);
1324
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1325
MSG_PARSE_INVALIDOPTIONARGUMENTRX_S, *sp );
1334
/*-----------------------------------------------------------------------------*/
1337
if (!strcmp("-R", *sp)) {
1339
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1340
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1341
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp );
1344
/* next field is "y|n" */
1347
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1348
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-R" );
1352
DPRINTF(("\"-R %s\"\n", *sp));
1354
if (set_yn_option(pcmdline, R_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
1362
/*-----------------------------------------------------------------------------*/
1363
/* "-sc variable_list" */
1366
if (!strcmp("-sc", *sp)) {
1367
lList *variable_list = NULL;
1368
lListElem* lep = NULL;
1370
/* next field is context_list [ == variable_list ] */
1373
answer_list_add(&answer, MSG_PARSE_SCOPTIONMUSTHAVECONTEXTLISTARGUMENT,
1374
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1378
DPRINTF(("\"-sc %s\"\n", *sp));
1379
i_ret = var_list_parse_from_string(&variable_list, *sp, 0);
1381
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1382
MSG_PARSE_WRONGCONTEXTLISTFORMATSCX_S, *sp );
1385
ep_opt = sge_add_arg(pcmdline, sc_OPT, lListT, *(sp - 1), *sp);
1386
lep = lCreateElem(VA_Type);
1387
lSetString(lep, VA_variable, "=");
1388
lInsertElem(variable_list, NULL, lep);
1389
lSetList(ep_opt, SPA_argval_lListT, variable_list);
1395
/*-----------------------------------------------------------------------------*/
1398
if (!strcmp("-soft", *sp)) {
1400
DPRINTF(("\"%s\"\n", *sp));
1402
ep_opt = sge_add_noarg(pcmdline, soft_OPT, *sp, NULL);
1408
/*----------------------------------------------------------------------------*/
1411
if (!is_qalter && !strcmp("-shell", *sp)) {
1412
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1413
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1414
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp );
1417
/* next field is "y|n" */
1420
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1421
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-shell");
1425
DPRINTF(("\"-shell %s\"\n", *sp));
1427
if (set_yn_option (pcmdline, shell_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
1436
/*----------------------------------------------------------------------------*/
1437
/* -sync y[es]|n[o] */
1439
if(!strcmp("-sync", *sp)) {
1440
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1441
answer_list_add_sprintf(&answer, STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1442
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S, *sp );
1444
/* next field is yes/no switch */
1447
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1448
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-sync" );
1452
DPRINTF(("\"-sync %s\"\n", *sp));
1454
if (set_yn_option (pcmdline, sync_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
1462
/*----------------------------------------------------------------------------*/
1463
/* "-S path_name" */
1465
if (!strcmp("-S", *sp)) {
1466
lList *shell_list = NULL;
1468
/* next field is path_name */
1471
answer_list_add(&answer, MSG_PARSE_SOPTIONMUSTHAVEPATHNAMEARGUMENT, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1475
DPRINTF(("\"-S %s\"\n", *sp));
1477
i_ret = cull_parse_path_list(&shell_list, *sp);
1479
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1480
MSG_PARSE_WRONGSHELLLISTFORMATXSPECTOSOPTION_S, *sp );
1483
ep_opt = sge_add_arg(pcmdline, S_OPT, lListT, *(sp - 1), *sp);
1484
lSetList(ep_opt, SPA_argval_lListT, shell_list);
1490
/*----------------------------------------------------------------------------*/
1494
if (!strcmp("-t", *sp)) {
1495
lList *task_id_range_list = NULL;
1497
/* next field is path_name */
1500
answer_list_add(&answer, MSG_PARSE_TOPTIONMUSTHAVEALISTOFTASKIDRANGES, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1504
DPRINTF(("\"-t %s\"\n", *sp));
1506
range_list_parse_from_string(&task_id_range_list, &answer, *sp,
1507
false, true, INF_NOT_ALLOWED);
1508
if (!task_id_range_list) {
1512
range_list_sort_uniq_compress(task_id_range_list, &answer, false);
1513
if (lGetNumberOfElem(task_id_range_list) > 1) {
1514
answer_list_add(&answer, MSG_QCONF_ONLYONERANGE, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR);
1515
lFreeList(&task_id_range_list);
1520
ep_opt = sge_add_arg(pcmdline, t_OPT, lListT, *(sp - 1), *sp);
1521
lSetList(ep_opt, SPA_argval_lListT, task_id_range_list);
1527
/*-----------------------------------------------------------------------------*/
1530
if(!strcmp("-terse", *sp)) {
1531
ep_opt = sge_add_noarg(pcmdline, terse_OPT, *sp, NULL);
1536
/*-----------------------------------------------------------------------------*/
1538
if (!strcmp("-u", *sp)) {
1539
lList *user_list = NULL;
1541
/* next field is user_list */
1544
answer_list_add(&answer, MSG_PARSE_UOPTMUSTHAVEALISTUSERNAMES,
1545
STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1549
DPRINTF(("\"-u %s\"\n", *sp));
1551
if (prog_number == QRSUB) {
1552
int rule[] = {ARA_name, 0};
1556
tmp = sge_strdup(NULL, *sp);
1557
dest = string_list(tmp, ",", NULL);
1558
cull_parse_string_list(dest, "user_list", ARA_Type, rule, &user_list);
1562
str_list_parse_from_string(&user_list, *sp, ",");
1565
ep_opt = sge_add_arg(pcmdline, u_OPT, lListT, *(sp - 1), *sp);
1566
lSetList(ep_opt, SPA_argval_lListT, user_list);
1572
/*-----------------------------------------------------------------------------*/
1574
if (!strcmp("-uall", *sp)) {
1575
ep_opt = sge_add_noarg(pcmdline, u_OPT, *sp, NULL);
1577
DPRINTF(("\"-uall \"\n"));
1583
/*-----------------------------------------------------------------------------*/
1584
/* "-v variable_list" */
1586
if (!strcmp("-v", *sp)) {
1587
lList *variable_list = NULL;
1589
/* next field is variable_list */
1592
answer_list_add(&answer, MSG_PARSE_VOPTMUSTHAVEVARIABLELISTARGUMENT, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1596
DPRINTF(("\"-v %s\"\n", *sp));
1598
i_ret = var_list_parse_from_string(&variable_list, *sp, 1);
1600
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1601
MSG_PARSE_WRONGVARIABLELISTFORMATVORENVIRONMENTVARIABLENOTSET_S, *sp );
1604
ep_opt = sge_add_arg(pcmdline, v_OPT, lListT, *(sp - 1), *sp);
1605
lSetList(ep_opt, SPA_argval_lListT, variable_list);
1611
/*-----------------------------------------------------------------------------*/
1614
if (!strcmp("-verify", *sp)) {
1616
DPRINTF(("\"%s\"\n", *sp));
1617
ep_opt = sge_add_noarg(pcmdline, verify_OPT, *sp, NULL);
1623
/*-----------------------------------------------------------------------------*/
1626
if (!strcmp("-V", *sp)) {
1627
lList *env_list = NULL;
1629
DPRINTF(("\"%s\"\n", *sp));
1630
i_ret = var_list_parse_from_environment(&env_list, envp);
1632
answer_list_add(&answer, MSG_PARSE_COULDNOTPARSEENVIRIONMENT, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR);
1635
ep_opt = sge_add_arg(pcmdline, V_OPT, lListT, *sp, "");
1636
lSetList(ep_opt, SPA_argval_lListT, env_list);
1642
/*-----------------------------------------------------------------------------*/
1645
if (!strcmp("-w", *sp)) {
1648
if (lGetElemStr(*pcmdline, SPA_switch, *sp)) {
1649
answer_list_add_sprintf(&answer,STATUS_EEXIST, ANSWER_QUALITY_WARNING,
1650
MSG_PARSE_XOPTIONALREADYSETOVERWRITINGSETING_S,
1654
/* next field is "e|w|n|v" */
1657
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1658
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-w");
1662
DPRINTF(("\"-w %s\"\n", *sp));
1664
if (!strcmp("e", *sp)) {
1665
ep_opt = sge_add_arg(pcmdline, r_OPT, lIntT, *(sp - 1), *sp);
1666
if (prog_number == QRSUB) {
1667
lSetInt(ep_opt, SPA_argval_lIntT, AR_ERROR_VERIFY);
1669
lSetInt(ep_opt, SPA_argval_lIntT, ERROR_VERIFY);
1672
else if (!strcmp("w", *sp)) {
1673
if (prog_number == QRSUB) {
1674
answer_list_add_sprintf(&answer,STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1675
MSG_PARSE_INVALIDOPTIONARGUMENTWX_S, *sp);
1678
ep_opt = sge_add_arg(pcmdline, r_OPT, lIntT, *(sp - 1), *sp);
1680
lSetInt(ep_opt, SPA_argval_lIntT, WARNING_VERIFY);
1682
else if (!strcmp("n", *sp)) {
1683
ep_opt = sge_add_arg(pcmdline, r_OPT, lIntT, *(sp - 1), *sp);
1684
if (prog_number == QRSUB) {
1685
answer_list_add_sprintf(&answer,STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1686
MSG_PARSE_INVALIDOPTIONARGUMENTWX_S, *sp);
1689
lSetInt(ep_opt, SPA_argval_lIntT, SKIP_VERIFY);
1692
else if (!strcmp("v", *sp)) {
1693
ep_opt = sge_add_arg(pcmdline, r_OPT, lIntT, *(sp - 1), *sp);
1694
if (prog_number == QRSUB) {
1695
lSetInt(ep_opt, SPA_argval_lIntT, AR_JUST_VERIFY);
1697
lSetInt(ep_opt, SPA_argval_lIntT, JUST_VERIFY);
1700
answer_list_add_sprintf(&answer,STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1701
MSG_PARSE_INVALIDOPTIONARGUMENTWX_S, *sp);
1709
/*-----------------------------------------------------------------------------*/
1712
if (!strcmp("-wd", *sp)) {
1716
answer_list_add_sprintf(&answer,STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1717
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, *(sp - 1));
1721
ep_opt = sge_add_arg(pcmdline, wd_OPT, lStringT, "-wd", *sp);
1722
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1728
/*-----------------------------------------------------------------------------*/
1730
/* reentrancy is built upon here */
1732
if (!strcmp("-@", *sp)) {
1739
sprintf(str, MSG_PARSE_ATSIGNOPTIONMUSTHAVEFILEARGUMENT);
1740
answer_list_add(&answer, str, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1745
DPRINTF(("\"-@ %s\"\n", *sp));
1747
alp = parse_script_file(prog_number, *sp, "", pcmdline, envp, FLG_USE_NO_PSEUDOS); /* MT-NOTE: !!!! */
1748
for_each(aep, alp) {
1751
quality = lGetUlong(aep, AN_quality);
1752
if (quality == ANSWER_QUALITY_ERROR) {
1755
lAppendElem(answer, lCopyElem(aep));
1768
/*-----------------------------------------------------------------------------*/
1769
/* "-verbose" - accept, but do nothing, must be handled by caller */
1771
if(!strcmp("-verbose", *sp)) {
1772
ep_opt = sge_add_noarg(pcmdline, verbose_OPT, *sp, NULL);
1776
/*-----------------------------------------------------------------------------*/
1777
/* "-inherit" - accept, but do nothing, must be handled by caller */
1779
if(!strcmp("-inherit", *sp)) {
1780
ep_opt = sge_add_noarg(pcmdline, inherit_OPT, *sp, NULL);
1784
/*-----------------------------------------------------------------------------*/
1785
/* "-pty" - accept, but do nothing, must be handled by caller */
1787
if(!strcmp("-pty", *sp)) {
1788
/* next field is "y|n" */
1791
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1792
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S,"-pty");
1796
DPRINTF(("\"-pty %s\"\n", *sp));
1798
if (set_yn_option(pcmdline, pty_OPT, *(sp - 1), *sp, &answer) != STATUS_OK) {
1805
/*-----------------------------------------------------------------------------*/
1806
/* "-nostdin" - accept, but do nothing, must be handled by caller */
1808
if(!strcmp("-nostdin", *sp)) {
1809
ep_opt = sge_add_noarg(pcmdline, nostdin_OPT, *sp, NULL);
1813
/*-----------------------------------------------------------------------------*/
1814
/* "-noshell" - accept, but do nothing, must be handled by caller */
1816
if(!strcmp("-noshell", *sp)) {
1817
ep_opt = sge_add_noarg(pcmdline, noshell_OPT, *sp, NULL);
1821
/*-----------------------------------------------------------------------------*/
1824
if (!strncmp("-", *sp, 1) && strcmp("--", *sp)) {
1825
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1826
MSG_PARSE_INVALIDOPTIONARGUMENTX_S, *sp );
1830
/*-----------------------------------------------------------------------------*/
1831
/* - for read script from stdin */
1833
if (!strcmp("-", *sp)) {
1834
DPRINTF(("\"%s\"\n", *sp));
1836
if ((flags & FLG_USE_PSEUDOS)) {
1838
ep_opt = sge_add_arg(pcmdline, 0, lStringT, STR_PSEUDO_SCRIPT, NULL);
1839
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1840
for (sp++; *sp; sp++) {
1841
ep_opt = sge_add_arg(pcmdline, 0, lStringT, STR_PSEUDO_JOBARG, NULL);
1842
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1845
answer_list_add_sprintf(&answer, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
1846
MSG_PARSE_INVALIDOPTIONARGUMENTX_S, *sp);
1852
ep_opt = sge_add_noarg(pcmdline, 0, *sp, NULL);
1859
/*-----------------------------------------------------------------------------*/
1860
/* -- separator for qalter between job ids and job args */
1862
if (!strcmp("--", *sp)) {
1863
DPRINTF(("\"%s\"\n", *sp));
1865
if ((flags & FLG_USE_PSEUDOS)) {
1868
answer_list_add(&answer, MSG_PARSE_OPTIONMUSTBEFOLLOWEDBYJOBARGUMENTS, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR);
1872
ep_opt = sge_add_arg(pcmdline, 0, lStringT, STR_PSEUDO_JOBARG, NULL);
1873
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1878
ep_opt = sge_add_noarg(pcmdline, 0, *sp, NULL);
1885
/*-----------------------------------------------------------------------------*/
1887
DPRINTF(("===%s===\n", *sp));
1890
** with qsub and qsh this can only
1891
** be a script file, remember this
1892
** in case of qalter we need jobids
1894
if ((flags & FLG_USE_PSEUDOS)) {
1896
ep_opt = sge_add_arg(pcmdline, 0, lStringT, STR_PSEUDO_SCRIPT, NULL);
1897
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1898
for (sp++; *sp; sp++) {
1899
ep_opt = sge_add_arg(pcmdline, 0, lStringT, STR_PSEUDO_JOBARG, NULL);
1900
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1903
lList *jid_list = NULL;
1905
if (!strcmp(*sp, "--")) {
1906
ep_opt = sge_add_noarg(pcmdline, 0, *sp, NULL);
1909
i_ret = cull_parse_jid_hold_list(&jid_list, *sp);
1912
answer_list_add_sprintf(&answer, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR,
1913
MSG_PARSE_WRONGJOBIDLISTFORMATXSPECIFIED_S, *sp );
1916
ep_opt = sge_add_arg(pcmdline, 0, lListT, STR_PSEUDO_JOBID, *sp);
1917
lSetList(ep_opt, SPA_argval_lListT, jid_list);
1922
ep_opt = sge_add_arg(pcmdline, 0, lStringT, "", NULL);
1923
lSetString(ep_opt, SPA_argval_lStringT, *sp);
1929
if (!is_hold_option) {
1930
if (prog_number == QHOLD) {
1931
ep_opt = sge_add_arg(pcmdline, h_OPT, lIntT, "-h", "u");
1932
lSetInt(ep_opt, SPA_argval_lIntT, MINUS_H_TGT_USER);
1934
} else if (prog_number == QRLS) {
1935
ep_opt = sge_add_arg(pcmdline, h_OPT, lIntT, "-h", "u");
1936
lSetInt(ep_opt, SPA_argval_lIntT, MINUS_H_CMD_SUB | MINUS_H_TGT_USER);
1945
/***********************************************************************/
1946
/* "-h [hold_list]" */
1947
/* MT-NOTE: sge_parse_hold_list() is MT safe */
1948
static int sge_parse_hold_list(
1950
u_long32 prog_number
1956
DENTER(TOP_LAYER, "sge_parse_hold_list");
1958
i = strlen(hold_str);
1960
for (j = 0; j < i; j++) {
1961
switch (hold_str[j]) {
1963
if ((prog_number == QHOLD) ||
1964
(prog_number == QRLS) ||
1965
(op_code && op_code != MINUS_H_CMD_SUB)) {
1969
op_code = MINUS_H_CMD_SUB;
1970
target = MINUS_H_TGT_USER|MINUS_H_TGT_OPERATOR|MINUS_H_TGT_SYSTEM;
1973
if (prog_number == QRLS) {
1974
if (op_code && op_code != MINUS_H_CMD_SUB) {
1978
op_code = MINUS_H_CMD_SUB;
1979
target = target|MINUS_H_TGT_SYSTEM;
1982
if (op_code && op_code != MINUS_H_CMD_ADD) {
1986
op_code = MINUS_H_CMD_ADD;
1987
target = target|MINUS_H_TGT_SYSTEM;
1991
if (prog_number == QRLS) {
1992
if (op_code && op_code != MINUS_H_CMD_SUB) {
1996
op_code = MINUS_H_CMD_SUB;
1997
target = target|MINUS_H_TGT_OPERATOR;
2000
if (op_code && op_code != MINUS_H_CMD_ADD) {
2004
op_code = MINUS_H_CMD_ADD;
2005
target = target|MINUS_H_TGT_OPERATOR;
2010
if (prog_number == QRLS) {
2011
if (op_code && op_code != MINUS_H_CMD_SUB) {
2015
op_code = MINUS_H_CMD_SUB;
2016
target = target|MINUS_H_TGT_USER;
2019
if (op_code && op_code != MINUS_H_CMD_ADD) {
2023
op_code = MINUS_H_CMD_ADD;
2024
target = target|MINUS_H_TGT_USER;
2028
if ((prog_number == QHOLD) ||
2029
(prog_number == QRLS) ||
2030
(op_code && op_code != MINUS_H_CMD_SUB)) {
2034
op_code = MINUS_H_CMD_SUB;
2035
target = target|MINUS_H_TGT_SYSTEM;
2038
if ((prog_number == QHOLD) ||
2039
(prog_number == QRLS) ||
2040
(op_code && op_code != MINUS_H_CMD_SUB)) {
2044
op_code = MINUS_H_CMD_SUB;
2045
target = target|MINUS_H_TGT_USER;
2048
if ((prog_number == QHOLD) ||
2049
(prog_number == QRLS) ||
2050
(op_code && op_code != MINUS_H_CMD_SUB)) {
2054
op_code = MINUS_H_CMD_SUB;
2055
target = target|MINUS_H_TGT_OPERATOR;
2072
/***********************************************************************/
2073
/* MT-NOTE: sge_parse_mail_options() is MT safe */
2074
static int sge_parse_mail_options(lList **alpp, char *mail_str, u_long32 prog_number)
2079
DENTER(TOP_LAYER, "sge_parse_mail_options");
2081
i = strlen(mail_str);
2083
for (j = 0; j < i; j++) {
2084
if ((char) mail_str[j] == 'a') {
2085
mail_opt = mail_opt | MAIL_AT_ABORT;
2086
} else if ((char) mail_str[j] == 'b') {
2087
mail_opt = mail_opt | MAIL_AT_BEGINNING;
2088
} else if ((char) mail_str[j] == 'e') {
2089
mail_opt = mail_opt | MAIL_AT_EXIT;
2090
} else if ((char) mail_str[j] == 'n') {
2091
mail_opt = mail_opt | NO_MAIL;
2092
} else if ((char) mail_str[j] == 's') {
2093
if (prog_number == QRSUB) {
2094
answer_list_add_sprintf(alpp, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR,
2095
MSG_PARSE_XOPTIONMUSTHAVEARGUMENT_S, "-m");
2098
mail_opt = mail_opt | MAIL_AT_SUSPENSION;
2108
/***************************************************************************/
2109
static int sge_parse_checkpoint_interval(
2114
DENTER(TOP_LAYER, "sge_parse_checkpoint_interval");
2116
DPRINTF(("--------time_string: %s\n", time_str));
2117
if (!parse_ulong_val(NULL, &seconds, TYPE_TIM, time_str, NULL, 0))
2120
DPRINTF(("-------- seconds: %d\n", (int) seconds));
2125
/***************************************************************************/
2128
/****** parse_qsub/cull_parse_path_list() **************************************
2130
* cull_parse_path_list() -- ???
2133
* int cull_parse_path_list(lList **lpp, char *path_str)
2140
* char *path_str - ???
2148
* MT-NOTE: cull_parse_path_list() is MT safe
2149
*******************************************************************************/
2150
int cull_parse_path_list(
2155
[[host]:]path[,[[host]:]path...]
2166
char **str_str = NULL;
2168
lListElem *ep = NULL;
2169
char *path_string = NULL;
2170
bool ret_error = false;
2172
DENTER(TOP_LAYER, "cull_parse_path_list");
2174
ret_error = (lpp == NULL) ? true : false;
2183
path_string = sge_strdup(NULL, path_str);
2184
ret_error = (path_string == NULL) ? true : false;
2194
str_str = string_list(path_string, ",", NULL);
2195
ret_error = (str_str == NULL || *str_str == NULL) ? true : false;
2198
if (!str_str || !*str_str) {
2205
if ( (!ret_error) && (!*lpp)) {
2206
*lpp = lCreateList("path_list", PN_Type);
2207
ret_error = (*lpp == NULL) ? true : false;
2219
for (pstr = str_str; *pstr; pstr++) {
2221
if (*pstr[0] == ':') { /* :path */
2224
} else if ((path = strstr(*pstr, ":"))){ /* host:path */
2226
cell = strdup(*pstr);
2235
ep = lCreateElem(PN_Type);
2236
/* SGE_ASSERT(ep); */
2237
lAppendElem(*lpp, ep);
2239
lSetString(ep, PN_path, path);
2241
lSetHost(ep, PN_host, cell);
2258
/***************************************************************************/
2259
/* MT-NOTE: sge_parse_priority() is MT safe */
2260
static int sge_parse_priority(
2267
DENTER(TOP_LAYER, "sge_parse_priority");
2269
*valp = strtol(priority_str, &s, 10);
2270
if (priority_str==s || *valp > 1024 || *valp < -1023) {
2271
SGE_ADD_MSG_ID(sprintf(SGE_EVENT, MSG_PARSE_INVALIDPRIORITYMUSTBEINNEG1023TO1024));
2272
answer_list_add(alpp, SGE_EVENT, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR);
2280
/****** client/var/var_list_parse_from_environment() **************************
2282
* var_list_parse_from_environment() -- create var list from env
2285
* static int var_list_parse_from_environment(lList **lpp, char **envp)
2288
* Create a list of variables from the given environment.
2291
* lList **lpp - VA_Type list
2292
* char **envp - environment pointer
2295
* static int - error state
2300
* MT-NOTES: var_list_parse_from_environment() is MT safe
2301
*******************************************************************************/
2302
static int var_list_parse_from_environment(lList **lpp, char **envp)
2304
DENTER(TOP_LAYER, "var_list_parse_from_environment");
2306
if (!lpp || !envp) {
2312
*lpp = lCreateList("env list", VA_Type);
2319
for (; *envp; envp++) {
2321
char *env_description;
2324
struct saved_vars_s *context = NULL;
2326
ep = lCreateElem(VA_Type);
2327
lAppendElem(*lpp, ep);
2329
env_entry = sge_strdup(NULL, *envp);
2330
SGE_ASSERT((env_entry));
2332
env_name = sge_strtok_r(env_entry, "=", &context);
2333
SGE_ASSERT((env_name));
2334
lSetString(ep, VA_variable, env_name);
2336
env_description = sge_strtok_r((char *) 0, "\n", &context);
2337
if (env_description)
2338
lSetString(ep, VA_value, env_description);
2340
sge_free_saved_vars(context);
2347
/***************************************************************************/
2348
/* MT-NOTE: cull_parse_destination_identifier_list() is MT safe */
2349
static int cull_parse_destination_identifier_list(
2350
lList **lpp, /* QR_Type */
2353
int rule[] = {QR_name, 0};
2354
char **str_str = NULL;
2358
DENTER(TOP_LAYER, "cull_parse_destination_identifier_list");
2365
s = sge_strdup(NULL, dest_str);
2371
str_str = string_list(s, ",", NULL);
2372
if (!str_str || !*str_str) {
2379
i_ret = cull_parse_string_list(str_str, "destin_ident_list", QR_Type, rule, lpp);
2393
/***************************************************************************/
2394
/* MT-NOTE: cull_parse_jid_hold_list() is MT safe */
2395
int cull_parse_jid_hold_list(
2406
int rule[] = {ST_name, 0};
2407
char **str_str = NULL;
2411
DENTER(TOP_LAYER, "cull_parse_jid_hold_list");
2418
s = sge_strdup(NULL, str);
2424
str_str = string_list(s, ",", NULL);
2425
if (!str_str || !*str_str) {
2431
i_ret = cull_parse_string_list(str_str, "jid_hold list", ST_Type, rule, lpp);
2446
/****** client/var/var_list_parse_from_string() *******************************
2448
* var_list_parse_from_string() -- parse vars from string list
2451
* int var_list_parse_from_string(lList **lpp,
2452
* const char *variable_str,
2453
* int check_environment)
2456
* Parse a list of variables ("lpp") from a comma separated
2457
* string list ("variable_str"). The boolean "check_environment"
2458
* defined wether the current value of a variable is taken from
2459
* the environment of the calling process.
2462
* lList **lpp - VA_Type list
2463
* const char *variable_str - source string
2464
* int check_environment - boolean
2472
* MT-NOTE: var_list_parse_from_string() is MT safe
2473
*******************************************************************************/
2474
int var_list_parse_from_string(lList **lpp, const char *variable_str,
2475
int check_environment)
2485
DENTER(TOP_LAYER, "var_list_parse_from_string");
2492
va_string = sge_strdup(NULL, variable_str);
2498
str_str = string_list(va_string, ",", NULL);
2499
if (!str_str || !*str_str) {
2507
*lpp = lCreateList("variable list", VA_Type);
2516
for (pstr = str_str; *pstr; pstr++) {
2517
struct saved_vars_s *context;
2518
ep = lCreateElem(VA_Type);
2519
/* SGE_ASSERT(ep); */
2520
lAppendElem(*lpp, ep);
2523
variable = sge_strtok_r(*pstr, "=", &context);
2524
SGE_ASSERT((variable));
2525
var_len=strlen(variable);
2526
lSetString(ep, VA_variable, variable);
2529
/* The character at the end of the first token must be either '=' or '\0'.
2530
* If it's a '=' then we treat the following string as the value */
2531
if (val_str[var_len] == '=') {
2532
lSetString(ep, VA_value, &val_str[var_len+1]);
2534
/* If it's a '\0' and check_environment is set, then we get the value from
2535
* the environment variable value. */
2536
else if(check_environment) {
2537
lSetString(ep, VA_value, sge_getenv(variable));
2539
/* If it's a '\0' and check_environment is not set, then we set the value
2542
lSetString(ep, VA_value, NULL);
2544
sge_free_saved_vars(context);
2553
/****** set_yn_option() ********************************************************
2555
* set_yn_option() -- Sets the value of a y|n option
2558
* static int set_yn_option (lList **opts, u_long32 opt, char *arg,
2559
* char *value, lList **alpp)
2562
* Sets the value of the option element to TRUE or FALSE depending on whether
2563
* the option value is y[es] or n[o].
2566
* lList **opts - The list of options to which to append the option element
2567
* u_long32 opt - The option code of the option
2568
* char *arg - The option text
2569
* char *value - The option value
2570
* lList **alpp - The answer list
2573
* int - STATUS_OK if success, STATUS_ERROR1 otherwise
2576
* MT-NOTES: set_yn_option() is MT safe
2577
*******************************************************************************/
2578
static int set_yn_option (lList **opts, u_long32 opt, char *arg, char *value,
2581
lListElem *ep_opt = NULL;
2583
if ((strcasecmp("y", value) == 0) || (strcasecmp("yes", value) == 0)) {
2584
ep_opt = sge_add_arg(opts, opt, lIntT, arg, value);
2585
lSetInt(ep_opt, SPA_argval_lIntT, TRUE);
2586
lSetUlong(ep_opt,SPA_argval_lUlongT, TRUE);
2588
else if ((strcasecmp ("n", value) == 0) || (strcasecmp ("no", value) == 0)) {
2589
ep_opt = sge_add_arg(opts, opt, lIntT, arg, value);
2590
lSetInt(ep_opt, SPA_argval_lIntT, FALSE);
2591
lSetUlong(ep_opt,SPA_argval_lUlongT, FALSE);
2594
sprintf(SGE_EVENT, MSG_PARSE_INVALIDOPTIONARGUMENT_SS, arg, value);
2595
answer_list_add(alpp, SGE_EVENT, STATUS_ESYNTAX, ANSWER_QUALITY_ERROR);
2597
return STATUS_ERROR1;
2603
/* This method is not thread safe. Fortunately, it is only used by the
2604
* -cwd switch which can be forbidden in DRMAA. */
2605
char *reroot_path(lListElem* pjob, const char *path, lList **alpp) {
2606
const char *home = NULL;
2607
char tmp_str[SGE_PATH_MAX + 1];
2608
char tmp_str2[SGE_PATH_MAX + 1];
2609
char tmp_str3[SGE_PATH_MAX + 1];
2611
DENTER (TOP_LAYER, "reroot_path");
2613
home = job_get_env_string(pjob, VAR_PREFIX "O_HOME");
2614
strcpy (tmp_str, path);
2617
/* If chdir() succeeds... */
2618
if (!getcwd(tmp_str2, sizeof(tmp_str2))) {
2619
/* If getcwd() fails... */
2620
answer_list_add(alpp, MSG_ANSWER_GETCWDFAILED,
2621
STATUS_EDISK, ANSWER_QUALITY_ERROR);
2627
if (strncmp(tmp_str2, tmp_str, strlen(tmp_str2)) == 0) {
2628
/* If they are equal, build a new CWD using the value of the HOME
2629
* as the root instead of whatever that directory is called by
2630
* the -(c)wd path. */
2631
sprintf(tmp_str3, "%s%s", home, (char *) tmp_str + strlen(tmp_str2));
2632
strcpy(tmp_str, tmp_str3);
2636
DRETURN(strdup(tmp_str));