git://git.onelab.eu
/
fprobe-ulog.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Frustrating bug
[fprobe-ulog.git]
/
src
/
fprobe-ulog.c
diff --git
a/src/fprobe-ulog.c
b/src/fprobe-ulog.c
index
c5be35f
..
5df381b
100644
(file)
--- a/
src/fprobe-ulog.c
+++ b/
src/fprobe-ulog.c
@@
-126,6
+126,7
@@
static struct getopt_parms parms[] = {
{'b', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'c', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'d', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'b', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'c', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'d', MY_GETOPT_ARG_REQUIRED, 0, 0},
+ {'D', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'e', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'E', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'f', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'e', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'E', MY_GETOPT_ARG_REQUIRED, 0, 0},
{'f', MY_GETOPT_ARG_REQUIRED, 0, 0},
@@
-379,12
+380,18
@@
inline void copy_flow(struct Flow *src, struct Flow *dst)
}
void get_cur_epoch() {
}
void get_cur_epoch() {
- int fd
, len
;
+ int fd;
fd = open("/tmp/fprobe_last_epoch",O_RDONLY);
if (fd != -1) {
char snum[7];
fd = open("/tmp/fprobe_last_epoch",O_RDONLY);
if (fd != -1) {
char snum[7];
- read(fd, snum, 7);
- sscanf(snum,"%d",&cur_epoch);
+ ssize_t len;
+ len = read(fd, snum, sizeof(snum)-1);
+ if (len != -1) {
+ snum[len]='\0';
+ sscanf(snum,"%d",&cur_epoch);
+ cur_epoch++; /* Let's not stone the last epoch */
+ close(fd);
+ }
}
return;
}
}
return;
}
@@
-403,7
+410,7
@@
void update_cur_epoch_file(int n) {
close(fd);
}
close(fd);
}
-unsigned get_log_fd(char *fname,
unsigned
cur_fd) {
+unsigned get_log_fd(char *fname,
int
cur_fd) {
struct Time now;
unsigned cur_uptime;
/* We check if the amount of space left on the disk < some threshold and start reusing logs, or bail out if that
struct Time now;
unsigned cur_uptime;
/* We check if the amount of space left on the disk < some threshold and start reusing logs, or bail out if that
@@
-414,11
+421,12
@@
unsigned get_log_fd(char *fname, unsigned cur_fd) {
gettime(&now);
cur_uptime = getuptime_minutes(&now);
gettime(&now);
cur_uptime = getuptime_minutes(&now);
+
if (fstatfs(cur_fd, &statfs) && cur_fd!=START_VALUE) {
my_log(LOG_ERR, "PANIC! Can't stat disk to calculate free blocks");
}
else {
if (fstatfs(cur_fd, &statfs) && cur_fd!=START_VALUE) {
my_log(LOG_ERR, "PANIC! Can't stat disk to calculate free blocks");
}
else {
- if (min_free &&
statfs.f_bfree < min_free
)
+ if (min_free &&
(statfs.f_bfree < min_free)
)
switch(cur_epoch) {
case 0: /* Uh oh. Our first file filled up all of the free space. Just bail out. */
my_log(LOG_ERR, "The first epoch filled up all the free space on disk. Bailing out.");
switch(cur_epoch) {
case 0: /* Uh oh. Our first file filled up all of the free space. Just bail out. */
my_log(LOG_ERR, "The first epoch filled up all the free space on disk. Bailing out.");
@@
-430,12
+438,13
@@
unsigned get_log_fd(char *fname, unsigned cur_fd) {
}
/* Epoch length in minutes */
}
/* Epoch length in minutes */
- if ((
cur_uptime - prev_uptime) > epoch_length || cur_fd<0 || cur_epoch==-1
) {
+ if ((
(cur_uptime - prev_uptime) > epoch_length) || (cur_fd < 0) || (cur_epoch==-1)
) {
char nextname[MAX_PATH_LEN];
int write_fd;
prev_uptime = cur_uptime;
cur_epoch = (cur_epoch + 1) % log_epochs;
char nextname[MAX_PATH_LEN];
int write_fd;
prev_uptime = cur_uptime;
cur_epoch = (cur_epoch + 1) % log_epochs;
- close(cur_fd);
+ if (cur_fd>0)
+ close(cur_fd);
snprintf(nextname,MAX_PATH_LEN,"%s.%d",fname,cur_epoch);
if ((write_fd = open(nextname, O_WRONLY|O_CREAT|O_TRUNC)) < 0) {
my_log(LOG_ERR, "open(): %s (%s)\n", nextname, strerror(errno));
snprintf(nextname,MAX_PATH_LEN,"%s.%d",fname,cur_epoch);
if ((write_fd = open(nextname, O_WRONLY|O_CREAT|O_TRUNC)) < 0) {
my_log(LOG_ERR, "open(): %s (%s)\n", nextname, strerror(errno));
@@
-444,8
+453,9
@@
unsigned get_log_fd(char *fname, unsigned cur_fd) {
update_cur_epoch_file(cur_epoch);
ret_fd = write_fd;
}
update_cur_epoch_file(cur_epoch);
ret_fd = write_fd;
}
- else
+ else
{
ret_fd = cur_fd;
ret_fd = cur_fd;
+ }
return(ret_fd);
}
return(ret_fd);
}