Blame src/commandconf.c

Packit 762fc5
/* aide, Advanced Intrusion Detection Environment
Packit 762fc5
 *
Packit 762fc5
 * Copyright (C) 1999-2006,2010,2011,2013,2015,2016 Rami Lehti, Pablo
Packit 762fc5
 * Virolainen, 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 <stdio.h>
Packit 762fc5
#include <stdlib.h>
Packit 762fc5
#include <string.h>
Packit 762fc5
#include <unistd.h>
Packit 762fc5
#include <errno.h>
Packit 762fc5
#include <sys/param.h>
Packit 762fc5
Packit 762fc5
#include "commandconf.h"
Packit 762fc5
#include "conf_lex.h"
Packit 762fc5
#include "conf_yacc.h"
Packit 762fc5
#include "db.h"
Packit 762fc5
#include "db_config.h"
Packit 762fc5
#include "gen_list.h"
Packit 762fc5
#include "symboltable.h"
Packit 762fc5
#include "md.h"
Packit 762fc5
#include "util.h"
Packit 762fc5
#include "base64.h"
Packit 762fc5
/*for locale support*/
Packit 762fc5
#include "locale-aide.h"
Packit 762fc5
/*for locale support*/
Packit 762fc5
#ifdef WITH_CURL
Packit 762fc5
#include "fopen.h"
Packit 762fc5
#endif
Packit 762fc5
Packit 762fc5
#define BUFSIZE 4096
Packit 762fc5
#define ZBUFSIZE 16384
Packit 762fc5
Packit 762fc5
#ifndef MAXHOSTNAMELEN
Packit 762fc5
#define MAXHOSTNAMELEN 256
Packit 762fc5
#endif
Packit 762fc5
Packit 762fc5
int commandconf(const char mode,const char* line)
Packit 762fc5
{
Packit 762fc5
  static char* before=NULL;
Packit 762fc5
  static char* config=NULL;
Packit 762fc5
  static char* after=NULL;
Packit 762fc5
  char* all=NULL;
Packit 762fc5
  char* tmp=NULL;
Packit 762fc5
  int l=0;
Packit 762fc5
Packit 762fc5
  switch(mode){
Packit 762fc5
  case 'B':{
Packit 762fc5
    if(before==NULL){
Packit 762fc5
      before=strdup(line);
Packit 762fc5
    }
Packit 762fc5
    else {
Packit 762fc5
      tmp=(char*)malloc(sizeof(char)
Packit 762fc5
			*(strlen(before)+strlen(line)+2));
Packit 762fc5
      tmp[0]='\0';
Packit 762fc5
      strcat(tmp,before);
Packit 762fc5
      strcat(tmp,"\n");
Packit 762fc5
      strcat(tmp,line);
Packit 762fc5
      free(before);
Packit 762fc5
      before=tmp;
Packit 762fc5
    }
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  case 'C':{
Packit 762fc5
    config=strdup(line);
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  case 'A':{
Packit 762fc5
    if(after==NULL){
Packit 762fc5
      after=strdup(line);
Packit 762fc5
    }
Packit 762fc5
    else {
Packit 762fc5
      tmp=(char*)malloc(sizeof(char)
Packit 762fc5
			*(strlen(after)+strlen(line)+2));
Packit 762fc5
      strcpy(tmp,after);
Packit 762fc5
      strcat(tmp,"\n");
Packit 762fc5
      strcat(tmp,line);
Packit 762fc5
      free(after);
Packit 762fc5
      after=tmp;
Packit 762fc5
    }
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  case 'D': {
Packit 762fc5
    /* Let's do it */
Packit 762fc5
    int rv=-1;
Packit 762fc5
Packit 762fc5
    config = expand_tilde(config);
Packit 762fc5
    if (config!=NULL && strcmp(config,"-")==0) {
Packit 762fc5
      error(255,_("Config from stdin\n"));
Packit 762fc5
      rv=0;
Packit 762fc5
    } else {
Packit 762fc5
      
Packit 762fc5
      rv=access(config,R_OK);
Packit 762fc5
      if(rv==-1){
Packit 762fc5
	error(0,_("Cannot access config file: %s: %s\n"),config,strerror(errno));
Packit 762fc5
      }
Packit 762fc5
    }
Packit 762fc5
    
Packit 762fc5
    if(before==NULL&&after==NULL&&
Packit 762fc5
       (config==NULL||strcmp(config,"")==0||rv==-1)){
Packit 762fc5
      error(0,_("No config defined\n"));
Packit 762fc5
      return RETFAIL;
Packit 762fc5
    }
Packit 762fc5
    if(before!=NULL) {
Packit 762fc5
      l+=strlen(before);
Packit 762fc5
    }
Packit 762fc5
    if(config!=NULL) {
Packit 762fc5
      l+=strlen(config);
Packit 762fc5
    }
Packit 762fc5
    if(after!=NULL) {
Packit 762fc5
      l+=strlen(after);
Packit 762fc5
    }
Packit 762fc5
    l+=strlen("@@include \n\n\n")+1;
Packit 762fc5
    
Packit 762fc5
    all=(char*)malloc(sizeof(char)*l);
Packit 762fc5
Packit 762fc5
    memset(all,0,l);
Packit 762fc5
    if(before!=NULL){
Packit 762fc5
      strcat(all,before);
Packit 762fc5
      strcat(all,"\n");
Packit 762fc5
    }
Packit 762fc5
    strcat(all,"@@include ");
Packit 762fc5
    strcat(all,config);
Packit 762fc5
    strcat(all,"\n");
Packit 762fc5
    if(after!=NULL){
Packit 762fc5
      strcat(all,after);
Packit 762fc5
      strcat(all,"\n");
Packit 762fc5
    }
Packit 762fc5
    
Packit 762fc5
    error(200,"commandconf():%s\n",all);
Packit 762fc5
    
Packit 762fc5
    conf_scan_string(all);
Packit 762fc5
    
Packit 762fc5
    if(confparse()){
Packit 762fc5
      free(all);
Packit 762fc5
      return RETFAIL;
Packit 762fc5
    }
Packit 762fc5
    free(all);
Packit 762fc5
    
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  default: {
Packit 762fc5
    error(0,_("Illegal argument %c to commmandconf()\n"),mode);
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  }
Packit 762fc5
  return RETOK;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int conf_input_wrapper(char* buf, int max_size, FILE* in)
Packit 762fc5
{
Packit 762fc5
  int retval=0;
Packit 762fc5
  int c=0;
Packit 762fc5
  char* tmp=NULL;
Packit 762fc5
  void* key=NULL;
Packit 762fc5
  int keylen=0;
Packit 762fc5
Packit 762fc5
  /* FIXME Add support for gzipped config. :) */
Packit 762fc5
#ifdef WITH_MHASH
Packit 762fc5
  /* Read a character at a time until we are doing md */
Packit 762fc5
  if(conf->do_configmd){
Packit 762fc5
    retval=fread(buf,1,max_size,in);
Packit 762fc5
  }else {
Packit 762fc5
    c=fgetc(in);
Packit 762fc5
    retval= (c==EOF) ? 0 : (buf[0] = c,1);
Packit 762fc5
  }
Packit 762fc5
#else
Packit 762fc5
  retval=fread(buf,1,max_size,in);
Packit 762fc5
#endif 
Packit 762fc5
Packit 762fc5
#ifdef WITH_MHASH    
Packit 762fc5
  if(conf->do_configmd||conf->config_check){
Packit 762fc5
    if(((conf->do_configmd==1)&&conf->config_check)||!conf->confmd){
Packit 762fc5
      if(conf->do_configmd==1){
Packit 762fc5
	conf->do_configmd+=1;
Packit 762fc5
      }
Packit 762fc5
      if((key=get_conf_key())!=NULL){
Packit 762fc5
	keylen=get_conf_key_len();
Packit 762fc5
	
Packit 762fc5
	if( (conf->confmd=
Packit 762fc5
	     mhash_hmac_init(conf->confhmactype,
Packit 762fc5
			     key,
Packit 762fc5
			     keylen,
Packit 762fc5
			     mhash_get_hash_pblock(conf->confhmactype)))==
Packit 762fc5
	    MHASH_FAILED){
Packit 762fc5
	  error(0, "mhash_hmac_init() failed for %i for config check. Aborting\n",
Packit 762fc5
		conf->confhmactype);
Packit 762fc5
	  exit(EXIT_FAILURE);
Packit 762fc5
	}
Packit 762fc5
      } else {
Packit 762fc5
	conf->do_configmd=0;
Packit 762fc5
	return retval;
Packit 762fc5
      }
Packit 762fc5
    }
Packit 762fc5
    /* FIXME This does not handle the case that @@end_config is on 
Packit 762fc5
       buffer boundary. */
Packit 762fc5
    if((tmp=strnstr(buf,"@@end_config",retval))!=NULL){
Packit 762fc5
      /* We have end of config don't feed the last line to mhash */
Packit 762fc5
      mhash(conf->confmd,(void*)buf,tmp-buf);
Packit 762fc5
    } else {
Packit 762fc5
      mhash(conf->confmd,(void*)buf,retval);
Packit 762fc5
    }
Packit 762fc5
  }
Packit 762fc5
#endif
Packit 762fc5
  return retval;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int db_input_wrapper(char* buf, int max_size, int db)
Packit 762fc5
{
Packit 762fc5
  int retval=0;
Packit 762fc5
  int c=0;
Packit 762fc5
  int err=0;
Packit 762fc5
  int* domd=NULL;
Packit 762fc5
#ifdef WITH_CURL
Packit 762fc5
  url_t* db_url=NULL;
Packit 762fc5
#endif
Packit 762fc5
#ifdef WITH_MHASH
Packit 762fc5
  char* tmp=NULL;
Packit 762fc5
  MHASH* md=NULL;
Packit 762fc5
  void* key=NULL;
Packit 762fc5
  int keylen;
Packit 762fc5
#endif
Packit 762fc5
  FILE** db_filep=NULL;
Packit 762fc5
#ifdef WITH_ZLIB
Packit 762fc5
  gzFile* db_gzp=NULL;
Packit 762fc5
#endif
Packit 762fc5
  struct md_container *mdc;
Packit 762fc5
  switch(db) {
Packit 762fc5
  case DB_OLD: {
Packit 762fc5
#ifdef WITH_CURL
Packit 762fc5
    db_url=conf->db_in_url;
Packit 762fc5
#endif
Packit 762fc5
    
Packit 762fc5
    domd=&(conf->do_dboldmd);
Packit 762fc5
#ifdef WITH_MHASH
Packit 762fc5
    md=&(conf->dboldmd);
Packit 762fc5
#endif
Packit 762fc5
    
Packit 762fc5
    db_filep=&(conf->db_in);
Packit 762fc5
    
Packit 762fc5
#ifdef WITH_ZLIB
Packit 762fc5
    db_gzp=&(conf->db_gzin);
Packit 762fc5
#endif
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  case DB_NEW: {
Packit 762fc5
#ifdef WITH_CURL
Packit 762fc5
    db_url=conf->db_new_url;
Packit 762fc5
#endif
Packit 762fc5
    
Packit 762fc5
    domd=&(conf->do_dbnewmd);
Packit 762fc5
#ifdef WITH_MHASH
Packit 762fc5
    md=&(conf->dbnewmd);
Packit 762fc5
#endif
Packit 762fc5
    
Packit 762fc5
    db_filep=&(conf->db_new);
Packit 762fc5
    
Packit 762fc5
#ifdef WITH_ZLIB
Packit 762fc5
    db_gzp=&(conf->db_gznew);
Packit 762fc5
#endif
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
#ifdef WITH_CURL
Packit 762fc5
  switch (db_url->type) {
Packit 762fc5
  case url_http:
Packit 762fc5
  case url_https:
Packit 762fc5
  case url_ftp: {
Packit 762fc5
    retval=url_fread(buf,1,max_size,(URL_FILE *)*db_filep);
Packit 762fc5
    if ((mdc = (db == DB_OLD ? conf->mdc_in : conf->mdc_out))) {
Packit 762fc5
        update_md(mdc, buf, retval);
Packit 762fc5
    }
Packit 762fc5
    break;
Packit 762fc5
  } 
Packit 762fc5
  default:
Packit 762fc5
#endif /* WITH CURL */
Packit 762fc5
Packit 762fc5
Packit 762fc5
  /* Read a character at a time until we are doing md */
Packit 762fc5
#ifdef WITH_ZLIB
Packit 762fc5
  if((*db_gzp==NULL)&&(*domd)){
Packit 762fc5
    retval=fread(buf,1,max_size,*db_filep);
Packit 762fc5
  }
Packit 762fc5
  if((*db_gzp!=NULL)&&(*domd)){
Packit 762fc5
    if(gzeof(*db_gzp)){
Packit 762fc5
      retval=0;
Packit 762fc5
      buf[0]='\0';
Packit 762fc5
    }else {
Packit 762fc5
      if((retval=gzread(*db_gzp,buf,max_size))<0){
Packit 762fc5
	error(0,_("gzread() failed: gzerr=%s!\n"),gzerror(*db_gzp,&err));
Packit 762fc5
	retval=0;
Packit 762fc5
	buf[0]='\0';
Packit 762fc5
      } else {
Packit 762fc5
	/* gzread returns 0 even if uncompressed bytes were read*/
Packit 762fc5
	error(240,"nread=%d,strlen(buf)=%lu,errno=%s,gzerr=%s\n",
Packit 762fc5
              retval,(unsigned long)strnlen((char*)buf, max_size),
Packit 762fc5
              strerror(errno),gzerror(*db_gzp,&err));
Packit 762fc5
	if(retval==0){
Packit 762fc5
	  retval=strnlen((char*)buf, max_size);
Packit 762fc5
	}
Packit 762fc5
      }
Packit 762fc5
    }
Packit 762fc5
  }
Packit 762fc5
  if((*db_gzp!=NULL)&&!(*domd)){
Packit 762fc5
    c=gzgetc(*db_gzp);
Packit 762fc5
    retval= (c==EOF) ? 0 : (buf[0] = c,1);
Packit 762fc5
  }
Packit 762fc5
  if((*db_gzp==NULL)&&!(*domd)){
Packit 762fc5
    c=fgetc(*db_filep);
Packit 762fc5
    if(c==(unsigned char)'\037'){
Packit 762fc5
      c=fgetc(*db_filep);
Packit 762fc5
      if(c==(unsigned char)'\213'){
Packit 762fc5
	/* We got gzip header. */
Packit 762fc5
	error(255,"Got Gzip header. Handling..\n");
Packit 762fc5
	lseek(fileno(*db_filep),0L,SEEK_SET);
Packit 762fc5
	*db_gzp=gzdopen(fileno(*db_filep),"rb");
Packit 762fc5
	c=gzgetc(*db_gzp);
Packit 762fc5
	error(255,"First character after gzip header is: %c(%#X)\n",c,c);
Packit 762fc5
  if(c==-1) {
Packit 762fc5
    int xx;
Packit 762fc5
	  error(0,"Error reading gzipped file: %s\n",gzerror(*db_gzp,&xx));
Packit 762fc5
    exit(EXIT_FAILURE);
Packit 762fc5
  }
Packit 762fc5
      }else {
Packit 762fc5
	/* False alarm */
Packit 762fc5
	ungetc(c,*db_filep);
Packit 762fc5
      }
Packit 762fc5
    }
Packit 762fc5
    retval= (c==EOF) ? 0 : (buf[0] = c,1);
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
#else /* WITH_ZLIB */
Packit 762fc5
#ifdef WITH_MHASH
Packit 762fc5
  if(*domd){
Packit 762fc5
    retval=fread(buf,1,max_size,*db_filep);
Packit 762fc5
  }else {
Packit 762fc5
    c=fgetc(*db_filep);
Packit 762fc5
    retval= (c==EOF) ? 0 : (buf[0] = c,1);
Packit 762fc5
  }
Packit 762fc5
#else /* WITH_MHASH */
Packit 762fc5
  retval=fread(buf,1,max_size,*db_filep);
Packit 762fc5
#endif /* WITH_MHASH */ 
Packit 762fc5
#endif /* WITH_ZLIB */
Packit 762fc5
Packit 762fc5
  if ((mdc = (db == DB_OLD ? conf->mdc_in : conf->mdc_out))) {
Packit 762fc5
      update_md(mdc, buf, retval);
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
#ifdef WITH_MHASH    
Packit 762fc5
  if(*domd){
Packit 762fc5
    if(!*md){
Packit 762fc5
      if((key=get_db_key())!=NULL){
Packit 762fc5
	keylen=get_db_key_len();
Packit 762fc5
	
Packit 762fc5
	if( (*md=
Packit 762fc5
	     mhash_hmac_init(conf->dbhmactype,
Packit 762fc5
			     key,
Packit 762fc5
			     keylen,
Packit 762fc5
			     mhash_get_hash_pblock(conf->dbhmactype)))==
Packit 762fc5
	    MHASH_FAILED){
Packit 762fc5
	  error(0, "mhash_hmac_init() failed for db check. Aborting\n");
Packit 762fc5
	  exit(EXIT_FAILURE);
Packit 762fc5
	}
Packit 762fc5
      } else {
Packit 762fc5
	*domd=0;
Packit 762fc5
      }
Packit 762fc5
    }
Packit 762fc5
    /* FIXME This does not handle the case that @@end_config is on 
Packit 762fc5
       buffer boundary. */
Packit 762fc5
    if (*domd!=0) {
Packit 762fc5
      if((tmp=strnstr(buf,"@@end_db",retval))!=NULL){
Packit 762fc5
	/* We have end of db don't feed the last line to mhash */
Packit 762fc5
	mhash(*md,(void*)buf,tmp-buf);
Packit 762fc5
	/* We don't want to come here again after the *md has been deinited 
Packit 762fc5
	   by db_readline_file() */
Packit 762fc5
	*domd=0;
Packit 762fc5
      } else {
Packit 762fc5
	mhash(*md,(void*)buf,retval);
Packit 762fc5
      }
Packit 762fc5
    }
Packit 762fc5
  }
Packit 762fc5
#endif
Packit 762fc5
Packit 762fc5
#ifdef WITH_CURL
Packit 762fc5
  }
Packit 762fc5
#endif /* WITH CURL */
Packit 762fc5
  return retval;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int check_db_order(DB_FIELD* d,int size, DB_FIELD a)
Packit 762fc5
{
Packit 762fc5
  int i;
Packit 762fc5
  for(i=0;i
Packit 762fc5
    if(d[i]==a)
Packit 762fc5
      return RETFAIL;
Packit 762fc5
  }
Packit 762fc5
  return RETOK;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int check_dboo(DB_FIELD a){
Packit 762fc5
  return check_db_order(conf->db_out_order,conf->db_out_size,a);
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void update_db_out_order(DB_ATTR_TYPE attr)
Packit 762fc5
{
Packit 762fc5
  /* First we add those attributes that must be there */
Packit 762fc5
  if (check_dboo(db_linkname)==RETOK) {
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_linkname;
Packit 762fc5
  }
Packit 762fc5
  if (check_dboo(db_attr)==RETOK) {
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_attr;
Packit 762fc5
  }
Packit 762fc5
  if(check_dboo(db_perm)==RETOK){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_perm;
Packit 762fc5
  }
Packit 762fc5
  if(check_dboo(db_inode)==RETOK){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_inode;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_BCOUNT) && (check_dboo(db_bcount)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_bcount;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_UID) && (check_dboo(db_uid)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_uid;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_GID) && (check_dboo(db_gid)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_gid;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_SIZE) && (check_dboo(db_size)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_size;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_SIZEG) && (check_dboo(db_size)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_size;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_ATIME) && (check_dboo(db_atime)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_atime;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_MTIME) && (check_dboo(db_mtime)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_mtime;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_CTIME) && (check_dboo(db_ctime)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_ctime;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_LNKCOUNT) && (check_dboo(db_lnkcount)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_lnkcount;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_MD5) && (check_dboo(db_md5)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_md5;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_SHA1) && (check_dboo(db_sha1)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_sha1;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_RMD160) && (check_dboo(db_rmd160)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_rmd160;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_TIGER) && (check_dboo(db_tiger)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_tiger;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_CRC32) && (check_dboo(db_crc32)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_crc32;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_HAVAL) && (check_dboo(db_haval)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_haval;
Packit 762fc5
  }
Packit 762fc5
  /*
Packit 762fc5
#ifdef WITH_MHASH
Packit 762fc5
  */
Packit 762fc5
  if((attr&DB_GOST) && (check_dboo(db_gost)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_gost;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_WHIRLPOOL) && (check_dboo(db_whirlpool)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_whirlpool;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_CRC32B) && (check_dboo(db_crc32b)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_crc32b;
Packit 762fc5
  }
Packit 762fc5
  /*
Packit 762fc5
#endif
Packit 762fc5
  */
Packit 762fc5
  if((attr&DB_SHA256) && (check_dboo(db_sha256)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_sha256;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_SHA512) && (check_dboo(db_sha512)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_sha512;
Packit 762fc5
  }
Packit 762fc5
#ifdef WITH_ACL
Packit 762fc5
  if((attr&DB_ACL) && (check_dboo(db_acl)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_acl;
Packit 762fc5
  }
Packit 762fc5
#endif
Packit 762fc5
  if((attr&DB_XATTRS) && (check_dboo(db_xattrs)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_xattrs;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_SELINUX) && (check_dboo(db_selinux)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_selinux;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_E2FSATTRS) && (check_dboo(db_e2fsattrs)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_e2fsattrs;
Packit 762fc5
  }
Packit 762fc5
  if((attr&DB_CHECKMASK) && (check_dboo(db_checkmask)!=RETFAIL)){
Packit 762fc5
    conf->db_out_order[conf->db_out_size++]=db_checkmask;
Packit 762fc5
  }
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
Packit 762fc5
char* get_variable_value(char* var)
Packit 762fc5
{
Packit 762fc5
  list* r=NULL;
Packit 762fc5
  
Packit 762fc5
  if((r=list_find(var,conf->defsyms))){
Packit 762fc5
    return (((symba*)r->data)->value);
Packit 762fc5
  };
Packit 762fc5
Packit 762fc5
  return NULL;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void putbackvariable(char* var)
Packit 762fc5
{
Packit 762fc5
  char* a=NULL;
Packit 762fc5
  
Packit 762fc5
  char* v=strdup(var);
Packit 762fc5
  
Packit 762fc5
  char* subst_begin=strstr(v,"@@{");
Packit 762fc5
  char* subst_end=strstr(subst_begin,"}");
Packit 762fc5
  
Packit 762fc5
  char* tmp=(char*)malloc((subst_end-subst_begin)+1);
Packit 762fc5
  
Packit 762fc5
  tmp = strncpy(tmp,subst_begin+3,subst_end-subst_begin-3);
Packit 762fc5
  
Packit 762fc5
  tmp[subst_end-subst_begin-3]='\0';
Packit 762fc5
  
Packit 762fc5
  conf_put_token(subst_end+1);
Packit 762fc5
  
Packit 762fc5
  if((a=get_variable_value(tmp))!=NULL){
Packit 762fc5
    conf_put_token(a);
Packit 762fc5
  }
Packit 762fc5
  else {
Packit 762fc5
    
Packit 762fc5
    error(230,_("Variable %s not defined\n"),tmp);
Packit 762fc5
Packit 762fc5
    /*
Packit 762fc5
     * We can use nondefined variable
Packit 762fc5
     */ 
Packit 762fc5
  }
Packit 762fc5
  
Packit 762fc5
  subst_begin[0]='\0';
Packit 762fc5
  
Packit 762fc5
  conf_put_token(v);
Packit 762fc5
  conf_put_token("\n");
Packit 762fc5
  free(v);
Packit 762fc5
  free(tmp);
Packit 762fc5
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
Packit 762fc5
void do_define(char* name, char* value)
Packit 762fc5
{
Packit 762fc5
  symba* s=NULL;
Packit 762fc5
  list* l=NULL;
Packit 762fc5
Packit 762fc5
  if(!(l=list_find(name,conf->defsyms))){
Packit 762fc5
    s=(symba*)malloc(sizeof(symba));
Packit 762fc5
    s->name=name;
Packit 762fc5
    s->value=value;
Packit 762fc5
    conf->defsyms=list_append(conf->defsyms,(void*)s);
Packit 762fc5
  }
Packit 762fc5
  else {
Packit 762fc5
    free(((symba*)l->data)->value);
Packit 762fc5
    ((symba*)l->data)->value=NULL;
Packit 762fc5
    ((symba*)l->data)->value=value;
Packit 762fc5
  }
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_undefine(char* name)
Packit 762fc5
{
Packit 762fc5
  list*r=NULL;
Packit 762fc5
Packit 762fc5
  if((r=list_find(name,conf->defsyms))){
Packit 762fc5
    free(((symba*)r->data)->value);
Packit 762fc5
    free((symba*)r->data);
Packit 762fc5
    r->data=NULL;
Packit 762fc5
    conf->defsyms=list_delete_item(r);
Packit 762fc5
  }
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int handle_endif(int doit,int allow_else){
Packit 762fc5
  
Packit 762fc5
  if(doit){
Packit 762fc5
    int count=1;
Packit 762fc5
    error(230,_("\nEating until @@endif\n"));
Packit 762fc5
    do {
Packit 762fc5
      int i = conflex();
Packit 762fc5
      switch (i) {
Packit 762fc5
      case TIFDEF : {
Packit 762fc5
	count++;
Packit 762fc5
	break;
Packit 762fc5
      }
Packit 762fc5
      case TIFNDEF : {
Packit 762fc5
	count++;
Packit 762fc5
	break;
Packit 762fc5
      }
Packit 762fc5
      case TENDIF : {
Packit 762fc5
	count--;
Packit 762fc5
	break;
Packit 762fc5
      }
Packit 762fc5
Packit 762fc5
      case TIFHOST : {
Packit 762fc5
	count++;
Packit 762fc5
	break;
Packit 762fc5
      }
Packit 762fc5
Packit 762fc5
      case TIFNHOST : {
Packit 762fc5
	count++;
Packit 762fc5
	break;
Packit 762fc5
      }
Packit 762fc5
      
Packit 762fc5
      case TELSE : {
Packit 762fc5
	
Packit 762fc5
	if (count==1) {
Packit 762fc5
	  /*
Packit 762fc5
	   * We have done enough 
Packit 762fc5
	   */ 
Packit 762fc5
	  if (allow_else) {
Packit 762fc5
	    return 0;
Packit 762fc5
	  }
Packit 762fc5
	  else {
Packit 762fc5
	    conferror("Ambiguous else");
Packit 762fc5
	    return -1;
Packit 762fc5
	  }
Packit 762fc5
	}
Packit 762fc5
	
Packit 762fc5
	break;
Packit 762fc5
      }
Packit 762fc5
      
Packit 762fc5
      case 0 : {
Packit 762fc5
	conferror("@@endif or @@else expected");
Packit 762fc5
	return -1;
Packit 762fc5
	count=0;
Packit 762fc5
      }
Packit 762fc5
      
Packit 762fc5
      default : {
Packit 762fc5
	/*
Packit 762fc5
 	 * empty default
Packit 762fc5
	 */
Packit 762fc5
      }
Packit 762fc5
      }
Packit 762fc5
      
Packit 762fc5
      
Packit 762fc5
    } while (count!=0);
Packit 762fc5
    
Packit 762fc5
    conf_put_token("\n@@endif\n");
Packit 762fc5
    error(230,"\nEating done\n");
Packit 762fc5
  }
Packit 762fc5
  
Packit 762fc5
  return 0;
Packit 762fc5
  
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int do_ifxdef(int mode,char* name)
Packit 762fc5
{
Packit 762fc5
  int doit;
Packit 762fc5
  doit=mode;
Packit 762fc5
Packit 762fc5
  if((list_find(name,conf->defsyms))){
Packit 762fc5
    doit=1-doit;
Packit 762fc5
  }
Packit 762fc5
  
Packit 762fc5
  return (handle_endif(doit,1));
Packit 762fc5
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
int do_ifxhost(int mode,char* name)
Packit 762fc5
{
Packit 762fc5
  int doit;
Packit 762fc5
  char* s=NULL;
Packit 762fc5
  char *p;
Packit 762fc5
  doit=mode;
Packit 762fc5
  s=(char*)malloc(sizeof(char)*MAXHOSTNAMELEN+1);
Packit 762fc5
  if (s == NULL) {
Packit 762fc5
    error(0,_("Couldn't malloc hostname buffer"));
Packit 762fc5
  }
Packit 762fc5
  s[MAXHOSTNAMELEN] = '\0';
Packit 762fc5
Packit 762fc5
  if(gethostname(s,MAXHOSTNAMELEN)==-1){
Packit 762fc5
    error(0,_("Couldn't get hostname %s"),name);
Packit 762fc5
    free(s);
Packit 762fc5
    return -1;
Packit 762fc5
  }  
Packit 762fc5
  /* strip off everything past the . */
Packit 762fc5
  p = strchr(s, '.');
Packit 762fc5
  if (p != NULL) {
Packit 762fc5
    *p = '\0';
Packit 762fc5
  }
Packit 762fc5
  if(strcmp(name,s)==0) {
Packit 762fc5
    doit=1-doit;
Packit 762fc5
  }
Packit 762fc5
  free(s);
Packit 762fc5
  return (handle_endif(doit,1));
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
list* append_rxlist(char* rx,DB_ATTR_TYPE attr,list* rxlst, RESTRICTION_TYPE restriction)
Packit 762fc5
{
Packit 762fc5
  extern long conf_lineno; /* defined & set in conf_lex.l */
Packit 762fc5
    
Packit 762fc5
  rx_rule* r=NULL;
Packit 762fc5
  r=(rx_rule*)malloc(sizeof(rx_rule));
Packit 762fc5
  r->rx=rx;
Packit 762fc5
  r->attr=attr;
Packit 762fc5
  r->conf_lineno = conf_lineno;
Packit 762fc5
  r->restriction = restriction;
Packit 762fc5
  if (attr&DB_CHECKINODE && attr&DB_CTIME)
Packit 762fc5
    error(20,"Rule at line %li has c and I flags enabled at the same time. If same inode is found, flag c is ignored\n",conf_lineno);
Packit 762fc5
  update_db_out_order(r->attr);
Packit 762fc5
  rxlst=list_append(rxlst,(void*)r);
Packit 762fc5
  
Packit 762fc5
  return rxlst;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_groupdef(char* group,DB_ATTR_TYPE value)
Packit 762fc5
{
Packit 762fc5
  list* r=NULL;
Packit 762fc5
  symba* s=NULL;
Packit 762fc5
Packit 762fc5
  if (strcmp(group, "ignore_list") == 0) {
Packit 762fc5
      error(2, "DEPRECATION WARNING, Using '%s' is deprecated. Update your config and use '%s' instead.\n", group, "report_ignore_changed_attrs");
Packit 762fc5
      group = "report_ignore_changed_attrs";
Packit 762fc5
  } else if (strcmp(group, "report_attributes") == 0) {
Packit 762fc5
      error(2, "DEPRECATION WARNING, Using '%s' is deprecated. Update your config and use '%s' instead.\n", group, "report_force_attrs");
Packit 762fc5
      group = "report_force_attrs";
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
  if((r=list_find(group,conf->groupsyms))){
Packit 762fc5
      error(2, "Warning: group '%s' is redefined\n", group);
Packit 762fc5
      ((symba*)r->data)->ival=value;
Packit 762fc5
      return;
Packit 762fc5
  }
Packit 762fc5
  /* This is a new group */
Packit 762fc5
  s=(symba*)malloc(sizeof(symba));
Packit 762fc5
  s->name=group;
Packit 762fc5
  s->ival=value;
Packit 762fc5
  conf->groupsyms=list_append(conf->groupsyms,(void*)s);
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
RESTRICTION_TYPE get_restrictionval(char* ch) {
Packit 762fc5
    if (strcmp(ch, "f") == 0) { return RESTRICTION_FT_REG; }
Packit 762fc5
    else if (strcmp(ch, "d") == 0) { return RESTRICTION_FT_DIR; }
Packit 762fc5
    else if (strcmp(ch, "p") == 0) { return RESTRICTION_FT_FIFO; }
Packit 762fc5
    else if (strcmp(ch, "l") == 0) { return RESTRICTION_FT_LNK; }
Packit 762fc5
    else if (strcmp(ch, "b") == 0) { return RESTRICTION_FT_BLK; }
Packit 762fc5
    else if (strcmp(ch, "c") == 0) { return RESTRICTION_FT_CHR; }
Packit 762fc5
    else if (strcmp(ch, "s") == 0) { return RESTRICTION_FT_SOCK; }
Packit 762fc5
    else if (strcmp(ch, "D") == 0) { return RESTRICTION_FT_DOOR; }
Packit 762fc5
    else if (strcmp(ch, "P") == 0) { return RESTRICTION_FT_PORT; }
Packit 762fc5
    else { return RESTRICTION_NULL; }
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
DB_ATTR_TYPE get_groupval(char* group)
Packit 762fc5
{
Packit 762fc5
  list* r=NULL;
Packit 762fc5
Packit 762fc5
  if((r=list_find(group,conf->groupsyms))){
Packit 762fc5
    return (((symba*)r->data)->ival);
Packit 762fc5
  }
Packit 762fc5
  return -1;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_dbdef(int dbtype,char* val)
Packit 762fc5
{
Packit 762fc5
  url_t* u=NULL;
Packit 762fc5
  url_t** conf_db_url;
Packit 762fc5
Packit 762fc5
  error(255,"do_dbdef (%i) called with (%s)\n",dbtype,val);
Packit 762fc5
Packit 762fc5
  switch(dbtype) {
Packit 762fc5
  case DB_OLD: {
Packit 762fc5
    conf_db_url=&(conf->db_in_url);
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  case DB_WRITE: {
Packit 762fc5
    conf_db_url=&(conf->db_out_url);
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  case DB_NEW: {
Packit 762fc5
    conf_db_url=&(conf->db_new_url);
Packit 762fc5
    break;
Packit 762fc5
  }
Packit 762fc5
  default : {
Packit 762fc5
    error(0,"Invalid call of do_dbdef\n");
Packit 762fc5
    return;
Packit 762fc5
  }
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
  if(*conf_db_url==NULL){
Packit 762fc5
    u=parse_url(val);
Packit 762fc5
    /* FIXME Check the URL if you add support for databases that cannot be 
Packit 762fc5
     * both input and output urls */
Packit 762fc5
    switch (dbtype) {
Packit 762fc5
    case DB_OLD:
Packit 762fc5
    case DB_NEW:{
Packit 762fc5
      if(u==NULL||u->type==url_unknown||u->type==url_stdout
Packit 762fc5
	 ||u->type==url_stderr) {
Packit 762fc5
	error(0,_("Unsupported input URL-type:%s\n"),val);
Packit 762fc5
      }
Packit 762fc5
      else {
Packit 762fc5
	*conf_db_url=u;
Packit 762fc5
      }
Packit 762fc5
      break;
Packit 762fc5
    }
Packit 762fc5
    case DB_WRITE: {
Packit 762fc5
      if(u==NULL||u->type==url_unknown||u->type==url_stdin){
Packit 762fc5
	error(0,_("Unsupported output URL-type:%s\n"),val);
Packit 762fc5
      }
Packit 762fc5
      else{
Packit 762fc5
	conf->db_out_url=u;
Packit 762fc5
	error(200,_("Output database set to \"%s\" \"%s\"\n"),val,u->value);
Packit 762fc5
      }
Packit 762fc5
      break;
Packit 762fc5
    }
Packit 762fc5
    }
Packit 762fc5
  }
Packit 762fc5
  free(val);
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_dbindef(char* val)
Packit 762fc5
{
Packit 762fc5
  url_t* u=NULL;
Packit 762fc5
Packit 762fc5
  if(conf->db_in_url==NULL){
Packit 762fc5
    u=parse_url(val);
Packit 762fc5
    /* FIXME Check the URL if you add support for databases that cannot be 
Packit 762fc5
     * both input and output urls */
Packit 762fc5
    if(u==NULL||u->type==url_unknown||u->type==url_stdout
Packit 762fc5
       ||u->type==url_stderr) {
Packit 762fc5
      error(0,_("Unsupported input URL-type:%s\n"),val);
Packit 762fc5
    }
Packit 762fc5
    else {
Packit 762fc5
      conf->db_in_url=u;
Packit 762fc5
    }
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
  free(val);
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_dboutdef(char* val)
Packit 762fc5
{
Packit 762fc5
  url_t* u=NULL;
Packit 762fc5
Packit 762fc5
  error(200,_("Setting output database \"%s\"\n"),val);
Packit 762fc5
Packit 762fc5
  if(conf->db_out_url==NULL){
Packit 762fc5
    u=parse_url(val);
Packit 762fc5
    /* FIXME Check the URL if you add support for databases that cannot be 
Packit 762fc5
     * both input and output urls */
Packit 762fc5
    if(u==NULL||u->type==url_unknown||u->type==url_stdin){
Packit 762fc5
      error(0,_("Unsupported output URL-type:%s\n"),val);
Packit 762fc5
    }
Packit 762fc5
    else{
Packit 762fc5
      conf->db_out_url=u;
Packit 762fc5
      error(200,_("Output database set to \"%s\" \"%s\"\n"),val,u->value);
Packit 762fc5
    }
Packit 762fc5
  } else {
Packit 762fc5
    error(200,_("Output database already set\n"));
Packit 762fc5
  }
Packit 762fc5
Packit 762fc5
  free(val);
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_repurldef(char* val)
Packit 762fc5
{
Packit 762fc5
  url_t* u=NULL;
Packit 762fc5
Packit 762fc5
  
Packit 762fc5
  u=parse_url(val);
Packit 762fc5
  /* FIXME Check the URL if you add support for databases that cannot be 
Packit 762fc5
   * both input and output urls */
Packit 762fc5
  if(u==NULL||u->type==url_unknown||u->type==url_stdin){
Packit 762fc5
    error(0,_("Unsupported output URL-type:%s\n"),val);
Packit 762fc5
  } else {
Packit 762fc5
    error_init(u,0);
Packit 762fc5
  }
Packit 762fc5
  
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_verbdef(char* val)
Packit 762fc5
{
Packit 762fc5
  char* err=NULL;
Packit 762fc5
  long a=0;
Packit 762fc5
  
Packit 762fc5
  a=strtol(val,&err,10);
Packit 762fc5
  if(*err!='\0' || a>255 || a<0 || errno==ERANGE){
Packit 762fc5
    error(0, _("Illegal verbosity level:%s\n"),val);
Packit 762fc5
    error(10,_("Using previous value:%i\n"),conf->verbose_level);
Packit 762fc5
    return;
Packit 762fc5
  }    
Packit 762fc5
  else {
Packit 762fc5
    if(conf->verbose_level==-1){
Packit 762fc5
      conf->verbose_level=a;
Packit 762fc5
    }else {
Packit 762fc5
      error(210,_("Verbosity already defined to %i\n"),conf->verbose_level);
Packit 762fc5
    }
Packit 762fc5
  }
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_rootprefix(char* val) {
Packit 762fc5
    if (conf->root_prefix_length == 0) {
Packit 762fc5
        conf->root_prefix=val;
Packit 762fc5
        conf->root_prefix_length=strlen(conf->root_prefix);
Packit 762fc5
        if (conf->root_prefix_length && conf->root_prefix[conf->root_prefix_length-1] == '/') {
Packit 762fc5
            conf->root_prefix[--conf->root_prefix_length] = '\0';
Packit 762fc5
            error(200,_("Removed trailing '/' from root prefix \n"));
Packit 762fc5
        }
Packit 762fc5
        error(200,_("Root prefix set to '%s'\n"), conf->root_prefix);
Packit 762fc5
    } else {
Packit 762fc5
        error(200,_("Root prefix already set to '%s'\n"), conf->root_prefix);
Packit 762fc5
    }
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
#ifdef WITH_E2FSATTRS
Packit 762fc5
#define easy_e2fsattrs_case(c,f) \
Packit 762fc5
case c: { \
Packit 762fc5
    conf->report_ignore_e2fsattrs|=f; \
Packit 762fc5
    break; \
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void do_report_ignore_e2fsattrs(char* val) {
Packit 762fc5
    conf->report_ignore_e2fsattrs = 0UL;
Packit 762fc5
    while (*val) {
Packit 762fc5
        switch(*val){
Packit 762fc5
            /* source for mappings see compare_db.c */
Packit 762fc5
            easy_e2fsattrs_case('s',EXT2_SECRM_FL)
Packit 762fc5
            easy_e2fsattrs_case('u',EXT2_UNRM_FL)
Packit 762fc5
            easy_e2fsattrs_case('S',EXT2_SYNC_FL)
Packit 762fc5
            easy_e2fsattrs_case('D',EXT2_DIRSYNC_FL)
Packit 762fc5
            easy_e2fsattrs_case('i',EXT2_IMMUTABLE_FL)
Packit 762fc5
            easy_e2fsattrs_case('a',EXT2_APPEND_FL)
Packit 762fc5
            easy_e2fsattrs_case('d',EXT2_NODUMP_FL)
Packit 762fc5
            easy_e2fsattrs_case('A',EXT2_NOATIME_FL)
Packit 762fc5
            easy_e2fsattrs_case('c',EXT2_COMPR_FL)
Packit 762fc5
            easy_e2fsattrs_case('B',EXT2_COMPRBLK_FL)
Packit 762fc5
            easy_e2fsattrs_case('Z',EXT2_DIRTY_FL)
Packit 762fc5
            easy_e2fsattrs_case('X',EXT2_NOCOMPR_FL)
Packit 762fc5
#ifdef EXT2_ECOMPR_FL
Packit 762fc5
            easy_e2fsattrs_case('E',EXT2_ECOMPR_FL)
Packit 762fc5
#else
Packit 762fc5
            easy_e2fsattrs_case('E',EXT4_ENCRYPT_FL)
Packit 762fc5
#endif
Packit 762fc5
            easy_e2fsattrs_case('j',EXT3_JOURNAL_DATA_FL)
Packit 762fc5
            easy_e2fsattrs_case('I',EXT2_INDEX_FL)
Packit 762fc5
            easy_e2fsattrs_case('t',EXT2_NOTAIL_FL)
Packit 762fc5
            easy_e2fsattrs_case('T',EXT2_TOPDIR_FL)
Packit 762fc5
#ifdef EXT4_EXTENTS_FL
Packit 762fc5
            easy_e2fsattrs_case('e',EXT4_EXTENTS_FL)
Packit 762fc5
#endif
Packit 762fc5
#ifdef EXT4_HUGE_FILE_FL
Packit 762fc5
            easy_e2fsattrs_case('h',EXT4_HUGE_FILE_FL)
Packit 762fc5
#endif
Packit 762fc5
#ifdef FS_NOCOW_FL
Packit 762fc5
            easy_e2fsattrs_case('C',FS_NOCOW_FL)
Packit 762fc5
#endif
Packit 762fc5
#ifdef EXT4_INLINE_DATA_FL
Packit 762fc5
            easy_e2fsattrs_case('N',EXT4_INLINE_DATA_FL)
Packit 762fc5
#endif
Packit 762fc5
            case '0': {
Packit 762fc5
                 break;
Packit 762fc5
            }
Packit 762fc5
            default: {
Packit 762fc5
                 error(0,_("Ignore invalid ext2 file attribute: '%c'\n"),*val);
Packit 762fc5
                 break;
Packit 762fc5
            }
Packit 762fc5
        }
Packit 762fc5
        *val++;
Packit 762fc5
    }
Packit 762fc5
}
Packit 762fc5
#endif
Packit 762fc5
Packit 762fc5
const char* aide_key_7=CONFHMACKEY_07;
Packit 762fc5
const char* db_key_7=DBHMACKEY_07;
Packit 762fc5
Packit 762fc5
void* get_conf_key(void) {
Packit 762fc5
  void* r;
Packit 762fc5
  char* m=(char*)malloc(strlen(aide_key_1)+
Packit 762fc5
			strlen(aide_key_2)+
Packit 762fc5
			strlen(aide_key_3)+
Packit 762fc5
			strlen(aide_key_4)+
Packit 762fc5
			strlen(aide_key_5)+
Packit 762fc5
			strlen(aide_key_6)+
Packit 762fc5
			strlen(aide_key_7)+
Packit 762fc5
			strlen(aide_key_8)+
Packit 762fc5
			strlen(aide_key_9)+
Packit 762fc5
			strlen(aide_key_0)+1);
Packit 762fc5
  m[0]=0;
Packit 762fc5
  strcat(m,aide_key_0);
Packit 762fc5
  strcat(m,aide_key_1);
Packit 762fc5
  strcat(m,aide_key_2);
Packit 762fc5
  strcat(m,aide_key_3);
Packit 762fc5
  strcat(m,aide_key_4);
Packit 762fc5
  strcat(m,aide_key_5);
Packit 762fc5
  strcat(m,aide_key_6);
Packit 762fc5
  strcat(m,aide_key_7);
Packit 762fc5
  strcat(m,aide_key_8);
Packit 762fc5
  strcat(m,aide_key_9);
Packit 762fc5
  
Packit 762fc5
  r=decode_base64(m,strlen(m),NULL);
Packit 762fc5
Packit 762fc5
  memset(m,0,strlen(m));
Packit 762fc5
  free(m);
Packit 762fc5
  return r;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
size_t get_conf_key_len(void) {
Packit 762fc5
  size_t len=0;
Packit 762fc5
  char* m=(char*)malloc(strlen(aide_key_1)+
Packit 762fc5
			strlen(aide_key_2)+
Packit 762fc5
			strlen(aide_key_3)+
Packit 762fc5
			strlen(aide_key_4)+
Packit 762fc5
			strlen(aide_key_5)+
Packit 762fc5
			strlen(aide_key_6)+
Packit 762fc5
			strlen(aide_key_7)+
Packit 762fc5
			strlen(aide_key_8)+
Packit 762fc5
			strlen(aide_key_9)+
Packit 762fc5
			strlen(aide_key_0)+1);
Packit 762fc5
  m[0]=0;
Packit 762fc5
  strcat(m,aide_key_0);
Packit 762fc5
  strcat(m,aide_key_1);
Packit 762fc5
  strcat(m,aide_key_2);
Packit 762fc5
  strcat(m,aide_key_3);
Packit 762fc5
  strcat(m,aide_key_4);
Packit 762fc5
  strcat(m,aide_key_5);
Packit 762fc5
  strcat(m,aide_key_6);
Packit 762fc5
  strcat(m,aide_key_7);
Packit 762fc5
  strcat(m,aide_key_8);
Packit 762fc5
  strcat(m,aide_key_9);
Packit 762fc5
  
Packit 762fc5
  len=length_base64(m,strlen(m));
Packit 762fc5
Packit 762fc5
  memset(m,0,strlen(m));
Packit 762fc5
  free(m);
Packit 762fc5
  return len;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
void* get_db_key(void) {
Packit 762fc5
  void* r;
Packit 762fc5
  char* m=(char*)malloc(strlen(db_key_1)+
Packit 762fc5
			strlen(db_key_2)+
Packit 762fc5
			strlen(db_key_3)+
Packit 762fc5
			strlen(db_key_4)+
Packit 762fc5
			strlen(db_key_5)+
Packit 762fc5
			strlen(db_key_6)+
Packit 762fc5
			strlen(db_key_7)+
Packit 762fc5
			strlen(db_key_8)+
Packit 762fc5
			strlen(db_key_9)+
Packit 762fc5
			strlen(db_key_0)+1);
Packit 762fc5
  m[0]=0;
Packit 762fc5
  strcat(m,db_key_0);
Packit 762fc5
  strcat(m,db_key_1);
Packit 762fc5
  strcat(m,db_key_2);
Packit 762fc5
  strcat(m,db_key_3);
Packit 762fc5
  strcat(m,db_key_4);
Packit 762fc5
  strcat(m,db_key_5);
Packit 762fc5
  strcat(m,db_key_6);
Packit 762fc5
  strcat(m,db_key_7);
Packit 762fc5
  strcat(m,db_key_8);
Packit 762fc5
  strcat(m,db_key_9);
Packit 762fc5
  
Packit 762fc5
  r=decode_base64(m,strlen(m),NULL);
Packit 762fc5
  
Packit 762fc5
  memset(m,0,strlen(m));
Packit 762fc5
  free(m);
Packit 762fc5
  return r;
Packit 762fc5
}
Packit 762fc5
Packit 762fc5
size_t get_db_key_len(void) {
Packit 762fc5
  size_t len=0;
Packit 762fc5
  char* m=(char*)malloc(strlen(db_key_1)+
Packit 762fc5
			strlen(db_key_2)+
Packit 762fc5
			strlen(db_key_3)+
Packit 762fc5
			strlen(db_key_4)+
Packit 762fc5
			strlen(db_key_5)+
Packit 762fc5
			strlen(db_key_6)+
Packit 762fc5
			strlen(db_key_7)+
Packit 762fc5
			strlen(db_key_8)+
Packit 762fc5
			strlen(db_key_9)+
Packit 762fc5
			strlen(db_key_0)+1);
Packit 762fc5
  m[0]=0;
Packit 762fc5
  strcat(m,db_key_0);
Packit 762fc5
  strcat(m,db_key_1);
Packit 762fc5
  strcat(m,db_key_2);
Packit 762fc5
  strcat(m,db_key_3);
Packit 762fc5
  strcat(m,db_key_4);
Packit 762fc5
  strcat(m,db_key_5);
Packit 762fc5
  strcat(m,db_key_6);
Packit 762fc5
  strcat(m,db_key_7);
Packit 762fc5
  strcat(m,db_key_8);
Packit 762fc5
  strcat(m,db_key_9);
Packit 762fc5
  
Packit 762fc5
  len=length_base64(m,strlen(m));
Packit 762fc5
  
Packit 762fc5
  memset(m,0,strlen(m));
Packit 762fc5
  free(m);
Packit 762fc5
  return len;
Packit 762fc5
}