$OpenBSD: patch-clamd_session_c,v 1.5 2008/04/16 19:46:01 mbalmer Exp $
--- clamd/session.c.orig	Wed Apr  2 22:53:44 2008
+++ clamd/session.c	Mon Apr 14 18:41:12 2008
@@ -58,8 +58,10 @@ int command(int desc, const struct cl_engine *engine, 
 {
 	char buff[1025];
 	int bread, opt;
+	struct msghdr msg;
+	struct cmsghdr *cmsg;
+	unsigned char buf[CMSG_SPACE(sizeof(int))];
 
-
     bread = readsock(desc, buff, sizeof(buff)-1, '\n', timeout, 0, 1);
     if(bread == -2) /* timeout */
 	return -2;
@@ -140,6 +142,29 @@ int command(int desc, const struct cl_engine *engine, 
 	    if(cfgopt(copt, "ExitOnOOM")->enabled)
 		return COMMAND_SHUTDOWN;
 
+    } else if(!strncmp(buff, CMD14, strlen(CMD14))) { /* FILDES */
+	memset(&msg, 0, sizeof(msg));
+	msg.msg_control = buf;
+	msg.msg_controllen = sizeof(buf);
+ 
+	if (recvmsg(desc, &msg, 0) == -1) {
+	    logg("recvmsg failed!");
+	    return -1;
+	}
+	if ((msg.msg_flags & MSG_TRUNC) || (msg.msg_flags & MSG_CTRUNC)) {
+	    logg("control message truncated");
+	    return -1;
+	}
+	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
+	    cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+		if (cmsg->cmsg_len == CMSG_LEN(sizeof(int)) &&
+		    cmsg->cmsg_level == SOL_SOCKET &&
+		    cmsg->cmsg_type == SCM_RIGHTS) {
+			int fd = *(int *)CMSG_DATA(cmsg);
+	    		scanfd(fd, NULL, engine, limits, options, copt, desc);
+			close(fd);
+		}
+	}
     } else {
 	mdprintf(desc, "UNKNOWN COMMAND\n");
     }
