int MGroupToString( mgcred_t *G, char *Buf) { const int CPCList[] = { mxoStats, -1 }; mxml_t *E = NULL; if ((G == NULL) || (Buf == NULL)) { return(FAILURE); } Buf[0] = '\0'; MCOToXML((void *)G,mxoGroup,&E,NULL,(int *)CPCList,0); MXMLToString(E,Buf,MAX_MBUFFER,NULL,TRUE); MXMLDestroyE(&E); return(SUCCESS); } /* END MGroupToString() */
int MRMStoreCP( mrm_t *R, /* I */ char *Buf, /* O */ int BufSize) /* I */ { const enum MRMAttrEnum DeltaRMAList[] = { mrmaJobCounter, mrmaSQLData, mrmaNONE }; mxml_t *RME = NULL; if (Buf != NULL) Buf[0] = '\0'; if ((R == NULL) || (Buf == NULL)) { return(FAILURE); } MRMToXML( R, &RME, (enum MRMAttrEnum *)DeltaRMAList); if (MXMLToString(RME,Buf,BufSize,NULL,TRUE) == FAILURE) { MXMLDestroyE(&RME); return(FAILURE); } MXMLDestroyE(&RME); return(SUCCESS); } /* END MRMStoreCP() */
int MXMLToString( mxml_t *E, /* I */ char *Buf, /* O */ int BufSize, /* I */ char **Tail, /* O */ mbool_t IsRootElement) /* I */ { int index; int BSpace; char *BPtr; char *tail; int len; if (Buf != NULL) { Buf[0] = '\0'; } if ((E == NULL) || (Buf == NULL)) { return(FAILURE); } if (BufSize < MMAX_NAME) { return(FAILURE); } BPtr = Buf; BSpace = BufSize; /* display header */ BPtr[0] = '<'; BPtr++; BSpace--; if (E->Name != NULL) { len = strlen(E->Name); if (len >= BSpace) { /* insufficient space */ return(FAILURE); } strcpy(BPtr, E->Name); BSpace -= len; BPtr += len; } else { strcpy(BPtr, "NA"); len = strlen("NA"); BPtr += len; BSpace -= len; } /* display attributes */ for (index = 0;index < E->ACount;index++) { /* FORMAT: <NAME>="<VAL>" */ BPtr[0] = ' '; BPtr++; BSpace--; len = strlen(E->AName[index]); if (len >= BSpace) { /* insufficient space */ return(FAILURE); } strcpy(BPtr, E->AName[index]); BSpace -= len; BPtr += len; BPtr[0] = '='; BPtr++; BSpace--; BPtr[0] = '"'; BPtr++; BSpace--; len = strlen(E->AVal[index]); if (len >= BSpace) { /* insufficient space */ return(FAILURE); } strcpy(BPtr, E->AVal[index]); BSpace -= len; BPtr += len; BPtr[0] = '"'; BPtr++; BSpace--; } /* END for (index) */ BPtr[0] = '>'; BPtr++; BSpace--; if (E->Val != NULL) { len = strlen(E->Val); if (len >= BSpace) { /* insufficient space */ return(FAILURE); } strcpy(BPtr, E->Val); BSpace -= len; BPtr += len; } /* display children */ for (index = 0;index < E->CCount;index++) { if (E->C[index] == NULL) continue; if (MXMLToString(E->C[index], BPtr, BSpace, &tail, FALSE) == FAILURE) { return(FAILURE); } len = strlen(BPtr); BSpace -= len; BPtr += len; } /* END for (index) */ /* display footer */ if (E->Name != NULL) { len = strlen(E->Name); } else { len = strlen("NA"); } if (BSpace < len + 4) { return(FAILURE); } BPtr[0] = '<'; BPtr++; BSpace--; BPtr[0] = '/'; BPtr++; BSpace--; if (E->Name != NULL) { strcpy(BPtr, E->Name); } else { strcpy(BPtr, "NA"); } BSpace -= len; BPtr += len; BPtr[0] = '>'; BPtr++; BSpace--; /* terminate string */ BPtr[0] = '\0'; if (Tail != NULL) *Tail = BPtr; return(SUCCESS); } /* END MXMLToString() */
int MXMLToXString( mxml_t *E, /* I */ char **Buf, /* O (alloc/populated/modified) */ int *BufSize, /* I/O */ int MaxBufSize, /* I */ char **Tail, /* O */ mbool_t IsRootElement) /* I */ { int NewSize; /* NOTE: MXMLToString() only fails due to lack of space */ if ((E == NULL) || (Buf == NULL)) { return(FAILURE); } /* allocate initial memory if required */ if (*Buf == NULL) { NewSize = MMAX_BUFFER; if ((*Buf = (char *)calloc(1, NewSize)) == NULL) { /* cannot allocate buffer */ return(FAILURE); } if (BufSize != NULL) *BufSize = MMAX_BUFFER; } else { if (BufSize == NULL) { return(FAILURE); } NewSize = *BufSize; } while (MXMLToString( E, *Buf, NewSize, Tail, IsRootElement) == FAILURE) { char *tmpBuf; if (NewSize >= MaxBufSize) { return(FAILURE); } NewSize = MIN(NewSize << 1, MaxBufSize); tmpBuf = (char *)calloc(1, NewSize); if (tmpBuf == NULL) { /* cannot allocate buffer */ return(FAILURE); } strcat(tmpBuf, *Buf); free(*Buf); *Buf = tmpBuf; if (BufSize != NULL) *BufSize = NewSize; } /* END while (MXMLToString() == FAILURE) */ return(SUCCESS); } /* END MXMLToXString() */
int MCPStoreResList( mckpt_t *CP, mres_t **RL) { int rindex; mres_t *R; char tmpBuf[MAX_MBUFFER]; mxml_t *E = NULL; const char *FName = "MCPStoreResList"; DBG(3,fCKPT) DPrint("%s(CP,RL)\n", FName); if ((CP == NULL) || (RL == NULL)) { return(FAILURE); } for (rindex = 0;rindex < MAX_MRES;rindex++) { R = RL[rindex]; if ((R == NULL) || (R->Name[0] == '\0')) break; if (R->Name[0] == '\1') { DBG(7,fCKPT) DPrint("INFO: skipping empty reservation[%02d]\n", rindex); continue; } /* ignore job and SR based reservations */ if ((R->Type == mrtJob) || (R->Flags & (1 << mrfStandingRes))) { DBG(6,fCKPT) DPrint("INFO: ignoring reservation[%02d] '%s'\n", rindex, R->Name); continue; } DBG(4,fCKPT) DPrint("INFO: checkpointing Res[%02d] '%s'\n", rindex, R->Name); MXMLCreateE(&E,"res"); MResToXML(R,E,NULL); MXMLToString(E,tmpBuf,MAX_MBUFFER,NULL,TRUE); MXMLDestroyE(&E); MCPStoreObj(CP->fp,mcpRes,R->Name,tmpBuf); } /* END for (rindex) */ return(SUCCESS); } /* END MCPStoreResList() */
char *MMBPrintMessages( mmb_t *Head, /* I (optional) */ enum MFormatModeEnum DFormat, /* I */ mbool_t ShowVerbose, /* I */ int MinPrio, /* I (only display messages of this priority or higher) */ char *Buf, /* O (optional,char * or mxml_t *) */ int BufSize) /* I */ { mmb_t *mptr; char *BPtr = NULL; int BSpace; char *hptr = NULL; static char tmpMBuf[MMAX_BUFFER]; char tmpLine[MMAX_LINE << 2]; char tmpLine2[MMAX_LINE << 2]; if (Buf != NULL) { BPtr = Buf; BSpace = BufSize; } else { BPtr = tmpMBuf; BSpace = sizeof(tmpMBuf); } hptr = BPtr; switch (DFormat) { case mfmXML: case mfmAVP: /* KLUDGE - use AVP to create packed XML data */ { mxml_t *DE; mxml_t *CE; mxml_t *UE; int count = 0; DE = (mxml_t *)Buf; if (DE == NULL) break; if (Head == NULL) { /* header not required in XML */ break; } /* END if (Head == NULL) */ if (DFormat == mfmAVP) { /* initialize temporary parent XML element */ UE = NULL; } for (mptr = Head;mptr != NULL;mptr = mptr->Next) { if (mptr->Priority < MinPrio) continue; CE = NULL; MXMLCreateE(&CE,"message"); MXMLSetAttr(CE,"index",(void *)&count,mdfInt); MXMLSetAttr(CE,(char *)MMBAttr[mmbaCTime],(void *)&mptr->CTime,mdfLong); if (mptr->Owner != NULL) MXMLSetAttr(CE,(char *)MMBAttr[mmbaOwner],(void *)mptr->Owner,mdfString); MXMLSetAttr(CE,(char *)MMBAttr[mmbaPriority],(void *)&mptr->Priority,mdfInt); MXMLSetAttr(CE,(char *)MMBAttr[mmbaCount],(void *)&mptr->Count,mdfInt); MXMLSetAttr(CE,(char *)MMBAttr[mmbaExpireTime],(void *)&mptr->ExpireTime,mdfLong); MXMLSetAttr(CE,(char *)MMBAttr[mmbaType],(void *)MMBType[mptr->Type],mdfString); if (mptr->Data != NULL) { if (strchr(mptr->Data,'\n') != NULL) { char tmpData[MMAX_BUFFER]; MUStrCpy(tmpData,mptr->Data,sizeof(tmpData)); MUStrReplaceChar(tmpData,'\n',' ',FALSE); MXMLSetAttr(CE,(char *)MMBAttr[mmbaData],(void *)tmpData,mdfString); } else { MXMLSetAttr(CE,(char *)MMBAttr[mmbaData],(void *)mptr->Data,mdfString); } } if (mptr->Label != NULL) MXMLSetAttr(CE,(char *)MMBAttr[mmbaLabel],(void *)mptr->Label,mdfString); if (DFormat == mfmAVP) { /* create/update temporary XML */ if (UE == NULL) MXMLCreateE(&UE,(char*) MSON[msonData]); MXMLAddE(UE,CE); } else { MXMLAddE(DE,CE); } count++; } /* END for (mptr) */ if ((DFormat == mfmAVP) && (UE != NULL)) { /* NOTE: Buf is mxml_t *, do not populate */ MUSNInit(&BPtr,&BSpace,tmpMBuf,sizeof(tmpMBuf)); hptr = BPtr; MXMLToString(UE,tmpLine,sizeof(tmpLine),NULL,TRUE); MXMLDestroyE(&UE); MUStringPack(tmpLine,tmpLine2,sizeof(tmpLine2)); MUSNCat(&BPtr,&BSpace,tmpLine2); } } /* END BLOCK */ break; case mfmHuman: default: { int count = 0; char tmpBuf[MMAX_NAME]; char label[MMAX_NAME]; if (Buf != NULL) MUSNInit(&BPtr,&BSpace,Buf,BufSize); else MUSNInit(&BPtr,&BSpace,tmpMBuf,sizeof(tmpMBuf)); hptr = BPtr; if (Head == NULL) { if (ShowVerbose == TRUE) { MUSNPrintF(&BPtr,&BSpace,"%-7s %10s %10s %8.8s %4.4s %3.3s %s\n", "Label", "CreateTime", "ExpireTime", "Owner", "Prio", "Num", "Message"); } break; } /* END if (Head == NULL) */ for (mptr = Head;mptr != NULL;mptr = mptr->Next) { if (mptr->Priority < MinPrio) continue; if (mptr->Label != NULL) { strncpy(label,mptr->Label,sizeof(label)); } else { sprintf(label,"%d", count); } count++; if (ShowVerbose == TRUE) { char TString[MMAX_LINE]; /* display w/relative time */ MULToTString(mptr->CTime - MSched.Time,TString); strcpy(tmpBuf,TString); MULToTString(mptr->ExpireTime - MSched.Time,TString); MUSNPrintF(&BPtr,&BSpace,"%-8.8s %10s %10s %8.8s %4d %3d %s\n", label, tmpBuf, TString, (mptr->Owner != NULL) ? mptr->Owner : "N/A", mptr->Priority, mptr->Count, (mptr->Data != NULL) ? mptr->Data : "-"); } else { if (mptr->Source != NULL) { MUSNPrintF(&BPtr,&BSpace,"Message[%.8s] (from %s) %s\n", label, mptr->Source, (mptr->Data != NULL) ? mptr->Data : "-"); } else { MUSNPrintF(&BPtr,&BSpace,"Message[%.8s] %s\n", label, (mptr->Data != NULL) ? mptr->Data : "-"); } } } /* END for (mptr) */ } /* END BLOCK (case mfmHuman) */ break; } /* END switch (DFormat) */ return(hptr); } /* END MMBPrintMessages() */
int __MSysTestXML( char *XMLString) /* I */ { char *tail; FILE *fp; mxml_t *E = NULL; char EMsg[MMAX_LINE]; char buffer[MMAX_BUFFER << 3]; if ((XMLString != NULL) && (XMLString[0] != '\0')) { if (XMLString[0] == '/') { int rc; fp = fopen(XMLString,"r"); rc = fread((void *)buffer,sizeof(buffer),1,fp); XMLString = buffer; fprintf(stdout,"read in %d\n",rc); } fprintf(stdout,"XMLString: '%s'\n\n", XMLString); if (MXMLFromString(&E,XMLString,&tail,EMsg) == FAILURE) { fprintf(stderr,"ERROR: '%s'\n", EMsg); exit(1); } if (tail != NULL) { fprintf(stdout,"tail: '%s'\n\n", XMLString); } exit(0); } MXMLCreateE(&E,"Data"); MXMLSetAttr(E,"Value",(void *)"this >> that",mdfString); MXMLToString(E,EMsg,sizeof(EMsg),NULL,TRUE); fprintf(stdout,"XML = '%s'\n\n", EMsg); MXMLDestroyE(&E); MXMLFromString(&E,EMsg,NULL,NULL); fprintf(stdout,"After MXMLFromString: <Data %s=\"%s\"></Data>\n\n", E->AName[0], E->AVal[0]); EMsg[0] = '\0'; MXMLToString(E,EMsg,sizeof(EMsg),NULL,TRUE); fprintf(stdout,"XML = '%s'\n\n", EMsg); exit(1); /* NOTREACHED */ return(SUCCESS); } /* END __MSysTestXML() */