Argh, my last two patches are bad. This one should work fine. Tomasz: Please use this one and disregard the last two I sent. This one is 100% correct -- the other one had a problem with its use of putenv().

Sheesh putenv() is a retarded function! :)
diff -ur clamav-devel/clamd/clamuko.c clamav-devel-modified/clamd/clamuko.c
--- clamav-devel/clamd/clamuko.c        2005-03-09 12:32:41.156896336 -0500
+++ clamav-devel-modified/clamd/clamuko.c       2005-03-09 12:17:53.000000000 
-0500
@@ -173,7 +173,7 @@
 
            if(scan && cl_scanfile(acc->filename, &virname, NULL, tharg->root, 
tharg->limits, tharg->options) == CL_VIRUS) {
                logg("Clamuko: %s: %s FOUND\n", acc->filename, virname);
-               virusaction(virname, tharg->copt);
+               virusaction(acc->filename, virname, tharg->copt);
                acc->deny = 1;
            } else
                acc->deny = 0;
diff -ur clamav-devel/clamd/others.c clamav-devel-modified/clamd/others.c
--- clamav-devel/clamd/others.c 2005-03-09 12:32:41.393860312 -0500
+++ clamav-devel-modified/clamd/others.c        2005-03-09 15:06:38.718573504 
-0500
@@ -69,7 +69,45 @@
 #include "cfgparser.h"
 #include "session.h"
 
-void virusaction(const char *virname, const struct cfgstruct *copt)
+#define ENV_PREFIX "CLAM_VIRUSEVENT_"
+#define ENV_FILENAME (ENV_PREFIX "FILENAME")
+#define ENV_VIRUSNAME (ENV_PREFIX "VIRUSNAME")
+enum env_var { FILENAME = 0, VIRUSNAME, N_ENV_VARS };
+struct env_var_desc {
+       const char * const name;
+       const int namelen;
+       char *buf;
+       int buflen;
+};
+
+static struct env_var_desc env_vars[] =  { 
+       /* Array is indexed using enum env_var above.. */
+       { ENV_FILENAME, strlen(ENV_FILENAME), 0, -1 },
+       { ENV_VIRUSNAME, strlen(ENV_VIRUSNAME), 0, -1 } 
+};
+
+static void put_env_var(int var, const char *value)
+{
+       struct env_var_desc *desc;
+       int len;
+       
+       if (var < 0 || var >= N_ENV_VARS) return;
+       if (!value) value = "";
+       desc = &env_vars[var];
+       len = desc->namelen + strlen(value) + sizeof(char)*2;
+       if (len > desc->buflen) {
+               char *newbuf = (char *) mcalloc(len, sizeof(char));
+               strcpy(newbuf, desc->name);
+               putenv(newbuf); /* clear old var... */
+               free(desc->buf); /* safely free old var... */
+               desc->buf = newbuf;
+       }
+       desc->buflen = len;
+       snprintf(desc->buf, desc->buflen, "%s=%s", desc->name, value);
+       putenv(desc->buf);
+}
+
+void virusaction(const char *filename, const char *virname, const struct 
cfgstruct *copt)
 {
        char *buffer, *pt, *cmd;
        struct cfgstruct *cpt;
@@ -90,7 +128,12 @@
        cmd = strdup(buffer);
        free(buffer);
     }
-
+    /* Setup environment, note that because of SUSv2 specs the strings
+       needs to be non-const and the actual buffers themselves become part of 
+       the environemnt.  */
+    put_env_var(FILENAME, filename);
+    put_env_var(VIRUSNAME, virname);
+    
     /* WARNING: this is uninterruptable ! */
     system(cmd);
 
diff -ur clamav-devel/clamd/others.h clamav-devel-modified/clamd/others.h
--- clamav-devel/clamd/others.h 2005-03-09 12:32:41.397859704 -0500
+++ clamav-devel-modified/clamd/others.h        2005-03-09 12:16:53.000000000 
-0500
@@ -28,7 +28,7 @@
 
 int poll_fd(int fd, int timeout_sec);
 int is_fd_connected(int fd);
-void virusaction(const char *virname, const struct cfgstruct *copt);
+void virusaction(const char *filename, const char *virname, const struct 
cfgstruct *copt);
 int writen(int fd, void *buff, unsigned int count);
 
 #if defined(HAVE_RECVMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || 
defined(HAVE_CONTROL_IN_MSGHDR)) && !defined(C_CYGWIN) && !defined(C_OS2)
diff -ur clamav-devel/clamd/scanner.c clamav-devel-modified/clamd/scanner.c
--- clamav-devel/clamd/scanner.c        2005-03-09 12:32:41.433854232 -0500
+++ clamav-devel-modified/clamd/scanner.c       2005-03-09 12:27:45.000000000 
-0500
@@ -159,7 +159,7 @@
 
                                    mdprintf(odesc, "%s: %s FOUND\n", fname, 
*virname);
                                    logg("%s: %s FOUND\n", fname, *virname);
-                                   virusaction(*virname, copt);
+                                   virusaction(fname, *virname, copt);
                                    if(!contscan) {
                                        closedir(dd);
                                        free(fname);
@@ -237,7 +237,7 @@
            if(ret == CL_VIRUS) {
                mdprintf(odesc, "%s: %s FOUND\n", filename, virname);
                logg("%s: %s FOUND\n", filename, virname);
-               virusaction(virname, copt);
+               virusaction(filename, virname, copt);
            } else if(ret != CL_CLEAN) {
                mdprintf(odesc, "%s: %s ERROR\n", filename, cl_strerror(ret));
                logg("%s: %s ERROR\n", filename, cl_strerror(ret));
@@ -266,6 +266,7 @@
        int ret;
        const char *virname;
        struct stat statbuf;
+       char fdstr[32];      
 
 
     if(fstat(fd, &statbuf) == -1)
@@ -274,19 +275,21 @@
     if(!S_ISREG(statbuf.st_mode))
        return -1;
 
+    snprintf(fdstr, sizeof(fdstr), "fd[%d]", fd);
+
     ret = cl_scandesc(fd, &virname, scanned, root, limits, options);
 
     if(ret == CL_VIRUS) {
-       mdprintf(odesc, "fd[%d]: %s FOUND\n", fd, virname);
-       logg("fd[%d]: %s FOUND\n", fd, virname);
-       virusaction(virname, copt);
+       mdprintf(odesc, "%s: %s FOUND\n", fdstr, virname);
+       logg("%s: %s FOUND\n", fdstr, virname);
+       virusaction(fdstr, virname, copt);
     } else if(ret != CL_CLEAN) {
-       mdprintf(odesc, "fd[%d]: %s ERROR\n", fd, cl_strerror(ret));
-       logg("fd[%d]: %s ERROR\n", fd, cl_strerror(ret));
+       mdprintf(odesc, "%s: %s ERROR\n", fdstr, cl_strerror(ret));
+       logg("%s: %s ERROR\n", fdstr, cl_strerror(ret));
     } else {
-       mdprintf(odesc, "fd[%d]: OK\n", fd);
+       mdprintf(odesc, "%s: OK\n", fdstr);
         if(logok)
-           logg("fd[%d]: OK\n", fd); 
+           logg("%s: OK\n", fdstr); 
     }
 
     return ret;
@@ -467,7 +470,7 @@
     if(ret == CL_VIRUS) {
        mdprintf(odesc, "stream: %s FOUND\n", virname);
        logg("stream: %s FOUND\n", virname);
-       virusaction(virname, copt);
+       virusaction("stream", virname, copt);
     } else if(ret != CL_CLEAN) {
        mdprintf(odesc, "stream: %s ERROR\n", cl_strerror(ret));
        logg("stream: %s ERROR\n", cl_strerror(ret));
_______________________________________________
http://lurker.clamav.net/list/clamav-devel.html

Reply via email to