Exemplo n.º 1
0
	/***************************************************************
	 * 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;
   }
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
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;
}