示例#1
0
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);
  }
示例#2
0
文件: select.c 项目: ricksladkey/vile
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;
}
示例#3
0
文件: job_recov.c 项目: hocks/torque
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 */
示例#4
0
/**
 * @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);
}
示例#5
0
/**
 * @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);
}
示例#6
0
文件: select.c 项目: ricksladkey/vile
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);
}