int MXMLSetChild( mxml_t *E, /* I */ char *CName, /* I */ mxml_t **CE) /* O */ { if (CE == NULL) return(FAILURE); if (CE != NULL) *CE = NULL; if ((E == NULL) || (CName == NULL)) { return(FAILURE); } if (MXMLGetChild(E, CName, NULL, CE) == SUCCESS) { /* located existing child */ return(SUCCESS); } /* create new child */ if ((*CE = (mxml_t *)calloc(1, sizeof(mxml_t))) == NULL) { return(FAILURE); } MXMLAddE(E, *CE); if (CName != NULL) { (*CE)->Name = strdup(CName); if ((*CE)->Name == NULL) { return(FAILURE); } } return(SUCCESS); } /* END MXMLSetChild() */
int MXMLFromString( mxml_t **EP, /* O (populate or create) */ char *XMLString, /* I */ char **Tail, /* O (optional) */ char *EMsg, /* O (optional) */ int emsg_size) /* I */ { mxml_t *E; char *ptr; char *tail; int index; mbool_t ElementIsClosed = FALSE; mbool_t DoAppend = FALSE; char tmpNLine[MMAX_LINE + 1]; char tmpVLine[MMAX_XBUFFER + 1]; if (EP != NULL) *EP = NULL; if (EMsg != NULL) EMsg[0] = '\0'; if ((XMLString == NULL) || (EP == NULL)) { if (EMsg != NULL) snprintf(EMsg, emsg_size, "invalid arguments"); return(FAILURE); } if ((ptr = strchr(XMLString, '<')) == NULL) { if (EMsg != NULL) snprintf(EMsg, emsg_size, "no XML in string"); return(FAILURE); } if (ptr[1] == '/') { /* located tail marker */ if (EMsg != NULL) snprintf(EMsg, emsg_size, "premature termination marker"); return(FAILURE); } /* NOTE: should support append/overlay parameter (NYI) */ /* ignore 'meta' elements */ while ((ptr[1] == '?') || (ptr[1] == '!')) { ptr++; /* ignore 'meta' elements */ if (*ptr == '?') { ptr++; if ((ptr = strstr(ptr, "?>")) == NULL) { /* cannot locate end of meta element */ return(FAILURE); } if ((ptr = strchr(ptr, '<')) == NULL) { /* cannot locate next element */ if (EMsg != NULL) snprintf(EMsg, emsg_size, "cannot locate post-meta XML"); return(FAILURE); } } /* END if (*ptr == '?') */ /* ignore 'comment' element */ if (!strncmp(ptr, "!--", 3)) { ptr += 3; if ((ptr = strstr(ptr, "-->")) == NULL) { /* cannot locate end of comment element */ if (EMsg != NULL) snprintf(EMsg, emsg_size, "cannot locate comment termination marker"); return(FAILURE); } if ((ptr = strchr(ptr, '<')) == NULL) { /* cannot locate next element */ if (EMsg != NULL) snprintf(EMsg, emsg_size, "cannot locate post-comment XML"); return(FAILURE); } } /* END if (!strncmp(ptr,"!--",3)) */ } /* END while ((ptr[1] == '?') || (ptr[1] == '!')) */ /* remove whitespace */ while (isspace(*ptr)) ptr++; /* extract root element */ if (*ptr != '<') { /* cannot located start of element */ if (EMsg != NULL) snprintf(EMsg, emsg_size, "cannot locate start of root element"); return(FAILURE); } ptr++; /* ignore '<' */ index = 0; while ((*ptr != ' ') && (*ptr != '>')) { if ((ptr[0] == '/') && (ptr[1] == '>')) { ElementIsClosed = TRUE; break; } tmpNLine[index++] = *(ptr++); if ((index >= MMAX_LINE) || (ptr[0] == '\0')) { if (EMsg != NULL) snprintf(EMsg, emsg_size, "element name is too long - %.10s", tmpNLine); return(FAILURE); } } tmpNLine[index] = '\0'; if ((*EP == NULL) && (MXMLCreateE(EP, tmpNLine) == FAILURE)) { if (EMsg != NULL) snprintf(EMsg, emsg_size, "cannot create XML element '%s'", tmpNLine); return(FAILURE); } E = *EP; if ((E->ACount > 0) || (E->CCount > 0)) { DoAppend = TRUE; } if (ElementIsClosed == TRUE) { ptr += 2; /* skip '/>' */ if (Tail != NULL) *Tail = ptr; return(SUCCESS); } while (*ptr == ' ') ptr++; while (*ptr != '>') { /* extract attributes */ /* FORMAT: <ATTR>="<VAL>" */ index = 0; while ((*ptr != '=') && (*ptr != '\0')) { tmpNLine[index++] = *(ptr++); if (index >= MMAX_LINE) break; } tmpNLine[index] = '\0'; if (*ptr != '\0') ptr++; /* skip '=' */ if (*ptr != '\0') ptr++; /* skip '"' */ if (*ptr == '\0') { if (EMsg != NULL) snprintf(EMsg, emsg_size, "string is corrupt - early termination"); return(FAILURE); } index = 0; while ((*ptr != '"') || ((ptr > XMLString) && (*(ptr - 1) == '\\'))) { tmpVLine[index++] = *(ptr++); if ((index >= MMAX_XBUFFER) || (*ptr == '\0')) { MXMLDestroyE(EP); /* locate tail */ if (Tail != NULL) *Tail = ptr + strlen(ptr); if (EMsg != NULL) { snprintf(EMsg, emsg_size, "attribute name is too long - %.10s", tmpVLine); } return(FAILURE); } } tmpVLine[index] = '\0'; MXMLSetAttr(E,tmpNLine,(void *)tmpVLine,mdfString); ptr++; /* ignore '"' */ while (*ptr == ' ') ptr++; if ((ptr[0] == '/') && (ptr[1] == '>')) { /* element terminator reached */ ptr += 2; /* skip '/>' */ if (Tail != NULL) *Tail = ptr; return(SUCCESS); } } /* END while (*ptr != '>') */ ptr++; /* ignore '>' */ /* skip whitespace */ while (isspace(*ptr)) ptr++; /* extract value */ if (*ptr != '<') { char *ptr2; index = 0; while (*ptr != '<') { tmpVLine[index++] = *(ptr++); if (index >= MMAX_XBUFFER) break; } tmpVLine[index] = '\0'; E->Val = strdup(tmpVLine); if (E->Val == NULL) { if (EMsg != NULL) { snprintf(EMsg, emsg_size, "cannot alloc memory for value - %.10s", tmpVLine); } return(FAILURE); } /* restore '<' symbols */ for (ptr2 = strchr(E->Val,(char)14);ptr2 != NULL;ptr2 = strchr(ptr2,(char)14)) *ptr2 = '<'; } /* END if (*ptr != '<') */ /* extract children */ while (ptr[1] != '/') { mxml_t *C; C = NULL; if (DoAppend == TRUE) { char *ptr2; char tmpCName[MMAX_NAME]; int index; /* FORMAT: <NAME>... */ /* locate name */ ptr2 = ptr + 1; /* ignore '<' */ index = 0; while ((*ptr2 != ' ') && (*ptr2 != '>')) { if ((ptr2[0] == '/') && (ptr2[1] == '>')) { break; } tmpCName[index++] = *(ptr2++); if ((index >= MMAX_LINE) || (ptr2[0] == '\0')) { if (EMsg != NULL) { snprintf(EMsg, emsg_size, "element name is too long - %.10s", tmpCName); } return(FAILURE); } } tmpCName[index] = '\0'; MXMLGetChild(E, tmpCName, NULL, &C); } if ((MXMLFromString(&C, ptr, &tail, EMsg, emsg_size) == FAILURE) || (MXMLAddE(E, C) == FAILURE)) { break; } ptr = tail; if ((ptr == NULL) || (ptr[0] == '\0')) { /* XML is corrupt */ if (Tail != NULL) *Tail = ptr; if ((EMsg != NULL) && (EMsg[0] == '\0')) snprintf(EMsg, emsg_size, "cannot extract child"); return(FAILURE); } } /* END while (ptr[1] != '/') */ /* ignore whitespace */ while (isspace(*ptr)) ptr++; /* process tail */ if (*ptr == '/') { /* process '/>' */ ptr++; /* ignore '/' */ } else { ptr++; /* ignore '<' */ ptr++; /* ignore '/' */ ptr += strlen(E->Name); } ptr++; /* ignore '>' */ if (Tail != NULL) *Tail = ptr; return(SUCCESS); } /* END MXMLFromString() */
int MVCFromXML( mvc_t *VC, /* I (modified) */ mxml_t *E) /* I */ { mcredl_t *L = NULL; int aindex; enum MVCAttrEnum saindex; mxml_t *CE = NULL; int CTok; if ((VC == NULL) || (E == NULL)) { return(FAILURE); } for (aindex = 0;aindex < E->ACount;aindex++) { saindex = (enum MVCAttrEnum)MUGetIndex(E->AName[aindex],MVCAttr,FALSE,0); if (saindex == mvcaNONE) continue; if ((saindex == mvcaThrottlePolicies) && (MVCGetDynamicAttr(VC,mvcaThrottlePolicies,(void **)&L,mdfOther) == FAILURE)) { L = (mcredl_t *)MUCalloc(1,sizeof(mcredl_t)); MPUInitialize(&L->ActivePolicy); MVCSetDynamicAttr(VC,mvcaThrottlePolicies,(void **)&L,mdfOther); } MVCSetAttr(VC,saindex,(void **)E->AVal[aindex],mdfString,mSet); } CTok = -1; if (MXMLGetChild(E,"Variables",&CTok,&CE) == SUCCESS) { MUAddVarsFromXML(CE,&VC->Variables); } CTok = -1; if (MXMLGetChild(E,MVCAttr[mvcaMessages],&CTok,&CE) == SUCCESS) { MMBFromXML(&VC->MB,CE); } CTok = -1; while (MXMLGetChild(E,(char *)MVCAttr[mvcaACL],&CTok,&CE) == SUCCESS) { /* ACL's */ MACLFromXML(&VC->ACL,CE,FALSE); } MVCTransition(VC); return(SUCCESS); } /* END MVCFromXML() */
int MMBFromString( char *Buf, /* I */ mmb_t **MBP) /* O (alloc) */ { int CTok; mxml_t *E = NULL; mxml_t *ME; char tmpLine[MMAX_LINE << 1]; char Owner[MMAX_NAME]; char Label[MMAX_NAME]; int count; int priority; mmb_t *tmpMB; enum MMBTypeEnum type; mulong etime; char *ptr; /* NOTE: sync w/MMBFromXML() */ if ((Buf == NULL) || (MBP == NULL)) { return(FAILURE); } if (MXMLFromString(&E,Buf,NULL,NULL) == FAILURE) { return(FAILURE); } CTok = -1; while (MXMLGetChild(E,"message",&CTok,&ME) == SUCCESS) { if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaCount],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS) { count = (int)strtol(tmpLine,NULL,10); } else { count = 1; } if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaPriority],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS) { priority = (int)strtol(tmpLine,NULL,10); } else { priority = 1; } MXMLGetAttr(ME,(char *)MMBAttr[mmbaType],NULL,tmpLine,sizeof(tmpLine)); type = (enum MMBTypeEnum)MUGetIndexCI(tmpLine,MMBType,FALSE,mmbtNONE); if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaExpireTime],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS) { etime = strtol(tmpLine,NULL,10); } else { etime = MSched.Time + MCONST_DAYLEN; } if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaOwner],NULL,Owner,sizeof(Owner)) == FAILURE) strcpy(Owner,"N/A"); MXMLGetAttr(ME,(char *)MMBAttr[mmbaLabel],NULL,Label,sizeof(Label)); if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaData],NULL,tmpLine,sizeof(tmpLine)) == FAILURE) { MXMLDestroyE(&E); return(FAILURE); } ptr = tmpLine; /* NOTE: restore checkpoint newlines - sync w/MJobToXML() */ while ((ptr = strchr(ptr,'\7')) != NULL) { *ptr = '\n'; } MXMLDestroyE(&E); if (MMBAdd( MBP, tmpLine, /* I */ Owner, type, etime, priority, &tmpMB) == FAILURE) { return(FAILURE); } if (count > 1) MMBSetAttr(tmpMB,mmbaCount,(void *)&count,mdfInt); if (Label[0] != '\0') MUStrDup(&tmpMB->Label,Label); } /* END while (MXMLGetChild() == SUCCESS) */ return(SUCCESS); } /* END MMBFromString() */
int MMBFromXML( mmb_t **MBP, /* I (modified) */ mxml_t *E) /* I */ { int CTok; mxml_t *ME; char tmpLine[MMAX_LINE << 1]; char Owner[MMAX_NAME]; char Source[MMAX_NAME]; char Label[MMAX_NAME]; int count; int priority; enum MMBTypeEnum type; char *ptr; mulong etime; mmb_t *tmpMB; CTok = -1; while (MXMLGetChild(E,"message",&CTok,&ME) == SUCCESS) { if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaCount],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS) { count = (int)strtol(tmpLine,NULL,10); } else { count = 1; } if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaPriority],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS) { priority = (int)strtol(tmpLine,NULL,10); } else { priority = 1; } MXMLGetAttr(ME,(char *)MMBAttr[mmbaType],NULL,tmpLine,sizeof(tmpLine)); type = (enum MMBTypeEnum)MUGetIndexCI(tmpLine,MMBType,FALSE,mmbtNONE); if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaExpireTime],NULL,tmpLine,sizeof(tmpLine)) == SUCCESS) { etime = strtol(tmpLine,NULL,10); } else { etime = MSched.Time + MCONST_DAYLEN; } if (MXMLGetAttr(ME,(char *)MMBAttr[mmbaOwner],NULL,Owner,sizeof(Owner)) == FAILURE) strcpy(Owner,"N/A"); MXMLGetAttr(ME,(char *)MMBAttr[mmbaLabel],NULL,Label,sizeof(Label)); MXMLGetAttr(ME,(char *)MMBAttr[mmbaSource],NULL,Source,sizeof(Source)); if (MXMLGetAttr( ME, (char *)MMBAttr[mmbaData], NULL, tmpLine, sizeof(tmpLine)) == FAILURE) { return(FAILURE); } /* NOTE: should 'pack/unpack' messages to handle '<' and '\n' characters (NYI) */ if ((ptr = strchr(tmpLine,'\7')) != NULL) { /* unpack ckpt string - replace '\7' w/newlines */ for (;ptr != NULL;ptr = strchr(ptr,'\7')) { *ptr = '\n'; } } if (MMBAdd( MBP, tmpLine, Owner, type, etime, priority, &tmpMB) == FAILURE) { return(FAILURE); } if (count > 1) MMBSetAttr(tmpMB,mmbaCount,(void *)&count,mdfInt); if (Source[0] != '\0') MMBSetAttr(tmpMB,mmbaSource,(void *)Source,mdfString); if (Label[0] != '\0') MUStrDup(&tmpMB->Label,Label); } /* END while (MXMLGetChild() == SUCCESS) */ return(SUCCESS); } /* END MMBFromXML() */
int MRMFromXML( mrm_t *R, /* I (modified) */ mxml_t *E) /* I */ { int aindex; enum MRMAttrEnum raindex; int pindex; int CTok; mxml_t *CE; const char *FName = "MRMFromXML"; MDB(3,fSTRUCT) MLog("%s(%s,%s)\n", FName, (R != NULL) ? "R" : "NULL", (E != NULL) ? "E" : "NULL"); if ((R == NULL) || (E == NULL)) { return(FAILURE); } /* NOTE: do not initialize--may be overlaying existing data */ for (aindex = 0;aindex < E->ACount;aindex++) { raindex = (enum MRMAttrEnum)MUGetIndex(E->AName[aindex],MRMAttr,FALSE,0); if (raindex == mrmaNONE) continue; MRMSetAttr(R,raindex,(void **)E->AVal[aindex],mdfString,mSet); } /* END for (aindex) */ if (MXMLGetChild(E,(char *)MXO[mxoQueue],NULL,&CE) == SUCCESS) { /* NOTE: We may want to look at making this dynamic. It's only a matter of time before somebody else blows this buffer again. */ char Buffer[MMAX_BUFFER<<4]; /* load jobs from the internal queue */ if (MXMLGetAttr(CE,(char *)MXO[mxoJob],NULL,Buffer,sizeof(Buffer)) == SUCCESS) { MS3InitializeLocalQueue(R,Buffer); } } CTok = -1; pindex = 0; while (MXMLGetChild(E,"psi",&CTok,&CE) == SUCCESS) { /* set default */ if (R->P[pindex].Type == mpstNONE) R->P[pindex].Type = mpstQM; MPSIFromXML(&R->P[pindex++],CE); } return(SUCCESS); } /* END MRMFromXML() */