socsvn commit: r255234 - soc2013/dpl
dpl at FreeBSD.org
dpl at FreeBSD.org
Sat Jul 27 21:10:31 UTC 2013
Author: dpl
Date: Sat Jul 27 21:10:31 2013
New Revision: 255234
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255234
Log:
This toy implementation it's almost working.
There's only a problem when reading back from buf[] the return value of sum_().
Modified:
soc2013/dpl/caller.c
Modified: soc2013/dpl/caller.c
==============================================================================
--- soc2013/dpl/caller.c Sat Jul 27 20:47:01 2013 (r255233)
+++ soc2013/dpl/caller.c Sat Jul 27 21:10:31 2013 (r255234)
@@ -10,87 +10,127 @@
#include <stdlib.h>
#include <strings.h>
+
+struct pollfd fdread[1], fdwrite[1];
pid_t child = 0;
int sv[2], i;
-/* commands will live here */
-/* I will malloc it this afternoon */
-int buf[32];
+int *buf[32];
pid_t startChild();
-void worker();
-void setSignals();
void waitCommand();
-void * command();
void killChild();
+/* Toy lib */
+int sum(int a);
+int sum_(int a);
+
int
main()
{
- if(child == 0)
- child = startChild();
- if(child < 0){
- perror("error");
- exit(1);
- }
-
+ int ret, a = 1;
+ ret = sum(a);
+ fflush(stdout);
+ printf("ret: %d (should be 2)\n", ret);
+ fflush(stdout);
+
atexit(killChild);
return 0;
}
-int startChild()
+int sum(int a)
{
- bzero(&buf, sizeof(buf));
- if( socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) < 0 )
- return -1;
-
- if( (child = fork()) == -1 ) {
- return -1;
- } else if (child == 0){
- worker();
+ /* Caller overhead */
+ /* Much better if we do this in a function */
+ int ptr = (int)sum_;
+ fdwrite[0].fd = sv[0];
+ fdwrite[0].events = POLLOUT;
+ fdwrite[0].revents = 0;
+ fdread[0].fd = sv[0];
+ fdread[0].events = POLLIN|POLLPRI;
+ fdread[0].revents = 0;
+ if( child == 0)
+ startChild();
+
+ /* Real stuff */
+ buf[0] = &ptr;
+ buf[1] = &a;
+
+ /* Should be in a function as well */
+ /* sendAndWait() (?) */
+ while(1){
+ if(poll(fdwrite, 1, 0) > 0 ){
+ write(sv[0], buf, sizeof(buf));
+ break;
+ }
}
- return child;
+ /* Here, the stuff gets done in child. */
+ while(1){
+ if(poll(fdread, 1, 0) > 0 ){
+ read(sv[0], buf, sizeof(buf));
+ break;
+ }
+ }
+ printf("done: %d\n", *buf[0]);
+
+ return *buf[0];
}
-void worker(){
- cap_rights_limit(STDIN_FILENO, CAP_WRITE);
- close(STDIN_FILENO);
- close(STDERR_FILENO);
-
- waitCommand();
- signal(
- /* Should we call signal() to exit more cleanly? */
+int sum_(int a)
+{
+ return ++a;
}
+int startChild()
+{
+ socketpair(PF_LOCAL, SOCK_STREAM, 0, sv);
+ if( (child = fork()) == 0 ){
+ cap_rights_limit(STDOUT_FILENO, CAP_WRITE);
+ close(STDIN_FILENO);
+ close(STDERR_FILENO);
+ cap_enter();
+ waitCommand();
+ }
+
+ return child;
+}
/* Wait for commands, and execute them */
void
waitCommand()
{
- int p;
- pid_t pid;
- struct pollfd fds[1];
- fds[0].fd = sv[1];
- fds[0].events = POLLIN|POLLPRI|POLLOUT;
- fds[0].revents = 0;
-
+ struct pollfd fdread[1], fdwrite[1];
+ fdread[0].fd = sv[1];
+ fdread[0].events = POLLIN|POLLPRI;
+ fdread[0].revents = 0;
+ fdwrite[0].fd = sv[1];
+ fdwrite[0].events = POLLOUT;
+ fdwrite[0].revents = 0;
while(1) {
- p = poll(fds, 1, 0);
- if (p > 0){
- if( fds[0].revents & POLLIN || fds[0].revents & POLLPRI){
- /* Read command */
- read(sv[1], buf, sizeof(buf));
- } else if( fds[0].revents & POLLOUT) {
- /* Write answer */
+ while(1){
+ if( poll(fdread, 1, 0) > 0){
+ read(sv[1], buf, sizeof(buf));
+ break;
}
}
- }
-}
+ if( (void *)*buf[0] == (void *) sum_ ){
+ /* This is a C exercise }:-) */
+ int ret = ((int (*) (int)) *buf[0])(*buf[1]);
+ /* int ret = sum_(*buf[1]); */
+ printf("ret:%d\n", ret);
+ fflush(stdout);
+ bzero(&buf, sizeof(buf));
+ buf[0] = &ret;
+ }
-void *
-command(){
- return NULL;
+ while(1) {
+ if (poll(fdwrite, 1, 0) > 0){
+ write(sv[1], buf, sizeof(buf));
+ break;
+ }
+ }
+ }
}
void
More information about the svn-soc-all
mailing list