/*************************************************************** * TclClose: * Close tree file(s). ***************************************************************/ int TclClose() { int sts; static const char promptWritefirst[] = "This tree has been modified, write it before closing? [Y]: "; static DYNAMIC_DESCRIPTOR(exp); static DYNAMIC_DESCRIPTOR(dsc_shotid); int shotid; if (cli_get_value("FILE",&exp) & 1) { cli_get_value("SHOTID",&dsc_shotid); sscanf(dsc_shotid.dscA_pointer,"%d",&shotid); sts = TreeClose(exp.dscA_pointer,shotid); } else { int doall = cli_present("ALL") & 1; while ((sts = TreeClose(0,0)) & 1 && doall); if (doall && sts == TreeNOT_OPEN) sts = TreeNORMAL; } if (sts == TreeWRITEFIRST) { if (cli_present("CONFIRM") == CLI_STS_NEGATED) sts = TreeQuitTree(0,0); else { printf(promptWritefirst); if (yesno(1)) { sts = TreeWriteTree(0,0); if (sts & 1) { TreeClose(0,0); } } else sts = TreeQuitTree(0,0); } } if (sts & 1) TclNodeTouched(0,tree); else MdsMsg(sts,"TclClose: *WARN* unexpected status"); return sts; }
static void DoSrvClose(SrvJob *job_in) { int status; char *job_text = strcpy((char *)malloc(32),"Closing trees"); current_job_text = job_text; while ((status = TreeClose(0,0)) & 1); status = (status == TreeNOT_OPEN) ? TreeNORMAL : status; SendReply(job_in,SrvJobFINISHED,status,0,0); }
int Tdi1Using(int opcode, int narg, struct descriptor *list[], struct descriptor_xd *out_ptr) { int status = 1; void *ctx; int reset_ctx = 0; int nid, shot, stat1; struct descriptor def = { 0, DTYPE_T, CLASS_D, 0 }, expt = def; unsigned char omits[] = { DTYPE_PATH, 0 }; /********************** Evaluate with current. Use current if omitted. Must get expt if shot. **********************/ if (narg > 1 && status & 1) { if (list[1]) { struct descriptor_xd xd = EMPTY_XD; status = TdiGetData(omits, list[1], &xd); if (status & 1 && xd.pointer) switch (xd.pointer->dtype) { case DTYPE_T: case DTYPE_PATH: status = StrCopyDx(&def, xd.pointer); break; default: status = TdiINVDTYDSC; break; } MdsFree1Dx(&xd, NULL); } if (!list[1] || def.length == 0) { DBI_ITM def_itm[] = { {0, DbiDEFAULT, 0, 0} , EOL }; status = TreeGetDbi(def_itm); if (def_itm[0].pointer == NULL) { STATIC_CONSTANT DESCRIPTOR(top, "\\TOP"); StrCopyDx(&def, &top); status = 1; } else { unsigned short len = (unsigned short)strlen((char *)def_itm[0].pointer); StrCopyR(&def, &len, def_itm[0].pointer); TreeFree(def_itm[0].pointer); } if (status & 1) { stat1 = StrPosition(&def, &coloncolon, 0) + 1; status = StrRight(&def, &def, &stat1); } if (status & 1) *def.pointer = '\\'; } } if ((narg > 2) && ((list[2] != 0) || ((narg > 3) && (list[3] != 0))) && ((status & 1) != 0)) { if (list[2]) status = TdiGetLong(list[2], &shot); else { DBI_ITM shot_itm[] = { {sizeof(shot), DbiSHOTID, 0, 0} , EOL }; shot_itm[0].pointer = (unsigned char *)&shot; status = TreeGetDbi(shot_itm); } if (status & 1) { if (narg > 3 && list[3]) status = TdiData(list[3], &expt MDS_END_ARG); else { DBI_ITM expt_itm[] = { {0, DbiNAME, 0, 0} , EOL }; status = TreeGetDbi(expt_itm); if (expt_itm[0].pointer) { unsigned short len = (unsigned short)strlen((char *)expt_itm[0].pointer); StrCopyR(&expt, &len, expt_itm[0].pointer); TreeFree(expt_itm[0].pointer); } } } /********************* Set new tree and path. Allow some rel paths. *********************/ if (status & 1) { char *tree = MdsDescrToCstring(&expt); ctx = TreeSwitchDbid(0); reset_ctx = 1; status = TreeOpen(tree, shot, 1); MdsFree(tree); } } if (narg > 1) { char *path = MdsDescrToCstring(&def); if (status & 1) status = TreeSetDefault(path, &nid); MdsFree(path); if (narg > 2) StrFree1Dx(&expt); StrFree1Dx(&def); } /*********************** Evaluate with temporary. ***********************/ if (status & 1) { struct descriptor_xd tmp = EMPTY_XD; status = TdiEvaluate(list[0], &tmp MDS_END_ARG); if (status & 1) status = MdsCopyDxXdZ((struct descriptor *)&tmp, out_ptr, NULL, fixup_nid, NULL, fixup_path, NULL); MdsFree1Dx(&tmp, NULL); } if (reset_ctx) { while (TreeClose(0, 0) & 1) ; TreeFreeDbid(TreeSwitchDbid(ctx)); } return status; }