📄 util_funcs.c
字号:
#endif
}
int get_exec_pipes(char *cmd,
int *fdIn,
int *fdOut,
int *pid)
{
#if HAVE_EXECV
int fd[2][2],i, cnt;
char ctmp[STRMAX], *cptr1, *cptr2, argvs[STRMAX], **argv, **aptr;
/* Setup our pipes */
if (pipe(fd[0]) || pipe(fd[1]))
{
setPerrorstatus("pipe");
return 0;
}
if ((*pid = fork()) == 0) /* First handle for the child */
{
close(0);
if (dup(fd[0][0]) != 0)
{
setPerrorstatus("dup");
return 0;
}
close(1);
if (dup(fd[1][1]) != 1)
{
setPerrorstatus("dup");
return 0;
}
close(fd[0][0]);
close(fd[0][1]);
close(fd[1][0]);
close(fd[1][1]);
for(cnt=1,cptr1 = cmd, cptr2 = argvs; *cptr1 != 0;
cptr2++, cptr1++) {
*cptr2 = *cptr1;
if (*cptr1 == ' ') {
*(cptr2++) = 0;
cptr1 = skip_white(cptr1);
*cptr2 = *cptr1;
if (*cptr1 != 0) cnt++;
}
}
*cptr2 = 0;
*(cptr2+1) = 0;
argv = (char **) malloc((cnt+2) * sizeof(char *));
if (argv == NULL)
return 0; /* memory alloc error */
aptr = argv;
*(aptr++) = argvs;
for (cptr2 = argvs, i=1; i != cnt; cptr2++)
if (*cptr2 == 0) {
*(aptr++) = cptr2 + 1;
i++;
}
while (*cptr2 != 0) cptr2++;
*(aptr++) = NULL;
copy_word(cmd,ctmp);
execv(ctmp,argv);
snmp_log_perror("execv");
exit(1);
}
else
{
close(fd[0][0]);
close(fd[1][1]);
if (*pid < 0) {
close(fd[0][1]);
close(fd[1][0]);
setPerrorstatus("fork");
return 0;
}
*fdIn = fd[1][0];
*fdOut = fd[0][1];
return(1); /* We are returning 0 for error... */
}
#endif /* !HAVE_EXECV */
return 0;
}
int clear_cache(int action,
u_char *var_val,
u_char var_val_type,
size_t var_val_len,
u_char *statP,
oid *name,
size_t name_len)
{
long tmp=0;
if (var_val_type != ASN_INTEGER) {
snmp_log(LOG_NOTICE, "Wrong type != int\n");
return SNMP_ERR_WRONGTYPE;
}
tmp = *((long *) var_val);
if (tmp == 1 && action == COMMIT) {
#ifdef EXCACHETIME
cachetime = 0; /* reset the cache next read */
#endif
}
return SNMP_ERR_NOERROR;
}
char **argvrestartp, *argvrestartname, *argvrestart;
RETSIGTYPE restart_doit(int a)
{
int i;
/* close everything open */
for (i=0; i<= 2; i++)
close(i);
/* do the exec */
#if HAVE_EXECV
execv(argvrestartname,argvrestartp);
setPerrorstatus("execv");
#endif
}
int
restart_hook(int action,
u_char *var_val,
u_char var_val_type,
size_t var_val_len,
u_char *statP,
oid *name,
size_t name_len)
{
long tmp=0;
if (var_val_type != ASN_INTEGER) {
snmp_log(LOG_NOTICE, "Wrong type != int\n");
return SNMP_ERR_WRONGTYPE;
}
tmp = *((long *) var_val);
if (tmp == 1 && action == COMMIT) {
#ifdef SIGALRM
signal(SIGALRM,restart_doit);
#endif
#ifndef __ECOS
alarm(RESTARTSLEEP);
#endif
}
return SNMP_ERR_NOERROR;
}
void
print_mib_oid(oid name[],
size_t len)
{
char *buffer;
buffer=malloc(11*len); /* maximum digit lengths for int32 + a '.' */
if (!buffer) {
snmp_log(LOG_ERR, "Malloc failed - out of memory?");
return;
}
sprint_mib_oid(buffer, name, len);
snmp_log(LOG_NOTICE, "Mib: %s\n", buffer);
free(buffer);
}
void
sprint_mib_oid(char *buf,
oid name[],
size_t len)
{
int i;
for(i=0; i < (int)len; i++) {
sprintf(buf,".%d",(int) name[i]);
while (*buf != 0)
buf++;
}
}
/*******************************************************************-o-******
* header_simple_table
*
* Parameters:
* *vp Variable data.
* *name Fully instantiated OID name.
* *length Length of name.
* exact TRUE if an exact match is desired.
* *var_len Hook for size of returned data type.
* (**write_method) Hook for write method (UNUSED).
* max
*
* Returns:
* 0 If name matches vp->name (accounting for 'exact') and is
* not greater in length than 'max'.
* 1 Otherwise.
*
*
* Compare 'name' to vp->name for the best match or an exact match (if
* requested). Also check that 'name' is not longer than 'max' if
* max is greater-than/equal 0.
* Store a successful match in 'name', and increment the OID instance if
* the match was not exact.
*
* 'name' and 'length' are undefined upon failure.
*
*/
int header_simple_table(struct variable *vp, oid *name, size_t *length,
int exact, size_t *var_len,
WriteMethod **write_method, int max)
{
int i,
rtest; /* Set to: -1 If name < vp->name,
* 1 If name > vp->name,
* 0 Otherwise.
*/
oid newname[MAX_OID_LEN];
for(i=0,rtest=0; i < (int) vp->namelen && i < (int)(*length) && !rtest; i++) {
if (name[i] != vp->name[i]) {
if (name[i] < vp->name[i])
rtest = -1;
else
rtest = 1;
}
}
if (rtest > 0 ||
(rtest == 0 && !exact && (int)(vp->namelen+1) < (int) *length) ||
(exact == 1 && (rtest || (int)*length != (int)(vp->namelen+1)))) {
if (var_len)
*var_len = 0;
return MATCH_FAILED;
}
memset(newname, 0, sizeof(newname));
if (((int) *length) <= (int) vp->namelen || rtest == -1) {
memmove(newname, vp->name, (int)vp->namelen * sizeof (oid));
newname[vp->namelen] = 1;
*length = vp->namelen+1;
}
else {
*length = vp->namelen+1;
memmove(newname, name, (*length) * sizeof(oid));
if (!exact)
newname[*length-1] = name[*length-1] + 1;
else
newname[*length-1] = name[*length-1];
}
if (max >= 0 && ((int)newname[*length-1] > max)) {
if(var_len)
*var_len = 0;
return MATCH_FAILED;
}
memmove(name, newname, (*length) * sizeof(oid));
if (write_method)
*write_method = 0;
if (var_len)
*var_len = sizeof(long); /* default */
return(MATCH_SUCCEEDED);
}
/*
header_generic(...
Arguments:
vp IN - pointer to variable entry that points here
name IN/OUT - IN/name requested, OUT/name found
length IN/OUT - length of IN/OUT oid's
exact IN - TRUE if an exact match was requested
var_len OUT - length of variable or 0 if function returned
write_method
*/
/*******************************************************************-o-******
* generic_header
*
* Parameters:
* *vp (I) Pointer to variable entry that points here.
* *name (I/O) Input name requested, output name found.
* *length (I/O) Length of input and output oid's.
* exact (I) TRUE if an exact match was requested.
* *var_len (O) Length of variable or 0 if function returned.
* (**write_method) Hook to name a write method (UNUSED).
*
* Returns:
* MATCH_SUCCEEDED If vp->name matches name (accounting for exact bit).
* MATCH_FAILED Otherwise,
*
*
* Check whether variable (vp) matches name.
*/
int
header_generic(struct variable *vp,
oid *name,
size_t *length,
int exact,
size_t *var_len,
WriteMethod **write_method)
{
oid newname[MAX_OID_LEN];
int result;
DEBUGMSGTL(("util_funcs", "header_generic: "));
DEBUGMSGOID(("util_funcs", name, *length));
DEBUGMSG(("util_funcs"," exact=%d\n", exact));
memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid));
newname[vp->namelen] = 0;
result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
DEBUGMSGTL(("util_funcs", " result: %d\n", result));
if ((exact && (result != 0)) || (!exact && (result >= 0)))
return(MATCH_FAILED);
memcpy( (char *)name,(char *)newname, ((int)vp->namelen + 1) * sizeof(oid));
*length = vp->namelen + 1;
*write_method = 0;
*var_len = sizeof(long); /* default to 'long' results */
return(MATCH_SUCCEEDED);
}
/* checkmib(): provided for backwards compatibility, do not use: */
int checkmib(struct variable *vp, oid *name, size_t *length,
int exact, size_t *var_len,
WriteMethod **write_method, int max) {
/* checkmib used to be header_simple_table, with reveresed boolean
return output. header_simple_table() was created to match
header_generic(). */
return (!header_simple_table(vp, name, length, exact, var_len,
write_method, max));
}
char *find_field(char *ptr,
int field)
{
int i;
char *init=ptr;
if (field == LASTFIELD) {
/* skip to end */
while (*ptr++);
ptr = ptr - 2;
/* rewind a field length */
while (*ptr != 0 && isspace(*ptr) && init <= ptr) ptr--;
while (*ptr != 0 && !isspace(*ptr) && init <= ptr) ptr--;
if (isspace(*ptr)) ptr++; /* past space */
if (ptr < init) ptr = init;
if (!isspace(*ptr) && *ptr != 0) return(ptr);
} else {
if ((ptr = skip_white(ptr)) == NULL) return(NULL);
for (i=1; *ptr != 0 && i != field; i++)
{
if ((ptr = skip_not_white(ptr)) == NULL) return (NULL);
if ((ptr = skip_white(ptr)) == NULL) return (NULL);
}
if (*ptr != 0 && i == field) return(ptr);
return (NULL);
}
return(NULL);
}
int parse_miboid(const char *buf,
oid *oidout)
{
int i;
if (!buf)
return 0;
if (*buf == '.') buf++;
for(i=0;isdigit(*buf);i++) {
oidout[i] = atoi(buf);
while(isdigit(*buf++));
if (*buf == '.') buf++;
}
/* oidout[i] = -1; hmmm */
return i;
}
void
string_append_int (char *s,
int val)
{
char textVal[16];
if (val < 10) {
*s++ = '0' + val;
*s = '\0';
return;
}
sprintf (textVal, "%d", val);
strcpy(s, textVal);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -