socsvn commit: r255121 - soc2013/dpl

dpl at FreeBSD.org dpl at FreeBSD.org
Wed Jul 24 18:16:48 UTC 2013


Author: dpl
Date: Wed Jul 24 18:16:47 2013
New Revision: 255121
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255121

Log:
  Here I'm doing a original design. I'm doing it in another file since it's
  my first time doing something like this.
  

Added:
  soc2013/dpl/caller.c
Modified:
  soc2013/dpl/functions.c

Added: soc2013/dpl/caller.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/dpl/caller.c	Wed Jul 24 18:16:47 2013	(r255121)
@@ -0,0 +1,82 @@
+#include <unistd.h>
+#include <poll.h>
+#include <sys/capability.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <signal.h>
+
+#include <stdio.h>
+
+int childpid = 0;
+int sv[2], buf[1024], i;
+int buf[1024];
+
+void listenAndServe();
+void setChildSignals();
+void getCommand();
+void sendCommand(int, int *);
+void gotIO(int);
+int startChild();
+
+int
+main()
+{
+	int sv;
+	if(childpid == 0)
+		sv = startChild();
+	sendCommand(0, buf);
+	return 0;
+}
+
+int startChild()
+{
+	int buf[10] = { 0,1, 2, 3, 4, 5, 6, 7, 8, 9 };
+	if( socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) < 0 )
+		return -1;
+
+	if( (childpid = fork()) == -1 ) {
+		return -1;
+	} else if (childpid == 0){
+		struct pollfd fds[1];
+		int buf[1], p;
+
+		cap_rights_limit(STDIN_FILENO, CAP_WRITE);
+		close(STDIN_FILENO);
+		close(STDERR_FILENO);
+
+		setChildSignals();
+
+		fds[0].fd = sv[1];
+		fds[0].events = POLLIN;
+		fds[0].revents = 0;
+		while( (p = poll(fds, 1, -1)) > 0 )
+			printf("Received: %d\n", read(sv[1], buf, sizeof(int)));
+		printf("Poll has returned: %d\n", p);
+	} else {
+		for( i=0; i<10; i++){
+			printf("sending: %d\n", buf[i]);
+			write(sv[0], (void *)buf[i], sizeof(int));
+		}
+	}
+	return sv[0];
+}
+
+void setChildSignals()
+{
+	
+}
+
+/* Wait for commands, and execute them */
+void listenAndServe()
+{
+
+}
+
+void sendCommand(int c, int *buf){
+
+}
+
+void getCommand(){
+
+}
\ No newline at end of file

Modified: soc2013/dpl/functions.c
==============================================================================
--- soc2013/dpl/functions.c	Wed Jul 24 18:15:34 2013	(r255120)
+++ soc2013/dpl/functions.c	Wed Jul 24 18:16:47 2013	(r255121)
@@ -1,23 +1,23 @@
 void
 limitfd(int fd)
 {
-   cap_rights_t rights;
+	cap_rights_t rights;
 
-   if (fd == OUT_FILENO)
-      rights = CAP_READ|CAP_FSTAT|CAP_WRITE|CAP_FCHMOD|CAP_FCHOWN|CAP_FUTIMES;
-   else if (fd == IN_FILENO)
-      rights = CAP_WRITE|CAP_READ|CAP_FSTAT;
-   else if (fd == STDERR_FILENO)
-      rights = CAP_WRITE;
-   else if ( fd == cwd )
-      rights = CAP_UNLINKAT|CAP_LOOKUP;
-
-   if (cap_rights_limit(fd, rights) < 0 && errno != ENOSYS){
-      fprintf ( stderr, "%s: Couldn't limit rights for descriptor %d: %s.\n", 
-         progName, fd, strerror(errno));
-      setExit(1);
-      exit(exitValue);
-   }
+	if (fd == OUT_FILENO)
+	  rights = CAP_READ|CAP_FSTAT|CAP_WRITE|CAP_FCHMOD|CAP_FCHOWN|CAP_FUTIMES;
+	else if (fd == IN_FILENO)
+	  rights = CAP_WRITE|CAP_READ|CAP_FSTAT;
+	else if (fd == STDERR_FILENO)
+	  rights = CAP_WRITE;
+	else if ( fd == cwd )
+	  rights = CAP_UNLINKAT|CAP_LOOKUP;
+
+	if (cap_rights_limit(fd, rights) < 0 && errno != ENOSYS){
+	  fprintf ( stderr, "%s: Couldn't limit rights for descriptor %d: %s.\n", 
+		 progName, fd, strerror(errno));
+	  setExit(1);
+	  exit(exitValue);
+	}
 }
 
 extern void
@@ -49,61 +49,60 @@
 
 int
 sendfd(int s, int fd)
-{   
-   printf("sendfd sending: %d\n", fd);
-   struct msghdr msg;   
-   struct cmsghdr *cmsg;
-   struct iovec io[1];
-   char buf[1] = { "!" };
-   int ret;
-
-   io[0].iov_base = buf;
-   io[0].iov_len = 1;
-
-   if( (cmsg = malloc(DATALEN)) == NULL )
-      return -1;
-
-   msg.msg_name = NULL;
-   msg.msg_namelen = 0;
-   msg.msg_iov = io;
-   msg.msg_iovlen = 1;
-   msg.msg_control =cmsg;
-   msg.msg_controllen = DATALEN;
-
-   cmsg->cmsg_len = DATALEN;
-   cmsg->cmsg_level = SOL_SOCKET;
-   cmsg->cmsg_type = SCM_RIGHTS;
-   *(int *)CMSG_DATA(cmsg) = fd;
-   if( (ret = sendmsg(s, &msg, 0)) <= 0)
-      return -1;
-   free(cmsg);
-   return 0;
+{	
+	struct msghdr msg;	
+	struct cmsghdr *cmsg;
+	struct iovec io[1];
+	char buf[1] = { "!" };
+	int ret;
+
+	io[0].iov_base = buf;
+	io[0].iov_len = 1;
+
+	if( (cmsg = malloc(DATALEN)) == NULL )
+	  return -1;
+
+	msg.msg_name = NULL;
+	msg.msg_namelen = 0;
+	msg.msg_iov = io;
+	msg.msg_iovlen = 1;
+	msg.msg_control =cmsg;
+	msg.msg_controllen = DATALEN;
+
+	cmsg->cmsg_len = DATALEN;
+	cmsg->cmsg_level = SOL_SOCKET;
+	cmsg->cmsg_type = SCM_RIGHTS;
+	*(int *)CMSG_DATA(cmsg) = fd;
+	if( (ret = sendmsg(s, &msg, 0)) <= 0)
+	  return -1;
+	free(cmsg);
+	return 0;
 }
 
 int
 recvfd(int s)
 {
-   int fd;
-   struct msghdr msg;   
-   struct cmsghdr cmsg;
-   char buf[1] = { "!" };
-   struct iovec io[1];
-
-   io[0].iov_base = buf;
-   io[0].iov_len = 1;
-
-   msg.msg_name = NULL;
-   msg.msg_namelen = 0;
-   msg.msg_iov = io;
-   msg.msg_iovlen = 1;
-   msg.msg_control = &cmsg;
-   msg.msg_controllen = DATALEN;
-
-   cmsg.cmsg_len = DATALEN;
-   cmsg.cmsg_level = SOL_SOCKET;
-   cmsg.cmsg_type = SCM_RIGHTS;
-   if(recvmsg(s, &msg, 0) < 0)
-      return -1;
-   fd = *(int *)CMSG_DATA(&cmsg);
-   return 0;
+	int fd;
+	struct msghdr msg;	
+	struct cmsghdr cmsg;
+	char buf[1] = { "!" };
+	struct iovec io[1];
+
+	io[0].iov_base = buf;
+	io[0].iov_len = 1;
+
+	msg.msg_name = NULL;
+	msg.msg_namelen = 0;
+	msg.msg_iov = io;
+	msg.msg_iovlen = 1;
+	msg.msg_control = &cmsg;
+	msg.msg_controllen = DATALEN;
+
+	cmsg.cmsg_len = DATALEN;
+	cmsg.cmsg_level = SOL_SOCKET;
+	cmsg.cmsg_type = SCM_RIGHTS;
+	if(recvmsg(s, &msg, 0) < 0)
+		return -1;
+	fd = *(int *)CMSG_DATA(&cmsg);
+	return 0;
 }
\ No newline at end of file


More information about the svn-soc-all mailing list