]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
pcap: simplify opening of output file
authorJeremy Sowden <jeremy@azazel.net>
Thu, 16 Mar 2023 11:07:53 +0000 (11:07 +0000)
committerFlorian Westphal <fw@strlen.de>
Thu, 16 Mar 2023 22:24:55 +0000 (23:24 +0100)
Instead of statting the file, and choosing the mode with which to open
it and whether to write the PCAP header based on the result, always open
it with mode "a" and _then_ stat it.  This simplifies the flow-control
and avoids a race between statting and opening.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
output/pcap/ulogd_output_PCAP.c

index e7798f20c8fc306a8b00437e89531126f2b294b7..0daa2c920c322013c295f6ba8776b9dff5d804bb 100644 (file)
@@ -220,33 +220,20 @@ static int append_create_outfile(struct ulogd_pluginstance *upi)
 {
        struct pcap_instance *pi = (struct pcap_instance *) &upi->private;
        char *filename = upi->config_kset->ces[0].u.string;
-       struct stat st_dummy;
-       int exist = 0;
-
-       if (stat(filename, &st_dummy) == 0 && st_dummy.st_size > 0)
-               exist = 1;
-
-       if (!exist) {
-               pi->of = fopen(filename, "w");
-               if (!pi->of) {
-                       ulogd_log(ULOGD_ERROR, "can't open pcap file %s: %s\n",
-                                 filename,
-                                 strerror(errno));
-                       return -EPERM;
-               }
-               if (!write_pcap_header(pi)) {
-                       ulogd_log(ULOGD_ERROR, "can't write pcap header: %s\n",
-                                 strerror(errno));
-                       return -ENOSPC;
-               }
-       } else {
-               pi->of = fopen(filename, "a");
-               if (!pi->of) {
-                       ulogd_log(ULOGD_ERROR, "can't open pcap file %s: %s\n", 
-                               filename,
-                               strerror(errno));
-                       return -EPERM;
-               }               
+       struct stat st_of;
+
+       pi->of = fopen(filename, "a");
+       if (!pi->of) {
+               ulogd_log(ULOGD_ERROR, "can't open pcap file %s: %s\n",
+                         filename,
+                         strerror(errno));
+               return -EPERM;
+       }
+       if (fstat(fileno(pi->of), &st_of) == 0 && st_of.st_size == 0 &&
+           !write_pcap_header(pi)) {
+               ulogd_log(ULOGD_ERROR, "can't write pcap header: %s\n",
+                         strerror(errno));
+               return -ENOSPC;
        }
 
        return 0;