]> source.dussan.org Git - rspamd.git/commitdiff
Add plain open file API method
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 2 Feb 2016 23:42:42 +0000 (23:42 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 2 Feb 2016 23:42:42 +0000 (23:42 +0000)
CMakeLists.txt
config.h.in
src/libutil/util.c
src/libutil/util.h

index c4332e3f16323bbc30625029d2d51450a0a2ad92..2f3a01660831d1c2e849774bd2b381e587a97dac 100644 (file)
@@ -876,6 +876,7 @@ CHECK_SYMBOL_EXISTS(PCRE_CONFIG_JIT "pcre.h" HAVE_PCRE_JIT)
 CHECK_SYMBOL_EXISTS(SOCK_SEQPACKET "sys/types.h;sys/socket.h" HAVE_SOCK_SEQPACKET)
 CHECK_SYMBOL_EXISTS(I_SETSIG "sys/types.h;sys/ioctl.h" HAVE_SETSIG)
 CHECK_SYMBOL_EXISTS(O_ASYNC "sys/types.h;sys/fcntl.h" HAVE_OASYNC)
+CHECK_SYMBOL_EXISTS(O_NOFOLLOW "sys/types.h;sys/fcntl.h" HAVE_ONOFOLLOW)
 
 # Some PCRE implementations are lacking of pcre_jit_exec fast path
 SET(_PCRE_FAST_TEST "
index b976b701c886f4571a9d8065de17678898058787..fbe3bb37b7b669a84eb30afa891b747363b17f1d 100644 (file)
@@ -55,6 +55,7 @@
 #cmakedefine HAVE_NETINET_IN_H   1
 #cmakedefine HAVE_NFTW           1
 #cmakedefine HAVE_OASYNC         1
+#cmakedefine HAVE_ONOFOLLOW      1
 #cmakedefine HAVE_OPENSSL               1
 #cmakedefine HAVE_O_DIRECT       1
 #cmakedefine HAVE_PATH_MAX       1
index c4f9ef2423423b9175053aca8b802c52de676d93..6893172c92339b1ee90002b5d5cfde337886dc4b 100644 (file)
@@ -2096,3 +2096,34 @@ event_get_base (struct event *ev)
        return ev->ev_base;
 }
 #endif
+
+int
+rspamd_file_xopen (const char *fname, int oflags, guint mode)
+{
+       struct stat sb;
+       int fd;
+       char *rp, rp_buf[PATH_MAX];
+
+       rp = realpath (fname, rp_buf);
+
+       if (rp == NULL) {
+               return -1;
+       }
+
+#ifdef HAVE_ONOFOLLOW
+       fd = open (fname, oflags | O_NOFOLLOW, mode);
+#else
+       fd = open (fname, oflags, mode);
+#endif
+
+       if (fd == -1) {
+               return (-1);
+       }
+
+       if (fstat (fd, &sb) == -1 || !S_ISREG (sb.st_mode)) {
+               close (fd);
+               return (-1);
+       }
+
+       return (fd);
+}
index b4de2331ae9e80deba41460ae6a0a948c3fa58a3..06b6f7d425817d06fe0e1271131d98e7626478e2 100644 (file)
@@ -432,4 +432,13 @@ struct event_base * event_get_base (struct event *ev);
     event_set((ev), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))
 #endif
 
+/**
+ * Open file without following symlinks or special stuff
+ * @param fname filename
+ * @param oflags open flags
+ * @param mode mode to open
+ * @return fd or -1 in case of error
+ */
+int rspamd_file_xopen (const char *fname, int oflags, guint mode);
+
 #endif