int fill_resource_list( job **pj, xmlNodePtr resource_list_node, char *log_buf, size_t buflen, const char *aname) { xmlNodePtr resNode = NULL; int rc = PBSE_NONE; bool element_found = false; bool freeExisting = true; for (resNode = resource_list_node->children; resNode != NULL; resNode = resNode->next) { /* skip text children, only process elements */ if (!strcmp((const char *)resNode->name, text_name)) continue; element_found = true; xmlChar *value = xmlNodeGetContent(resNode); svrattrl *pal = NULL; if ((pal = fill_svrattr_info(aname, (const char*)value, (const char *)resNode->name, log_buf, buflen))) { char *attr_flags; unsigned int flags; if ((attr_flags = (char *)xmlGetProp(resNode, (xmlChar *)AL_FLAGS_ATTR))) { flags = (unsigned int)atoi((char *)attr_flags); xmlFree(attr_flags); pal->al_flags = flags; } decode_attribute(pal,pj,freeExisting); freeExisting = false; free(pal); } else rc = -1; if (value) xmlFree(value); } if (element_found == false) { snprintf(log_buf, buflen, "%s", "no Resource_List nodes were found in the xml"); rc = -1; } return(rc); }
static int attribute_cntl_a_sequences(void) { BUFFER *bp = curbp; LINE *pastline; C_NUM offset; /* offset in cur line of place to attribute */ int count; #if EFFICIENCY_HACK AREGION *orig_attribs = bp->b_attribs; AREGION *new_attribs; #endif if ((pastline = setup_region()) == 0) return FALSE; while (DOT.l != pastline) { if (interrupted()) return FALSE; while (DOT.o < llength(DOT.l)) { if (CharAtDot() == CONTROL_A) { offset = decode_attribute(lvalue(DOT.l), (size_t) llength(DOT.l), (size_t) DOT.o, &count); if (offset > DOT.o) { #if EFFICIENCY_HACK new_attribs = bp->b_attribs; bp->b_attribs = orig_attribs; ldel_bytes((B_COUNT) (offset - DOT.o), FALSE); bp->b_attribs = new_attribs; #else ldel_bytes((B_COUNT) (offset - DOT.o), FALSE); #endif } set_mark_after(count, len_record_sep(bp)); if (apply_attribute()) (void) attributeregion(); } else { DOT.o += BytesAt(DOT.l, DOT.o); } } DOT.l = lforw(DOT.l); DOT.o = 0; } return TRUE; }
int parse_attributes( job **pj, /* M */ /* job information to fill into */ xmlNode *attr_node, /* I */ /* attribute node to parse */ char *log_buf, /* O */ /* error message buffer */ size_t buf_len) /* I */ /* size of error message buffer */ { int rc = PBSE_NONE; xmlNode *cur_node = NULL; xmlNode *resource_list_node = NULL; xmlNode *resources_used_node = NULL; bool element_found = false; for (cur_node = attr_node->children; cur_node != NULL && rc == PBSE_NONE; cur_node = cur_node->next) { /* skip text children, only process elements */ if (!strcmp((const char *)cur_node->name, text_name)) continue; element_found = true; if (!(strcmp((const char*)cur_node->name, ATTR_l))) resource_list_node = cur_node; else if (!(strcmp((const char*)cur_node->name, ATTR_used))) resources_used_node = cur_node; else { svrattrl *pal = NULL; xmlChar *value = xmlNodeGetContent(cur_node); if ((pal = fill_svrattr_info((const char*)cur_node->name, (const char*)value, NULL, log_buf, buf_len))) { xmlChar *attr_flags; unsigned int flags; if ((attr_flags = xmlGetProp(cur_node, (xmlChar *)AL_FLAGS_ATTR))) { flags = (unsigned int)atoi((char *)attr_flags); xmlFree(attr_flags); pal->al_flags = flags; } decode_attribute(pal, pj); free(pal); } else rc = -1; if (value) xmlFree(value); } } if (rc == PBSE_NONE && resource_list_node) rc = fill_resource_list(pj, resource_list_node, log_buf, buf_len, ATTR_l); if (rc == PBSE_NONE && resources_used_node) rc = fill_resource_list(pj, resources_used_node, log_buf, buf_len, ATTR_used); else if (element_found == false) { snprintf(log_buf, buf_len, "%s", "Error: there were no job attributes found"); rc = -1; } return(rc); } /* END parse_attributes */
/** * @brief Replace %whatever in a string. * * See 'doc/variables.txt' for more information. * * @param out output buffer * @param outlen size of output buffer * @param fmt string to expand * @param request current request * @param func function to escape final value e.g. SQL quoting * @return length of string written @bug should really have -1 for failure */ int radius_xlat(char *out, int outlen, const char *fmt, REQUEST *request, RADIUS_ESCAPE_STRING func, void *funcarg) { int c, len, freespace; const char *p; char *q; char *nl; VALUE_PAIR *tmp; struct tm *TM, s_TM; char tmpdt[40]; /* For temporary storing of dates */ /* * Catch bad modules. */ if (!fmt || !out || !request) return 0; q = out; p = fmt; while (*p) { /* Calculate freespace in output */ freespace = outlen - (q - out); if (freespace <= 1) break; c = *p; if ((c != '%') && (c != '$') && (c != '\\')) { /* * We check if we're inside an open brace. If we are * then we assume this brace is NOT literal, but is * a closing brace and apply it */ *q++ = *p++; continue; } /* * There's nothing after this character, copy * the last '%' or "$' or '\\' over to the output * buffer, and exit. */ if (*++p == '\0') { *q++ = c; break; } if (c == '\\') { switch(*p) { case '\\': *q++ = *p; break; case 't': *q++ = '\t'; break; case 'n': *q++ = '\n'; break; default: *q++ = c; *q++ = *p; break; } p++; } else if (c == '%') switch(*p) { case '{': p--; if (decode_attribute(&p, &q, freespace, request, func, funcarg) < 0) return 0; break; case '%': *q++ = *p++; break; case 'd': /* request day */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%d", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'l': /* request timestamp */ snprintf(tmpdt, sizeof(tmpdt), "%lu", (unsigned long) request->timestamp); strlcpy(q,tmpdt,freespace); q += strlen(q); p++; break; case 'm': /* request month */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%m", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 't': /* request timestamp */ CTIME_R(&request->timestamp, tmpdt, sizeof(tmpdt)); nl = strchr(tmpdt, '\n'); if (nl) *nl = '\0'; strlcpy(q, tmpdt, freespace); q += strlen(q); p++; break; case 'C': /* ClientName */ strlcpy(q,request->client->shortname,freespace); q += strlen(q); p++; break; case 'D': /* request date */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y%m%d", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'G': /* request minute */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%M", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'H': /* request hour */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%H", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'I': /* Request ID */ snprintf(tmpdt, sizeof(tmpdt), "%i", request->packet->id); strlcpy(q, tmpdt, freespace); q += strlen(q); p++; break; case 'S': /* request timestamp in SQL format*/ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y-%m-%d %H:%M:%S", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'T': /* request timestamp */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y-%m-%d-%H.%M.%S.000000", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'V': /* Request-Authenticator */ strlcpy(q,"Verified",freespace); q += strlen(q); p++; break; case 'Y': /* request year */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'Z': /* Full request pairs except password */ tmp = request->packet->vps; while (tmp && (freespace > 3)) { if (tmp->attribute != PW_USER_PASSWORD) { *q++ = '\t'; len = vp_prints(q, freespace - 2, tmp); q += len; freespace -= (len + 2); *q++ = '\n'; } tmp = tmp->next; } p++; break; default: RDEBUG2("WARNING: Unknown variable '%%%c': See 'doc/variables.txt'", *p); if (freespace > 2) { *q++ = '%'; *q++ = *p++; } break; } } *q = '\0'; RDEBUG2("\texpand: %s -> %s", fmt, out); return strlen(out); }
/** * @brief Replace %whatever in a string. * * See 'doc/variables.txt' for more information. * * @param out output buffer * @param outlen size of output buffer * @param fmt string to expand * @param request current request * @param func function to escape final value e.g. SQL quoting * @return length of string written @bug should really have -1 for failure */ int radius_xlat(char *out, int outlen, const char *fmt, REQUEST *request, RADIUS_ESCAPE_STRING func) { int c, len, freespace; const char *p; char *q; char *nl; VALUE_PAIR *tmp; struct tm *TM, s_TM; char tmpdt[40]; /* For temporary storing of dates */ int openbraces=0; /* * Catch bad modules. */ if (!fmt || !out || !request) return 0; /* * Ensure that we always have an escaping function. */ if (func == NULL) { func = xlat_copy; } q = out; p = fmt; while (*p) { /* Calculate freespace in output */ freespace = outlen - (q - out); if (freespace <= 1) break; c = *p; if ((c != '%') && (c != '$') && (c != '\\')) { /* * We check if we're inside an open brace. If we are * then we assume this brace is NOT literal, but is * a closing brace and apply it */ if ((c == '}') && openbraces) { openbraces--; p++; /* skip it */ continue; } *q++ = *p++; continue; } /* * There's nothing after this character, copy * the last '%' or "$' or '\\' over to the output * buffer, and exit. */ if (*++p == '\0') { *q++ = c; break; } if (c == '\\') { switch(*p) { case '\\': *q++ = *p; break; case 't': *q++ = '\t'; break; case 'n': *q++ = '\n'; break; default: *q++ = c; *q++ = *p; break; } p++; } else if (c == '%') switch(*p) { case '{': p--; if (decode_attribute(&p, &q, freespace, request, func) < 0) return 0; break; case '%': *q++ = *p++; break; case 'a': /* Protocol: */ q += valuepair2str(q,freespace,pairfind(request->reply->vps,PW_FRAMED_PROTOCOL, 0),PW_TYPE_INTEGER, func); p++; break; case 'c': /* Callback-Number */ q += valuepair2str(q,freespace,pairfind(request->reply->vps,PW_CALLBACK_NUMBER, 0),PW_TYPE_STRING, func); p++; break; case 'd': /* request day */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%d", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'f': /* Framed IP address */ q += valuepair2str(q,freespace,pairfind(request->reply->vps,PW_FRAMED_IP_ADDRESS, 0),PW_TYPE_IPADDR, func); p++; break; case 'i': /* Calling station ID */ q += valuepair2str(q,freespace,pairfind(request->packet->vps,PW_CALLING_STATION_ID, 0),PW_TYPE_STRING, func); p++; break; case 'l': /* request timestamp */ snprintf(tmpdt, sizeof(tmpdt), "%lu", (unsigned long) request->timestamp); strlcpy(q,tmpdt,freespace); q += strlen(q); p++; break; case 'm': /* request month */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%m", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'n': /* NAS IP address */ q += valuepair2str(q,freespace,pairfind(request->packet->vps,PW_NAS_IP_ADDRESS, 0),PW_TYPE_IPADDR, func); p++; break; case 'p': /* Port number */ q += valuepair2str(q,freespace,pairfind(request->packet->vps,PW_NAS_PORT, 0),PW_TYPE_INTEGER, func); p++; break; case 's': /* Speed */ q += valuepair2str(q,freespace,pairfind(request->packet->vps,PW_CONNECT_INFO, 0),PW_TYPE_STRING, func); p++; break; case 't': /* request timestamp */ CTIME_R(&request->timestamp, tmpdt, sizeof(tmpdt)); nl = strchr(tmpdt, '\n'); if (nl) *nl = '\0'; strlcpy(q, tmpdt, freespace); q += strlen(q); p++; break; case 'u': /* User name */ q += valuepair2str(q,freespace,pairfind(request->packet->vps,PW_USER_NAME, 0),PW_TYPE_STRING, func); p++; break; case 'A': /* radacct_dir */ strlcpy(q,radacct_dir,freespace); q += strlen(q); p++; break; case 'C': /* ClientName */ strlcpy(q,request->client->shortname,freespace); q += strlen(q); p++; break; case 'D': /* request date */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y%m%d", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'H': /* request hour */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%H", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'L': /* radlog_dir */ strlcpy(q,radlog_dir,freespace); q += strlen(q); p++; break; case 'M': /* MTU */ q += valuepair2str(q,freespace,pairfind(request->reply->vps,PW_FRAMED_MTU, 0),PW_TYPE_INTEGER, func); p++; break; case 'R': /* radius_dir */ strlcpy(q,radius_dir,freespace); q += strlen(q); p++; break; case 'S': /* request timestamp in SQL format*/ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y-%m-%d %H:%M:%S", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'T': /* request timestamp */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y-%m-%d-%H.%M.%S.000000", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'U': /* Stripped User name */ q += valuepair2str(q,freespace,pairfind(request->packet->vps,PW_STRIPPED_USER_NAME, 0),PW_TYPE_STRING, func); p++; break; case 'V': /* Request-Authenticator */ strlcpy(q,"Verified",freespace); q += strlen(q); p++; break; case 'Y': /* request year */ TM = localtime_r(&request->timestamp, &s_TM); len = strftime(tmpdt, sizeof(tmpdt), "%Y", TM); if (len > 0) { strlcpy(q, tmpdt, freespace); q += strlen(q); } p++; break; case 'Z': /* Full request pairs except password */ tmp = request->packet->vps; while (tmp && (freespace > 3)) { if (tmp->attribute != PW_USER_PASSWORD) { *q++ = '\t'; len = vp_prints(q, freespace - 2, tmp); q += len; freespace -= (len + 2); *q++ = '\n'; } tmp = tmp->next; } p++; break; default: RDEBUG2("WARNING: Unknown variable '%%%c': See 'doc/variables.txt'", *p); if (freespace > 2) { *q++ = '%'; *q++ = *p++; } break; } } *q = '\0'; RDEBUG2("\texpand: %s -> %s", fmt, out); return strlen(out); }
static int attribute_from_filter(void) { BUFFER *bp = curbp; LINE *pastline; int skip; size_t nbytes; size_t n; int done; int result = TRUE; int drained = FALSE; TRACE((T_CALLED "attribute_from_filter\n")); if ((pastline = setup_region()) == 0) { result = FALSE; #ifdef MDHILITE } else if (!b_val(bp, MDHILITE)) { discard_syntax_highlighting(); #endif } else if (open_region_filter() == TRUE) { discard_syntax_highlighting(); while (DOT.l != pastline) { if (interrupted()) { result = FALSE; break; } if (ffgetline(&nbytes) > FIOSUC) { drained = TRUE; break; } DOT.o = 0; for (n = 0; n < nbytes; n++) { if (fflinebuf[n] == CONTROL_A) { done = decode_attribute(fflinebuf, nbytes, n, &skip); if (done) { n = (size_t) (done - 1); set_mark_after(skip, 1); if (apply_attribute()) (void) attributeregion(); } } else { DOT.o += BytesAt(DOT.l, DOT.o); } } DOT.l = lforw(DOT.l); } /* some pipes will hang if they're not drained */ if (!drained) { while (ffgetline(&nbytes) <= FIOSUC) { ; } } (void) ffclose(); /* Ignore errors. */ attach_attrib(selbufp, &selregion); attach_attrib(startbufp, &startregion); #if OPT_HILITEMATCH if (bp->b_highlight & HILITE_ON) { bp->b_highlight |= HILITE_DIRTY; attrib_matches(); } #endif } returnCode(result); }