static void DoSrvCommand(SrvJob *job_in) { int status; SrvCommandJob *job = (SrvCommandJob *)job_in; char *set_table = strcpy(malloc(strlen(job->table)+24),"set command "); char *job_text = (char *)malloc(strlen(job->command) + strlen(job->table) + 60); ProgLoc = 61; sprintf(job_text,"Doing command %s in command table %s",job->command,job->table); ProgLoc = 62; current_job_text = job_text; ProgLoc = 63; strcat(set_table,job->table); ProgLoc = 64; status = mdsdcl_do_command(set_table); ProgLoc = 65; free(set_table); ProgLoc = 66; if (status & 1) { ProgLoc = 67; status = mdsdcl_do_command(job->command); ProgLoc = 68; } ProgLoc = 69; SendReply(job_in,SrvJobFINISHED,status,0,0); ProgLoc = 70; }
int mdsdcl___execute(struct descriptor_s *niddsc_ptr, InExecuteStruct *setup) { int status; char *line; for (line=strtok(setup->verbs,"\n");line;line=strtok(0,"\n")) { char cmd[128]; strcpy(cmd,"set command "); strcat(cmd,line); return_on_error(mdsdcl_do_command(cmd),status); } for (line=strtok(setup->commands,"\n");line;line=strtok(0,"\n")) { if (strlen(line)) return_on_error(mdsdcl_do_command(line),status); } return status; }
/**************************************************************** * mdsdcl_do_macro: ****************************************************************/ int mdsdcl_do_macro() /* Return: status */ { int i; int icnt; int irepeat; int sts; char prmName[4]; struct _mdsdcl_io *io; struct _mdsdcl_macro *macro; static DYNAMIC_DESCRIPTOR(dsc_util); static char fmt0[] = "Qualifier not supported: use '@'"; static char fmt1[] = "No such command: '%s'"; static char fmt2[] = "Macro '%s' is already in use"; static char fmt3[] = "Exceeded MAX_DEPTH for indirect files & macros"; struct _mdsdcl_ctrl *ctrl = &MdsdclGetThreadStatic()->ctrl; sts = cli_get_value("NAME",&dsc_util); if (~sts & 1) return(MdsMsg(MDSDCL_STS_ERROR,"Error getting NAME")); if (cli_present("INTERACTIVE") & 1) return(MdsMsg(MDSDCL_STS_ERROR,fmt0,0)); if (cli_present("INDIRECT") & 1) { sts = mdsdcl_openIndirectLevel(dsc_util.dscA_pointer); if (!sts & 1) return(MdsMsg(sts,"failed to open file %s",dsc_util.dscA_pointer)); for ( ; sts & 1 ; ) sts = mdsdcl_do_command(0); return((sts==MDSDCL_STS_INDIRECT_EOF) ? 1 : sts); } l2u(dsc_util.dscA_pointer,0); /* convert to uc */ macro = find_macro(dsc_util.dscA_pointer); if (!macro) { MdsMsg(0,"No such command"); return(MDSDCL_STS_ERROR); } if (macro->isOpen) return(MdsMsg(MDSDCL_STS_ERROR,fmt2,dsc_util.dscA_pointer)); /*======================================================= * Get repeat count ... *======================================================*/ sts = cli_get_value("REPEAT",&dsc_util); if (sts & 1) { if (sscanf(dsc_util.dscA_pointer,"%d",&irepeat) != 1) irepeat = 1; } else irepeat = 1; /*======================================================== * Create new ioLevel[] in ctrl struct ... *=======================================================*/ if (ctrl->depth >= MAX_DEPTH) return(MdsMsg(MDSDCL_STS_INDIRECT_ERROR,fmt3,0)); for (icnt=0 ; icnt<irepeat ; icnt++) { macro->isOpen = 1; io = ctrl->ioLevel + ++ctrl->depth; io->fp = 0; io->ioMacro = macro; io->lineno = 0; for (i=0 ; i<8 ; i++) { sprintf(prmName,"P%d",i+1); sts = cli_get_value(prmName,io->ioParameter+i); if (~sts & 1) break; } for ( ; i<8 ; i++) str_free1_dx(io->ioParameter+i); do { sts = mdsdcl_do_command(0); } while (sts & 1); if (sts == MDSDCL_STS_INDIRECT_EOF) continue; else break; } return((sts==MDSDCL_STS_INDIRECT_EOF) ? 1 : sts); }