Date: Wed, 28 Jul 2010 08:21:39 GMT From: Sergio Ligregni <ligregni@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 181488 for review Message-ID: <201007280821.o6S8Ldug009255@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@181488?ac=10 Change 181488 by ligregni@ligPhenom on 2010/07/28 05:51:39 It is now allowed to have multiple audit trail directories at the slave system, the daemon syncs all of them (only those explicitly specified) Affected files ... .. //depot/projects/soc2010/disaudit/damasterd.c#7 edit .. //depot/projects/soc2010/disaudit/msocket_work.c#8 edit .. //depot/projects/soc2010/disaudit/msocket_work.h#9 edit .. //depot/projects/soc2010/disaudit/shipd.c#10 edit .. //depot/projects/soc2010/disaudit/ssocket_work.c#8 edit .. //depot/projects/soc2010/disaudit/ssocket_work.h#10 edit .. //depot/projects/soc2010/disaudit/utils.c#3 edit .. //depot/projects/soc2010/disaudit/utils.h#3 edit Differences ... ==== //depot/projects/soc2010/disaudit/damasterd.c#7 (text+ko) ==== @@ -56,75 +56,69 @@ /*** DECLARATIONS ***/ /* local prototypes */ -static int check_files_equal(char *pathslave, char *sha256slave, - char *hostname, char *path, char *fullpath); -static int do_master_daemon(); -static int get_parameters(); -static int process_request(int sfd, struct sockaddr *clientinfo); -static int receive_trail(int sfd, struct sockaddr *clientinfo); -static int search_trail(int sfd, struct sockaddr *clientinfo); +static int +check_files_equal(char *pathslave, char *sha256slave, + char *hostname, char *path, char *fullpath); +static int do_master_daemon(); +static int get_parameters(); +static int process_request(int sfd, struct sockaddr *clientinfo); +static int receive_trail(int sfd, struct sockaddr *clientinfo); +static int search_trail(int sfd, struct sockaddr *clientinfo); /* Directory settings took from audit_control */ -char slave_trails_dir[MAX_DIR_SIZE + 1]; -char *ptr_std; -int slave_dirs; +char slave_trails_dir[MAX_DIR_SIZE + 1]; +char *ptr_std; +int slave_dirs; /* The level of trust the shipping process will have (0 means disabled) */ -int panic_level; +int panic_level; /* Port number */ -int port_number; +int port_number; -/* - * The searching for a trail by it's name, - * or by it's name & origin host, this is for example, - * if we change a host name and this flag is on, - * all it's trails will be sync again since the entire path - * will be different, this is: - * 2010xxxxx.HOST_ONE.201006date_recvd - * then we change HOST_ONE to HOST_OTHER - * with the flag on, there must be a trail: - * 2010xxxxx.HOST_OTHER.201006date_recvd - * but, there is not such trail so we sync again. +/* + * The searching for a trail by it's name, or by it's name & origin host, + * this is for example, if we change a host name and this flag is on, all + * it's trails will be sync again since the entire path will be different, + * this is: 2010xxxxx.HOST_ONE.201006date_recvd then we change HOST_ONE to + * HOST_OTHER with the flag on, there must be a trail: + * 2010xxxxx.HOST_OTHER.201006date_recvd but, there is not such trail so we + * sync again. */ -int lookup_host; +int lookup_host; /* - * DAMasterD - * Distributed Audit Master Daemon - * - * This program runs on a master system, in order - * to receive the trails (and perform the appropiate naming - * and pathing) from the slave systems, when not runs with - * debug option, it daemonize itself + * DAMasterD Distributed Audit Master Daemon + * + * This program runs on a master system, in order to receive the trails (and + * perform the appropiate naming and pathing) from the slave systems, when + * not runs with debug option, it daemonize itself */ int main(int argc, char *argv[]) { - char cl_opt; + char cl_opt; debug = 0; while ((cl_opt = getopt(argc, argv, "dl")) != -1) switch (cl_opt) { - case 'd': - /* Debug option */ - debug = 1; - break; + case 'd': + /* Debug option */ + debug = 1; + break; } /* If not debugging, daemonize the program */ - if (debug == 0 && daemon(0,0) != 0) { + if (debug == 0 && daemon(0, 0) != 0) { perror("Can't daemonize, exiting!"); exit(1); } - /* Set the directory path, the host address, the panic level */ if (get_parameters() == -1) { to_log("Can't get the parameters to work!"); exit(1); } - ptr_std = slave_trails_dir + strlen(slave_trails_dir); /* @@ -135,7 +129,6 @@ to_log("DAMasterd disabled"); exit(0); } - if (do_master_daemon() == -1) exit(1); @@ -145,17 +138,16 @@ static int do_master_daemon() { - int socketfd, newsockfd, childpid; - char message[256]; - struct sockaddr clientinfo; + int socketfd , newsockfd, childpid; + char message [256]; + struct sockaddr clientinfo; if ((socketfd = init_socket(port_number)) < 0) { sprintf(message, "Error initializing socket on port %d", - port_number); + port_number); to_log(message); return (-1); } - while (1) { newsockfd = accept_connection(socketfd, &clientinfo); @@ -164,8 +156,6 @@ to_log(message); return (-1); } - - if (!debug && (childpid = fork()) < 0) { to_log("Error forking the process"); return (-1); @@ -177,7 +167,6 @@ if (!debug) close(socketfd); } - close(newsockfd); usleep(1000); @@ -189,14 +178,14 @@ static int get_parameters() { - /* + /* * GSoC: using an special file, intended to include this values at * audit_control */ - FILE *fpars = fopen(AUDIT_DAMASTERD_FILE, "r"); + FILE *fpars = fopen(AUDIT_DAMASTERD_FILE, "r"); - char sslave_dirs[10]; - char lkup_host[10]; + char sslave_dirs[10]; + char lkup_host [10]; if (!fpars) return (-1); @@ -226,32 +215,30 @@ static int process_request(int sfd, struct sockaddr *clientinfo) { - int res = 0; + int res = 0; - char opt[2]; + char opt [2]; - get_from_socket(sfd, opt, sizeof (opt)); + get_from_socket(sfd, opt, sizeof(opt)); - while (res != -1) - { - switch(opt[0]) - { - case '0': - /* The process is finished */ - return 0; - break; - case '1': - /* The request is about searching for a file */ - res = search_trail(sfd, clientinfo); - break; - case '2': - /* The request is about receiving a trail */ - res = receive_trail(sfd, clientinfo); - break; - default: - to_log("Can't understand user's request!"); + while (res != -1) { + switch (opt[0]) { + case '0': + /* The process is finished */ + return 0; + break; + case '1': + /* The request is about searching for a file */ + res = search_trail(sfd, clientinfo); + break; + case '2': + /* The request is about receiving a trail */ + res = receive_trail(sfd, clientinfo); + break; + default: + to_log("Can't understand user's request!"); } - get_from_socket(sfd, opt, sizeof (opt)); + get_from_socket(sfd, opt, sizeof(opt)); } close(sfd); @@ -262,69 +249,65 @@ static int search_trail(int sfd, struct sockaddr *clientinfo) { - DIR *dp; - struct dirent *dirp; - struct stat statbuf; + DIR *dp; + struct dirent *dirp; + struct stat statbuf; - char *ptr; - char hbuf[NI_MAXHOST+1]; - char message[MAX_PATH_SIZE + MESSAGE_DESC_SIZE]; - char hostname[NI_MAXHOST+1]; - char pathslave[MAX_TRAILPATH_SIZE+1], sha256slave[SHA256_SIZE]; - char dirpath[MAX_DIR_SIZE+1]; - char found_trail[] = "n"; + char *ptr; + char hbuf [NI_MAXHOST + 1]; + char message [MAX_PATH_SIZE + MESSAGE_DESC_SIZE]; + char hostname [NI_MAXHOST + 1]; + char pathslave [MAX_TRAILPATH_SIZE + 1], sha256slave[SHA256_SIZE]; + char dirpath [MAX_DIR_SIZE + 1]; + char found_trail[] = "n"; - get_from_socket(sfd, pathslave, sizeof (pathslave)); - get_from_socket(sfd, sha256slave, sizeof (sha256slave)); + get_from_socket(sfd, pathslave, sizeof(pathslave)); + get_from_socket(sfd, sha256slave, sizeof(sha256slave)); strlcpy(hostname, - inet_ntoa(((struct sockaddr_in *) clientinfo)->sin_addr), - sizeof (hostname)); + inet_ntoa(((struct sockaddr_in *)clientinfo)->sin_addr), + sizeof(hostname)); if (getnameinfo(clientinfo, clientinfo->sa_len, hbuf, sizeof(hbuf), - NULL, 0, NI_NAMEREQD)) + NULL, 0, NI_NAMEREQD)) to_log("Couldn't resolve hostname, using IP address"); else - strlcpy(hostname, hbuf, sizeof (hostname)); + strlcpy(hostname, hbuf, sizeof(hostname)); snprintf(message, sizeof(message), "Looking for \"%s\" from \"%s\" with SHA256: \"%s\"", pathslave, - hostname, sha256slave); + hostname, sha256slave); to_log(message); - strlcpy(dirpath, slave_trails_dir, sizeof (dirpath)); + strlcpy(dirpath, slave_trails_dir, sizeof(dirpath)); if (slave_dirs) { - strlcat(dirpath, "/", sizeof (dirpath)); - strlcat(dirpath, hostname, sizeof (dirpath)); + strlcat(dirpath, "/", sizeof(dirpath)); + strlcat(dirpath, hostname, sizeof(dirpath)); } - - if ( !(dp = opendir(dirpath)) ) { + if (!(dp = opendir(dirpath))) { to_log("Can't open slave trails' directory"); send_to_socket(sfd, "n"); return (1); } - /* * We must count the elements (just the valid ones, this is: the * trails) of the directory. */ - while ('n' == found_trail[0] && (dirp = readdir(dp)) != NULL ) + while ('n' == found_trail[0] && (dirp = readdir(dp)) != NULL) if (strcmp(dirp->d_name, ".") && strcmp(dirp->d_name, "..")) { /* We have other than . or .. */ asprintf(&ptr, "%s/%s", dirpath, dirp->d_name); - if ( stat(ptr, &statbuf) < 0 ) - { + if (stat(ptr, &statbuf) < 0) { to_log("Stat error!"); return -1; } - if (S_ISDIR(statbuf.st_mode) == 0) { /* It's not a directory */ - if ( check_files_equal(pathslave, sha256slave, - hostname, dirp->d_name, ptr) ) { + if (check_files_equal(pathslave, sha256slave, + hostname, dirp->d_name, ptr)) { /* * Check that the trails are the same * name + SHA256 @@ -334,41 +317,36 @@ } free(ptr); } - closedir(dp); - snprintf(message, sizeof (message), "The search for %s resulted: %s\n", - pathslave, ('y' == found_trail[0]) ? "YES" : "NO"); + snprintf(message, sizeof(message), "The search for %s resulted: %s\n", + pathslave, ('y' == found_trail[0]) ? "YES" : "NO"); send_to_socket(sfd, found_trail); return (1); } /* - * This function receives the name and MD5 checksum of the slave trail - * and the path and fullpath (to get MD5) of the master trail - * and checks if they are the same, also checks the lookup_host - * variable to determine if the hostname must be searched as part - * of the trails name + * This function receives the name and MD5 checksum of the slave trail and + * the path and fullpath (to get MD5) of the master trail and checks if they + * are the same, also checks the lookup_host variable to determine if the + * hostname must be searched as part of the trails name */ static int check_files_equal(char *pathslave, char *sha256slave, char *hostname, char *path, - char *fullpath) + char *fullpath) { - char path_to_find[strlen(pathslave) + strlen(hostname) + 2]; + char path_to_find[strlen(pathslave) + strlen(hostname) + 2]; - strlcpy(path_to_find, pathslave, sizeof (path_to_find)); + strlcpy(path_to_find, pathslave, sizeof(path_to_find)); - if (lookup_host) - { - strlcat(path_to_find, ".", sizeof (path_to_find)); - strlcat(path_to_find, hostname, sizeof (path_to_find)); + if (lookup_host) { + strlcat(path_to_find, ".", sizeof(path_to_find)); + strlcat(path_to_find, hostname, sizeof(path_to_find)); } - - if (!strncmp(path, path_to_find, strlen(path_to_find))) - { - char *sha256 = (char *) malloc (sizeof(char) * SHA256_SIZE); + if (!strncmp(path, path_to_find, strlen(path_to_find))) { + char *sha256 = (char *)malloc(sizeof(char) * SHA256_SIZE); sha256 = SHA256_File(fullpath, sha256); if (!strcmp(sha256, sha256slave)) @@ -376,82 +354,75 @@ free(sha256); } - return (0); } static int receive_trail(int sfd, struct sockaddr *clientinfo) { - DIR *dp; + DIR *dp; - char fullpath[MAX_PATH_SIZE + 1]; - char hbuf[NI_MAXHOST+1]; - char message[MAX_PATH_SIZE + MESSAGE_DESC_SIZE]; - char hostname[NI_MAXHOST+1]; - char pathslave[MAX_TRAILPATH_SIZE+1]; - char dirpath[MAX_DIR_SIZE+1]; - char buffer[MAX_BUF_SIZE + 1]; - int brecv; - time_t mtime; - struct tm *ltime; - unsigned file_size; - int fd, bwrtn, bread; + char fullpath [MAX_PATH_SIZE + 1]; + char hbuf [NI_MAXHOST + 1]; + char message [MAX_PATH_SIZE + MESSAGE_DESC_SIZE]; + char hostname [NI_MAXHOST + 1]; + char pathslave [MAX_TRAILPATH_SIZE + 1]; + char dirpath [MAX_DIR_SIZE + 1]; + char buffer [MAX_BUF_SIZE + 1]; + int brecv; + time_t mtime; + struct tm *ltime; + unsigned file_size; + int fd , bwrtn, bread; - get_from_socket(sfd, pathslave, sizeof (pathslave)); + get_from_socket(sfd, pathslave, sizeof(pathslave)); strlcpy(hostname, - inet_ntoa(((struct sockaddr_in *) clientinfo)->sin_addr), - sizeof (hostname)); + inet_ntoa(((struct sockaddr_in *)clientinfo)->sin_addr), + sizeof(hostname)); if (getnameinfo(clientinfo, clientinfo->sa_len, hbuf, sizeof(hbuf), - NULL, 0, NI_NAMEREQD)) + NULL, 0, NI_NAMEREQD)) to_log("Couldn't resolve hostname, using IP address"); else - strlcpy(hostname, hbuf, sizeof (hostname)); + strlcpy(hostname, hbuf, sizeof(hostname)); - snprintf(message, sizeof (message), "Receiving \"%s\" from \"%s\"", - pathslave, hostname); + snprintf(message, sizeof(message), "Receiving \"%s\" from \"%s\"", + pathslave, hostname); to_log(message); - strlcpy(dirpath, slave_trails_dir, sizeof (dirpath)); + strlcpy(dirpath, slave_trails_dir, sizeof(dirpath)); - if ( !(dp = opendir(dirpath)) ) { + if (!(dp = opendir(dirpath))) { to_log("Can't open Slave trails dir, please create it or" - " change the value at config files!"); + " change the value at config files!"); return (-1); } - closedir(dp); - if (slave_dirs) - { - strlcat(dirpath, "/", sizeof (dirpath)); - strlcat(dirpath, hostname, sizeof (dirpath)); + if (slave_dirs) { + strlcat(dirpath, "/", sizeof(dirpath)); + strlcat(dirpath, hostname, sizeof(dirpath)); } - - if ( !(dp = opendir(dirpath)) ) - { + if (!(dp = opendir(dirpath))) { to_log("Creating slave dir for this host"); - if ( mkdir(dirpath, S_IRWXU | S_IRGRP | S_IXGRP) < 0 ) - { + if (mkdir(dirpath, S_IRWXU | S_IRGRP | S_IXGRP) < 0) { to_log("Cant't create host's directory!"); return -1; } - } - else + } else closedir(dp); - strlcat(dirpath, "/", sizeof (dirpath)); + strlcat(dirpath, "/", sizeof(dirpath)); mtime = time(NULL); ltime = gmtime(&mtime); snprintf(fullpath, sizeof(fullpath), "%s%s.%s.%04d%02d%02d%02d%02d%02d", - dirpath, pathslave, hostname, ltime->tm_year + 1900, - ltime->tm_mon + 1, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, - ltime->tm_sec); - snprintf(message, sizeof (message), "Create: %s", fullpath); + dirpath, pathslave, hostname, ltime->tm_year + 1900, + ltime->tm_mon + 1, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, + ltime->tm_sec); + snprintf(message, sizeof(message), "Create: %s", fullpath); to_log(message); /* We get the trail size */ @@ -462,21 +433,18 @@ to_log("Can't create the trail at master system"); return (-1); } - while (file_size) { brecv = recv(sfd, &bread, sizeof(bread), 0); if (brecv < 0) { to_log("Error receiving the file"); return (-1); } - brecv = recv(sfd, buffer, bread, 0); if (brecv < 0) { to_log("Error receiving the file"); return (-1); - } - else if (brecv == 0) + } else if (brecv == 0) break; bwrtn = write(fd, buffer, brecv); @@ -485,11 +453,10 @@ to_log("Error writting the file"); return (-1); } - file_size -= brecv; } - snprintf(message, sizeof (message), "Master got: %s", fullpath); + snprintf(message, sizeof(message), "Master got: %s", fullpath); to_log(message); close(fd); @@ -499,7 +466,5 @@ to_log("Error changing permissions"); return (-1); } - return (0); } - ==== //depot/projects/soc2010/disaudit/msocket_work.c#8 (text+ko) ==== @@ -40,12 +40,6 @@ #include <arpa/inet.h> -/*** DECLARATIONS ***/ - -/* local prototypes */ -int init_socket(int); -int accept_connection(int, struct sockaddr *); - int init_socket(int port) { @@ -87,4 +81,3 @@ return (retval); } - ==== //depot/projects/soc2010/disaudit/msocket_work.h#9 (text+ko) ==== ==== //depot/projects/soc2010/disaudit/shipd.c#10 (text+ko) ==== @@ -56,91 +56,97 @@ /*** DECLARATIONS ***/ /* Trail Entries */ -typedef struct s_trail_entry -{ - char name[MAX_TRAILPATH_SIZE + 1]; - int found; +typedef struct s_trail_entry { + char name [MAX_TRAILPATH_SIZE + 1]; + unsigned dir_id; + int found; struct s_trail_entry *next; -} trail_entry; +} trail_entry; /* Directory entries */ -typedef struct s_audit_dir_entry -{ - char path[MAX_DIR_SIZE+1]; -} audit_dir_entry; +/* + * This implementation replaces char audit_trails_dir[MAX_DIR_SIZE + 1]; in + * order to support multiple audit trail directories + */ +typedef struct s_audit_dir_entry { + unsigned id; + char name [MAX_DIR_SIZE + 1]; + struct s_audit_dir_entry *next; +} audit_dir_entry; + +/*** local prototypes ***/ +static int add_trail_entry(trail_entry ** root, char *name, unsigned dir_id); +static int cmp_trails(const void *A, const void *B); +static void delete_trail_entry(trail_entry ** root, int criteria, int number); +static void do_daemon(); +static void do_daemon_date(); +static void do_daemon_all(); +static void do_last(); +static int get_last_trail(char *path, size_t path_size, unsigned *dir_id); +static int get_parameters(); +static int is_audit_trail(char *path); +static int is_in_master(trail_entry * cur, int *first_found); +static void pll (trail_entry * root); +static int send_trail(trail_entry * cur); +static int add_audit_dir_entry(audit_dir_entry ** root, char *path, unsigned id); +static void delete_audit_dir_entry(audit_dir_entry ** root); +static void set_dir_id(audit_dir_entry ** temp, unsigned id); /* Directory settings took from audit_control */ -char audit_trails_dir[MAX_DIR_SIZE + 1]; -char master_host[MAX_HOST_SIZE + 1]; - -/*** local prototypes ***/ -static int add_trail_entry(trail_entry **root, char *name); -static int cmp_trails (const void *A, const void *B); -static void delete_trail_entry(trail_entry **root, int criteria, int number); -static void do_daemon(); -static void do_daemon_date(); -static void do_daemon_all(); -static void do_last(); -static int get_last_trail(char *path, size_t path_size); -static int get_parameters(); -static int is_audit_trail(char *path); -static int is_in_master(trail_entry *cur, int *first_found); -static void pll(trail_entry *root); -static int send_trail(trail_entry *cur); +char master_host[MAX_HOST_SIZE + 1]; +audit_dir_entry *audit_dir_root; /* The level of trust the shipping process will have (0 means disabled) */ -int panic_level; +int panic_level; /* The frequency the daemon will be checking the master's trail list */ -int msec_freq; +int msec_freq; /* Port number */ -int port_number; +int port_number; /* - * ShipD - * Shipping Daemon - * - * This program is checking, according to the panic_level variable - * the audit trail directories and send the trails to a master - * system, when no runs with debug option, it daemonize itself + * ShipD Shipping Daemon + * + * This program is checking, according to the panic_level variable the audit + * trail directories and send the trails to a master system, when no runs + * with debug option, it daemonize itself */ int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - char cl_opt; - int last = 0; + char cl_opt; + int last = 0; debug = 0; + audit_dir_root = NULL; while ((cl_opt = getopt(argc, argv, "dl")) != -1) switch (cl_opt) { - case 'd': - /* Debug option */ - debug = 1; - break; - case 'l': - /* - * Last trail (when called by AUDIT when it - * closes the trail). - */ - last = 1; - break; + case 'd': + /* Debug option */ + debug = 1; + break; + case 'l': + /* + * Last trail (when called by AUDIT when it closes + * the trail). + */ + last = 1; + break; } /* If not debugging, daemonize the program */ - if (debug == 0 && daemon(0,0) != 0) { + if (debug == 0 && daemon(0, 0) != 0) { perror("Can't daemonize, exiting!"); exit(1); } - /* Set the directory path, the host address, the panic level */ if (get_parameters() == -1) { to_log("Can't get the parameters to work!"); exit(1); } - - /* + /* * There is no shipd enabled and it wasn't called by AUDIT (normally * the unique way to get 'last' on). */ @@ -148,7 +154,6 @@ to_log("Shipd disabled"); exit(0); } - /* * This means that the daemon will only search for the last closed * trail and send to the master system. @@ -157,12 +162,14 @@ do_last(); } else { /* - * Otherwise, we will perform a permanent listing checking and - * sync them. + * Otherwise, we will perform a permanent listing checking + * and sync them. */ do_daemon(); } + delete_audit_dir_entry(&audit_dir_root); + return (0); } @@ -170,11 +177,15 @@ static int get_parameters() { - /* + /* * GSoC: using an special file, intended to include this values at * audit_control. */ - FILE *fpars = fopen(AUDIT_SHIPD_FILE, "r"); + FILE *fpars = fopen(AUDIT_SHIPD_FILE, "r"); + + char audit_trails_dir[MAX_DIR_SIZE + 1]; + + unsigned dir_id = 0; if (!fpars) return -1; @@ -183,10 +194,15 @@ return -1; /* - * XXX This parsing of the shipd_control file might need to be + * XXX This parsing of the shipd_control file might need to be * reworked a bit. -sson. */ fscanf(fpars, "%s", audit_trails_dir); + add_audit_dir_entry(&audit_dir_root, audit_trails_dir, ++dir_id); + fscanf(fpars, "%s", audit_trails_dir); + add_audit_dir_entry(&audit_dir_root, audit_trails_dir, ++dir_id); + fscanf(fpars, "%s", audit_trails_dir); + add_audit_dir_entry(&audit_dir_root, audit_trails_dir, ++dir_id); fscanf(fpars, "%s", master_host); fscanf(fpars, "%d", &panic_level); fscanf(fpars, "%d", &msec_freq); @@ -198,30 +214,30 @@ } /* - * Look for the last closed trail and - * send it. + * Look for the last closed trail and send it. */ static void do_last() { - char last_trail[MAX_TRAILPATH_SIZE + 1]; - char message[MAX_PATH_SIZE + MESSAGE_DESC_SIZE]; - trail_entry *root = NULL; + char last_trail[MAX_TRAILPATH_SIZE + 1]; + char message [MAX_PATH_SIZE + MESSAGE_DESC_SIZE]; + unsigned dir_id = 0; + trail_entry *root = NULL; - if (get_last_trail(last_trail, sizeof (last_trail)) == -1) + if (get_last_trail(last_trail, sizeof(last_trail), &dir_id) == -1) to_log("Nothing to send!"); - snprintf(message, sizeof (message), "Will send \"%s\" to %s", - last_trail, master_host); + snprintf(message, sizeof(message), "Will send \"%s\" to %s", + last_trail, master_host); to_log(message); - add_trail_entry(&root, last_trail); + add_trail_entry(&root, last_trail, dir_id); if (send_trail(root) == -1) { to_log("Error sending the last trail"); } else { - snprintf(message, sizeof (message), - "Successfully sent \"%s\" to %s", last_trail, master_host); + snprintf(message, sizeof(message), + "Successfully sent \"%s\" to %s", last_trail, master_host); to_log(message); } @@ -229,77 +245,84 @@ } /* - * Used by do_last() function, this get the last - * closed trail in meaning of lexicographic - * order (that is also a chronological one) + * Used by do_last() function, this get the last closed trail in meaning of + * lexicographic order (that is also a chronological one) */ static int -get_last_trail(char *path, size_t path_size) +get_last_trail(char *path, size_t path_size, unsigned *dir_id) { - DIR *dp; - struct dirent *dirp; - struct stat statbuf; + DIR *dp; + struct dirent *dirp; + struct stat statbuf; + + audit_dir_entry *trail_directory = audit_dir_root; - char *ptr; + char *ptr; *path = 0; - if ( !(dp = opendir(audit_trails_dir)) ) { - to_log("Can't open directory"); - return -1; - } + while (trail_directory) { + if (!(dp = opendir(trail_directory->name))) { + to_log("Can't open directory"); + return -1; + } + /* + * Here we will pass through the entire directory and get the + * path of the latest closed trail. + */ + while ((dirp = readdir(dp)) != NULL) + if (strcmp(dirp->d_name, ".") && strcmp(dirp->d_name, "..")) { + /* We have other than . or .. */ - /* - * Here we will pass through the entire directory and get the path of - * the latest closed trail. - */ - while ( (dirp = readdir(dp)) != NULL ) - if (strcmp(dirp->d_name, ".") && strcmp(dirp->d_name, "..")) { - /* We have other than . or .. */ + asprintf(&ptr, "%s/%s", trail_directory->name, dirp->d_name); - asprintf(&ptr, "%s/%s", audit_trails_dir, dirp->d_name); - - if ( stat(ptr, &statbuf) < 0 ) { - to_log("Stat error!"); - return -1; - } - - if (S_ISDIR(statbuf.st_mode) == 0) { - /* It's not a directory */ - if ( is_audit_trail(dirp->d_name) ) { - /* It's not other file */ - if (*path == 0) { - /* - * This is our first trail, so - * assumme is the last. - */ - strlcpy(path, dirp->d_name, - path_size); - } else { - /* - * Fortunately, the older a - * trail is, the lower - * lexocographic value it has. - */ - if (strcmp (path, ptr) < 0) - strlcpy(path, - dirp->d_name, - path_size); + if (stat(ptr, &statbuf) < 0) { + to_log("Stat error!"); + return -1; + } + if (S_ISDIR(statbuf.st_mode) == 0) { + /* It's not a directory */ + if (is_audit_trail(dirp->d_name)) { + /* It's not other file */ + if (*path == 0) { + /* + * This is our first + * trail, so assumme + * is the last. + */ + strlcpy(path, dirp->d_name, + path_size); + *dir_id = trail_directory->id; + } else { + /* + * Fortunately, the + * older a trail is, + * the lower + * lexicographic + * value it has. + */ + if (strcmp(path, dirp->d_name) < 0) { + strlcpy(path, + dirp->d_name, + path_size); + *dir_id = trail_directory->id; + } + } } } + free(ptr); } - free(ptr); - } + closedir(dp); - closedir(dp); + trail_directory = trail_directory->next; + } return (0); } /* - * When exploring /var/audit/ (or the directory - * where the trails are), not all files are trails - * so we must ensure we will only deal with the ones + * When exploring /var/audit/ (or the directory where the trails are), not + * all files are trails so we must ensure we will only deal with the ones * that are trails. */ static int @@ -307,8 +330,7 @@ { /* * We have these posibilities, only the first one is allowed - * 20100619223115.20100619223131 - * 20100619223131.not_terminated + * 20100619223115.20100619223131 20100619223131.not_terminated * current */ @@ -322,19 +344,17 @@ static void do_daemon() { - while (1) - { - switch (panic_level) - { + while (1) { + switch (panic_level) { case PANIC_DATE: >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007280821.o6S8Ldug009255>