$OpenBSD: patch-clamd_session_c,v 1.3 2007/03/25 11:24:02 mbalmer Exp $
--- clamd/session.c.orig	Wed Feb 28 00:37:13 2007
+++ clamd/session.c	Tue Mar 13 09:37:42 2007
@@ -60,8 +60,10 @@ int command(int desc, const struct cl_en
 {
 	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;
@@ -156,6 +158,29 @@ int command(int desc, const struct cl_en
 	    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");
     }
