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