static void connect_callback(struct ev_loop *loop,struct ev_io *w ,int revents) { struct sc_tcp_server *self = container_of(w,struct sc_tcp_server, connect); printf("in connect_callback:%s,%d\n", __FILE__, __LINE__); const struct sc_tcp_server_settings *settings = self->settings; assert(!(revents & EV_ERROR)); if (revents & EV_READ) { struct sockaddr_storage addr; socklen_t addrlen = sizeof(addr); int fd; fd= sc_accept(w->fd, (struct sockaddr *)&addr, &addrlen); if (fd < 0) return; init_accept_fd(self, loop, fd); /* if (fd < 0) { settings->on_error(self,loop,SC_TCP_SERVER_ACCEPT_ERROR); } else if (!settings->on_connect( self, loop, fd, (struct sockaddr*)&addr, addrlen)) sc_close(&fd); */ } }
int main(int argc, char *argv[]) { SC_Connection server; SC_Connection peer; if (argc < 2) { fprintf(stderr,"Usage:\n\t%s <port>\n",argv[0]); exit(EXIT_FAILURE); } if(init_sc_server(&server,argv[1]) != SC_OK) { fprintf(stderr,"server: couldn't initiate server\n"); exit(EXIT_FAILURE); } if(sc_listen(&server) != SC_OK) { exit(EXIT_FAILURE); } printf("server: waiting for connections...\n"); while(1) { if(sc_accept(&server,&peer) != SC_OK) { perror("accept"); continue; } if(send(peer.socket, "Hello, world!", 13, 0) == -1) { perror("send"); } close(peer.socket); } close(server.socket); return 0; }
static int __sc_accept(struct task_struct *curr, struct pt_regs *regs) { char **mboxp, *msg; int err; /* We should be able to write to a mailbox storage, even if we * actually don't. */ if (!__xn_access_ok (curr, VERIFY_WRITE, __xn_reg_arg1(regs), sizeof(msg))) return -EFAULT; if (!__xn_access_ok (curr, VERIFY_WRITE, __xn_reg_arg2(regs), sizeof(msg))) return -EFAULT; mboxp = (char **)__xn_reg_arg1(regs); msg = sc_accept(mboxp, &err); if (!err) __xn_copy_to_user(curr, (void __user *)__xn_reg_arg2(regs), &msg, sizeof(msg)); return err; }