Blame src/util.c

Packit Service 5e8d2a
/* aide, Advanced Intrusion Detection Environment
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * Copyright (C) 1999-2002,2004-2006,2010,2011,2013,2016 Rami Lehti, Pablo
Packit Service 5e8d2a
 * Virolainen, Mike Markley, Richard van den Berg, Hannes von Haugwitz
Packit Service 5e8d2a
 * $Header$
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * This program is free software; you can redistribute it and/or
Packit Service 5e8d2a
 * modify it under the terms of the GNU General Public License as
Packit Service 5e8d2a
 * published by the Free Software Foundation; either version 2 of the
Packit Service 5e8d2a
 * License, or (at your option) any later version.
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * This program is distributed in the hope that it will be useful, but
Packit Service 5e8d2a
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5e8d2a
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit Service 5e8d2a
 * General Public License for more details.
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * You should have received a copy of the GNU General Public License
Packit Service 5e8d2a
 * along with this program; if not, write to the Free Software
Packit Service 5e8d2a
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service 5e8d2a
 */
Packit Service 5e8d2a
Packit Service 5e8d2a
#include "aide.h"
Packit Service 5e8d2a
#include <stdlib.h>
Packit Service 5e8d2a
#include <unistd.h>
Packit Service 5e8d2a
#include <string.h>
Packit Service 5e8d2a
#include <sys/stat.h>
Packit Service 5e8d2a
#include <signal.h>
Packit Service 5e8d2a
#include <ctype.h>
Packit Service 5e8d2a
#include <syslog.h>
Packit Service 5e8d2a
/*for locale support*/
Packit Service 5e8d2a
#include "locale-aide.h"
Packit Service 5e8d2a
/*for locale support*/
Packit Service 5e8d2a
Packit Service 5e8d2a
Packit Service 5e8d2a
#ifndef MAXHOSTNAMELEN
Packit Service 5e8d2a
#define MAXHOSTNAMELEN 256
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
#include "report.h"
Packit Service 5e8d2a
#include "db_config.h"
Packit Service 5e8d2a
#include "util.h"
Packit Service 5e8d2a
Packit Service 5e8d2a
#define URL_UNSAFE " <>\"#%{}|\\^~[]`@:\033'"
Packit Service 5e8d2a
#define ISPRINT(c) (isascii(c) && isprint(c))
Packit Service 5e8d2a
Packit Service 5e8d2a
static const char* url_name[] = { 
Packit Service 5e8d2a
  "file", "stdin", "stdout", "stderr", "fd", "sql", "syslog", "database", "https", "http", "ftp" };
Packit Service 5e8d2a
Packit Service 5e8d2a
static const int url_value[] = {
Packit Service 5e8d2a
  url_file, url_stdin, url_stdout,url_stderr,url_fd, url_sql, url_syslog, url_database, url_https, url_http, url_ftp };
Packit Service 5e8d2a
Packit Service 5e8d2a
const int url_ntypes=sizeof(url_value)/sizeof(URL_TYPE);
Packit Service 5e8d2a
Packit Service 5e8d2a
int cmpurl(url_t* u1,url_t* u2)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  if(u1->type!= u2->type){
Packit Service 5e8d2a
    return RETFAIL;
Packit Service 5e8d2a
  };
Packit Service 5e8d2a
  if(strcmp(u1->value,u2->value)!=0){
Packit Service 5e8d2a
    return RETFAIL;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
Packit Service 5e8d2a
  return RETOK;
Packit Service 5e8d2a
};
Packit Service 5e8d2a
Packit Service 5e8d2a
url_t* parse_url(char* val)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  url_t* u=NULL;
Packit Service 5e8d2a
  char* r=NULL;
Packit Service 5e8d2a
  char* val_copy=NULL;
Packit Service 5e8d2a
  int i=0;
Packit Service 5e8d2a
Packit Service 5e8d2a
  if(val==NULL){
Packit Service 5e8d2a
    return NULL;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  u=(url_t*)malloc(sizeof(url_t));
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  /* We don't want to modify the original hence strdup(val) */
Packit Service 5e8d2a
  val_copy=strdup(val);
Packit Service 5e8d2a
  for(r=val_copy;r[0]!=':'&&r[0]!='\0';r++);
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  if(r[0]!='\0'){
Packit Service 5e8d2a
    r[0]='\0';
Packit Service 5e8d2a
    r++;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  u->type=url_unknown;
Packit Service 5e8d2a
  for(i=0;i
Packit Service 5e8d2a
    if(strcmp(val_copy,url_name[i])==0){
Packit Service 5e8d2a
      u->type=url_value[i];
Packit Service 5e8d2a
      break;
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  switch (u->type) {
Packit Service 5e8d2a
  case url_file : {
Packit Service 5e8d2a
    if(r[0]=='/'&&(r+1)[0]=='/'&&(r+2)[0]=='/'){
Packit Service 5e8d2a
      u->value=strdup(r+2);
Packit Service 5e8d2a
      break;
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
    if(r[0]=='/'&&(r+1)[0]=='/'&&(r+2)[0]!='/'){
Packit Service 5e8d2a
      char*hostname=(char*)malloc(sizeof(char)*MAXHOSTNAMELEN);
Packit Service 5e8d2a
      char* t=r+2;
Packit Service 5e8d2a
      r+=2;
Packit Service 5e8d2a
      for(i=0;r[0]!='/'&&r[0]!='\0';r++,i++);
Packit Service 5e8d2a
      if(r[0]=='\0'){
Packit Service 5e8d2a
	error(0,"Invalid file-URL,no path after hostname: file:%s\n",t);
Packit Service c89282
        free(hostname);
Packit Service 5e8d2a
	return NULL;
Packit Service 5e8d2a
      }
Packit Service 5e8d2a
      u->value=strdup(r);
Packit Service 5e8d2a
      r[0]='\0';
Packit Service 5e8d2a
      if(gethostname(hostname,MAXHOSTNAMELEN)==-1){
Packit Service c89282
        strncpy(hostname,"localhost", 10);
Packit Service 5e8d2a
      }
Packit Service c89282
Packit Service 5e8d2a
      if( (strcmp(t,"localhost")==0)||(strcmp(t,hostname)==0)){
Packit Service 5e8d2a
	free(hostname);
Packit Service 5e8d2a
	break;
Packit Service 5e8d2a
      } else {
Packit Service 5e8d2a
	error(0,"Invalid file-URL, cannot use hostname other than localhost or %s: file:%s\n",hostname,u->value);
Packit Service 5e8d2a
	free(hostname);
Packit Service 5e8d2a
	return NULL;
Packit Service 5e8d2a
      }
Packit Service c89282
Packit Service 5e8d2a
      break;
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
    u->value=strdup(r);
Packit Service 5e8d2a
    
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case url_https :
Packit Service 5e8d2a
  case url_http :
Packit Service 5e8d2a
  case url_ftp : {
Packit Service 5e8d2a
    u->value=strdup(val);
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case url_unknown : {
Packit Service 5e8d2a
    error(0,"Unknown URL-type:%s\n",val_copy);
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  default : {
Packit Service 5e8d2a
    u->value=strdup(r);
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
Packit Service 5e8d2a
  free(val_copy);
Packit Service 5e8d2a
Packit Service 5e8d2a
  return u;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
/* Returns 1 if the string contains unsafe characters, 0 otherwise.  */
Packit Service 5e8d2a
int contains_unsafe (const char *s)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  for (; *s; s++)
Packit Service 5e8d2a
    if (strchr (URL_UNSAFE,(int) *s)||!ISPRINT((int)*s))
Packit Service 5e8d2a
      return 1;
Packit Service 5e8d2a
  return 0;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
 
Packit Service 5e8d2a
/* Decodes the forms %xy in a URL to the character the hexadecimal
Packit Service 5e8d2a
   code of which is xy.  xy are hexadecimal digits from
Packit Service 5e8d2a
   [0123456789ABCDEF] (case-insensitive).  If x or y are not
Packit Service 5e8d2a
   hex-digits or `%' precedes `\0', the sequence is inserted
Packit Service 5e8d2a
   literally.  */
Packit Service 5e8d2a
 
Packit Service 5e8d2a
void decode_string (char* s)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  char *p = s;
Packit Service 5e8d2a
 
Packit Service 5e8d2a
  for (; *s; s++, p++)
Packit Service 5e8d2a
    {
Packit Service 5e8d2a
      if (*s != '%')
Packit Service 5e8d2a
        *p = *s;
Packit Service 5e8d2a
      else
Packit Service 5e8d2a
        {
Packit Service 5e8d2a
          /* Do nothing if at the end of the string, or if the chars
Packit Service 5e8d2a
             are not hex-digits.  */
Packit Service 5e8d2a
          if (!*(s + 1) || !*(s + 2)
Packit Service 5e8d2a
              || !(ISXDIGIT (*(s + 1)) && ISXDIGIT (*(s + 2))))
Packit Service 5e8d2a
            {
Packit Service 5e8d2a
              *p = *s;
Packit Service 5e8d2a
              continue;
Packit Service 5e8d2a
            }
Packit Service 5e8d2a
          *p = (ASC2HEXD (*(s + 1)) << 4) + ASC2HEXD (*(s + 2));
Packit Service 5e8d2a
          s += 2;
Packit Service 5e8d2a
        }
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  *p = '\0';
Packit Service 5e8d2a
}
Packit Service 5e8d2a
 
Packit Service 5e8d2a
/* Encodes the unsafe characters (listed in URL_UNSAFE) in a given
Packit Service 5e8d2a
   string, returning a malloc-ed %XX encoded string.  */
Packit Service 5e8d2a
char* encode_string (const char* s)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  const char *b;
Packit Service 5e8d2a
  char *p, *res;
Packit Service 5e8d2a
  int i;
Packit Service 5e8d2a
 
Packit Service 5e8d2a
  b = s;
Packit Service 5e8d2a
  for (i = 0; *s; s++, i++){
Packit Service 5e8d2a
    if (strchr (URL_UNSAFE,(int) *s)||!ISPRINT((int)*s)){
Packit Service 5e8d2a
      i += 2; /* Two more characters (hex digits) */
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
Packit Service 5e8d2a
  res = (char *)malloc (i + 1);
Packit Service 5e8d2a
  s = b;
Packit Service 5e8d2a
  for (p = res; *s; s++){
Packit Service 5e8d2a
    if (strchr (URL_UNSAFE, *s)||!ISPRINT((int)*s))
Packit Service 5e8d2a
      {
Packit Service 5e8d2a
        const unsigned char c = *s;
Packit Service 5e8d2a
        *p++ = '%';
Packit Service 5e8d2a
        *p++ = HEXD2ASC (c >> 4);
Packit Service 5e8d2a
        *p++ = HEXD2ASC (c & 0xf);
Packit Service 5e8d2a
      }
Packit Service 5e8d2a
    else {
Packit Service 5e8d2a
      *p++ = *s;
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  *p = '\0';
Packit Service 5e8d2a
  return res;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
char* perm_to_char(mode_t perm)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  char*pc=NULL;
Packit Service 5e8d2a
  int i=0;
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  pc=(char*)malloc(sizeof(char)*11);
Packit Service 5e8d2a
  for(i=0;i<10;i++){
Packit Service 5e8d2a
    pc[i]='-';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  pc[10]='\0';
Packit Service 5e8d2a
Packit Service 5e8d2a
  if(S_ISDIR(perm))
Packit Service 5e8d2a
    pc[0]='d';
Packit Service 5e8d2a
#ifdef S_ISFIFO
Packit Service 5e8d2a
  if(S_ISFIFO(perm))
Packit Service 5e8d2a
    pc[0]='p';
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  if(S_ISLNK(perm))
Packit Service 5e8d2a
    pc[0]='l';
Packit Service 5e8d2a
  if(S_ISBLK(perm))
Packit Service 5e8d2a
    pc[0]='b';
Packit Service 5e8d2a
  if(S_ISCHR(perm))
Packit Service 5e8d2a
    pc[0]='c';
Packit Service 5e8d2a
#ifdef S_ISDOOR
Packit Service 5e8d2a
  if(S_ISDOOR(perm))
Packit Service 5e8d2a
    pc[0]='|';
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef S_ISSOCK
Packit Service 5e8d2a
  if(S_ISSOCK(perm))
Packit Service 5e8d2a
    pc[0]='s';
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  if((S_IRUSR&perm)==S_IRUSR){
Packit Service 5e8d2a
    pc[1]='r';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IWUSR&perm)==S_IWUSR){
Packit Service 5e8d2a
    pc[2]='w';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IXUSR&perm)==S_IXUSR){
Packit Service 5e8d2a
    pc[3]='x';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IRGRP&perm)==S_IRGRP){
Packit Service 5e8d2a
    pc[4]='r';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IWGRP&perm)==S_IWGRP){
Packit Service 5e8d2a
    pc[5]='w';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IXGRP&perm)==S_IXGRP){
Packit Service 5e8d2a
    pc[6]='x';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IROTH&perm)==S_IROTH){
Packit Service 5e8d2a
    pc[7]='r';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IWOTH&perm)==S_IWOTH){
Packit Service 5e8d2a
    pc[8]='w';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_IXOTH&perm)==S_IXOTH){
Packit Service 5e8d2a
    pc[9]='x';
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
Packit Service 5e8d2a
  if((S_ISUID&perm)==S_ISUID){
Packit Service 5e8d2a
    if((S_IXUSR&perm)==S_IXUSR){
Packit Service 5e8d2a
      pc[3]='s';
Packit Service 5e8d2a
    } else {
Packit Service 5e8d2a
      pc[3]='S';
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  if((S_ISGID&perm)==S_ISGID){
Packit Service 5e8d2a
    if((S_IXGRP&perm)==S_IXGRP){
Packit Service 5e8d2a
      pc[6]='s';
Packit Service 5e8d2a
    } else {
Packit Service 5e8d2a
      pc[6]='l';
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#if defined (S_ISVTX) && defined (S_IXOTH)
Packit Service 5e8d2a
  if((S_ISVTX&perm)==S_ISVTX){
Packit Service 5e8d2a
    if((S_IXOTH&perm)==S_IXOTH){
Packit Service 5e8d2a
      pc[9]='t';
Packit Service 5e8d2a
    } else {
Packit Service 5e8d2a
      pc[9]='T';
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
  error(240,"perm_to_char(): %i -> %s\n",perm,pc);
Packit Service 5e8d2a
Packit Service 5e8d2a
  return pc;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
void init_sighandler()
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  signal(SIGBUS,sig_handler);
Packit Service 5e8d2a
  signal(SIGTERM,sig_handler);
Packit Service 5e8d2a
  signal(SIGUSR1,sig_handler);
Packit Service 5e8d2a
  signal(SIGUSR2,sig_handler);
Packit Service 5e8d2a
  signal(SIGHUP,sig_handler);
Packit Service 5e8d2a
Packit Service 5e8d2a
  return;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
void sig_handler(int signum)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  switch(signum){
Packit Service 5e8d2a
  case SIGBUS  : 
Packit Service 5e8d2a
  case SIGSEGV :{
Packit Service 5e8d2a
    error(200,"Caught SIGBUS/SIGSEGV\n");
Packit Service 5e8d2a
    if(conf->catch_mmap==1){
Packit Service 5e8d2a
      error(4,"Caught SIGBUS/SEGV while mmapping. File was truncated while aide was running?\n");
Packit Service 5e8d2a
      conf->catch_mmap=0;
Packit Service 5e8d2a
    } else {
Packit Service 5e8d2a
      error(0,"Caught SIGBUS/SEGV. Exiting\n");
Packit Service 5e8d2a
      exit(EXIT_FAILURE);
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case SIGHUP : {
Packit Service 5e8d2a
    error(4,"Caught SIGHUP\n");
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case SIGTERM : {
Packit Service 5e8d2a
    error(4,"Caught SIGTERM\nUse SIGKILL to terminate\n");
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case SIGUSR1 : {
Packit Service 5e8d2a
    error(4,"Setting output to debug level according to signal\n");
Packit Service 5e8d2a
    conf->verbose_level=220;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case SIGUSR2 : {
Packit Service 5e8d2a
    error(4,"Setting output to normal level according to signal\n");
Packit Service 5e8d2a
    conf->verbose_level=5;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  error(220,"Caught signal %d\n",signum);
Packit Service 5e8d2a
  init_sighandler();
Packit Service 5e8d2a
Packit Service 5e8d2a
  return;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
char *expand_tilde(char *path) {
Packit Service 5e8d2a
    char *homedir, *full;
Packit Service 5e8d2a
    size_t path_len, homedir_len, full_len;
Packit Service 5e8d2a
Packit Service 5e8d2a
    if (path != NULL) {
Packit Service 5e8d2a
        if (path[0] == '~') {
Packit Service 5e8d2a
            if((homedir=getenv("HOME")) != NULL) {
Packit Service 5e8d2a
                path_len = strlen(path+sizeof(char));
Packit Service 5e8d2a
                homedir_len = strlen(homedir);
Packit Service 5e8d2a
                full_len = homedir_len+path_len;
Packit Service 5e8d2a
                full = malloc(sizeof(char) * (full_len+1));
Packit Service 5e8d2a
                strncpy(full, homedir, homedir_len);
Packit Service 5e8d2a
                strncpy(full+homedir_len, path+sizeof(char), path_len);
Packit Service 5e8d2a
                full[full_len] = '\0';
Packit Service 5e8d2a
                free(path);
Packit Service 5e8d2a
                /* Don't free(homedir); because it is not safe on some platforms */
Packit Service 5e8d2a
                path = full;
Packit Service 5e8d2a
            } else {
Packit Service 5e8d2a
                error(3, _("Variable name 'HOME' not found in environment. '~' cannot be expanded\n"));
Packit Service 5e8d2a
            }
Packit Service 5e8d2a
        } else if (path[0] == '\\' && path[1] == '~') {
Packit Service 5e8d2a
            path += sizeof(char);
Packit Service 5e8d2a
        }
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
    return path;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
/* Like strstr but only do search for maximum of n chars.
Packit Service 5e8d2a
   haystack does not have to be NULL terminated
Packit Service 5e8d2a
   needle has to be NULL terminated. NULL in needle is not used in compare.
Packit Service 5e8d2a
   NULLs in haystack are ignored.
Packit Service 5e8d2a
*/
Packit Service 5e8d2a
#ifndef HAVE_STRNSTR
Packit Service 5e8d2a
char* strnstr(char* haystack,char* needle,int n)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
  char* h=haystack;
Packit Service 5e8d2a
  char* s=needle;
Packit Service 5e8d2a
  int slen=strlen(s);
Packit Service 5e8d2a
  int i=0;
Packit Service 5e8d2a
Packit Service 5e8d2a
  for(i=0;i
Packit Service 5e8d2a
    /* If terminating NULL is reached in needle string
Packit Service 5e8d2a
       then we have a match */
Packit Service 5e8d2a
    if(*s=='\0'){
Packit Service 5e8d2a
      return &haystack[i-slen];
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
    if(*s==*h){
Packit Service 5e8d2a
      s++;
Packit Service 5e8d2a
    }else{
Packit Service 5e8d2a
      s=needle;
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
    h++;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  /* Handle the special case that we are at the end of haystack 
Packit Service 5e8d2a
     and match is right at the end 
Packit Service 5e8d2a
  */
Packit Service 5e8d2a
  if(*s=='\0'){
Packit Service 5e8d2a
    return &haystack[i-slen];
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  /* If we get this far no match was found so we return NULL */
Packit Service 5e8d2a
  return NULL;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
#ifndef HAVE_STRNLEN
Packit Service 5e8d2a
size_t strnlen(const char *s, size_t maxlen)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
	size_t l;
Packit Service 5e8d2a
	l=strlen(s);
Packit Service 5e8d2a
	if(l>maxlen)
Packit Service 5e8d2a
		return maxlen;
Packit Service 5e8d2a
	return l;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
/* Lookup syslog facilities by name */
Packit Service 5e8d2a
int syslog_facility_lookup(char *s)
Packit Service 5e8d2a
{
Packit Service 5e8d2a
	if(!s || strlen(s)<1)
Packit Service 5e8d2a
		return(AIDE_SYSLOG_FACILITY);
Packit Service 5e8d2a
#ifdef LOG_KERN
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_KERN")==0)
Packit Service 5e8d2a
		return(LOG_KERN);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_USER
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_USER")==0)
Packit Service 5e8d2a
		return(LOG_USER);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_MAIL
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_MAIL")==0)
Packit Service 5e8d2a
		return(LOG_MAIL);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_DAEMON
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_DAEMON")==0)
Packit Service 5e8d2a
		return(LOG_DAEMON);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_AUTH
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_AUTH")==0)
Packit Service 5e8d2a
		return(LOG_AUTH);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_SYSLOG
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_SYSLOG")==0)
Packit Service 5e8d2a
		return(LOG_SYSLOG);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LPR
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LPR")==0)
Packit Service 5e8d2a
		return(LOG_LPR);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_NEWS
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_NEWS")==0)
Packit Service 5e8d2a
		return(LOG_NEWS);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_UUCP
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_UUCP")==0)
Packit Service 5e8d2a
		return(LOG_UUCP);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_CRON
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_CRON")==0)
Packit Service 5e8d2a
		return(LOG_CRON);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL0
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL0")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL0);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL1
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL1")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL1);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL2
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL2")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL2);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL3
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL3")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL3);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL4
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL4")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL4);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL5
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL5")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL5);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL6
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL6")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL6);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#ifdef LOG_LOCAL7
Packit Service 5e8d2a
	if(strcasecmp(s,"LOG_LOCAL7")==0)
Packit Service 5e8d2a
		return(LOG_LOCAL7);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
	error(0,"Syslog facility \"%s\" is unknown, using default\n",s);
Packit Service 5e8d2a
	return(AIDE_SYSLOG_FACILITY);
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
const char* aide_key_2=CONFHMACKEY_02;
Packit Service 5e8d2a
const char* db_key_2=DBHMACKEY_02;