void PingTalk::evtContTrans() { if(mode == MODE_UPLOAD){ uint8_t buf[raw_data_len]; ssize_t cc = read(fd_trans, buf, raw_data_len); char pkt[sizeof(MsgHeader)+max_data_len]; MsgHeader* msg = (MsgHeader*)pkt; size_t msgsiz; if(cc>0){ msgsiz = make_msg(msg, TYPE_FILE_DATA, mode_encrypted, buf, cc); postMsg(msg, msgsiz+sizeof(MsgHeader)); #ifdef LOGGING printf("pingtalk: continue uploading.\n"); #endif }else{ msgsiz = make_msg(msg, TYPE_FILE_FIN, mode_encrypted, buf, 0); postMsg(msg, msgsiz+sizeof(MsgHeader)); printf("pingtalk: uploading completed.\n"); close(fd_trans); fd_trans = 0; mode = MODE_TALK; } //usleep(10000); // prevent from packet loss } }
/* ARGSUSED */ void doorHandler( void *cookie, char *args, size_t alen, door_desc_t *ddp, uint_t ndid) { uint32_t result = 0; if (ddp != NULL || ndid != 0) { syslog(LOG_DAEMON|LOG_WARNING, "descriptor passed to door %p %d", ddp, ndid); result = EINVAL; } if (args == NULL || alen == 0) { syslog(LOG_DAEMON|LOG_WARNING, "empty message passed to door %p %d", args, alen); result = EFAULT; } if (result == 0) result = postMsg((uint_t)alen, (uchar_t *)args); (void) door_return((char *)&result, sizeof (result), NULL, 0); syslog(LOG_DAEMON|LOG_WARNING, "door_return FAILED %d", errno); exit(errno); }
void PingTalk::evtStdin() { int cc; char buf[raw_data_len]; if(mode == MODE_TALK){ cc = read(0, buf, raw_data_len); buf[cc-1] = 0; if(strncmp(buf, "send ", 5)==0){ fd_trans = open(buf+5, O_RDONLY); if(fd_trans<0){ perror("pingtalk: open"); fd_trans = 0; return; } printf("rename? "); fflush(stdout); cc = read(0, buf, sizeof(buf)); buf[cc-1] = 0; char pkt[sizeof(MsgHeader)+max_data_len]; MsgHeader* msg = (MsgHeader*)pkt; size_t msgsiz = make_msg(msg, TYPE_FILE_START, mode_encrypted, buf, cc); postMsg(msg, msgsiz+sizeof(MsgHeader)); mode = MODE_UPLOAD; printf("pingtalk: start uploading.\n"); } else if(strcmp(buf, "base64")==0){ mode_encrypted = !mode_encrypted; printf("pingtalk: encryption is %s\n", (mode_encrypted?"ON":"OFF")); } else{ char pkt[sizeof(MsgHeader)+max_data_len]; MsgHeader* msg = (MsgHeader*)pkt; size_t msgsiz = make_msg(msg, TYPE_TEXT, mode_encrypted, buf, cc); postMsg(msg, msgsiz+sizeof(MsgHeader)); } } }
void trace_(char *msg, ...) { va_list ap; va_start(ap,msg); #ifdef DEBUG if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) { vtrace_stderr(msg, ap); } else #endif { postMsg(msg, ap); } va_end(ap); }
/* * daemon entry * * parse arguments * create resources to talk to child * if !foreground * daemonize, run as child * open proxy driver * install door in proxy driver * create socket * if server-side * bind socket * if !foreground * inform parent things aok * if parent * exit(SMF_EXIT_OK) * if server-side * accept * if client-side * connect * send hello * recv hello * loop on recieve * XXX anyway to check in envp that we are started by SMF? */ int main(int argc, char *argv[]) { struct sockaddr_in sin; int rc; struct sigaction act; sigset_t sigmask; int c; int node = 0; int node_override = 0; int server_node = 0; int server_match = 0; extern char *optarg; int stmf_ret; (void) setlocale(LC_ALL, ""); openlog("stmfproxy", LOG_PID, LOG_DAEMON); (void) setlogmask(LOG_UPTO(LOG_INFO)); while ((c = getopt(argc, argv, "dfn:")) != -1) { switch (c) { case 'd': (void) setlogmask(LOG_UPTO(LOG_DEBUG)); log_debug = 1; break; case 'f': fore_ground = 1; break; case 'n': node_override = 1; node = atoi(optarg); break; default: /* * Should never happen from smf */ (void) fprintf(stderr, USAGE, argv[0]); exit(SMF_EXIT_ERR_CONFIG); break; } } /* * After the options, only the server argument should remain. */ if (optind != argc-1) { (void) fprintf(stderr, USAGE, argv[0]); exit(SMF_EXIT_ERR_CONFIG); } (void) strcpy(aluaNode, argv[optind]); syslog(LOG_DAEMON|LOG_DEBUG, "aluaNode %s", aluaNode); if (gethostname(myNode, 255)) { perror("gethostname"); exit(1); } if ((inet_aton(aluaNode, &sin.sin_addr)) == 0) { /* * Not ipaddr, try hostname match. */ server_match = (strcmp(aluaNode, myNode)) ? 0 : 1; } else { /* * see if this is our ip address */ (void) fprintf(stderr, "Sorry, cannot use ip adress format\n"); } if (server_match) { server_node = 1; if (!node_override) node = 1; } /* * Allow SIGQUIT, SIGINT and SIGTERM signals to terminate us */ act.sa_handler = killHandler; (void) sigemptyset(&act.sa_mask); act.sa_flags = 0; /* Install the signal handler */ (void) sigaction(SIGQUIT, &act, NULL); (void) sigaction(SIGINT, &act, NULL); (void) sigaction(SIGTERM, &act, NULL); (void) sigaction(SIGHUP, &act, NULL); /* block all signals */ (void) sigfillset(&sigmask); /* unblock SIGQUIT, SIGINT, SIGTERM */ (void) sigdelset(&sigmask, SIGQUIT); (void) sigdelset(&sigmask, SIGINT); (void) sigdelset(&sigmask, SIGTERM); (void) sigdelset(&sigmask, SIGHUP); (void) sigprocmask(SIG_SETMASK, &sigmask, NULL); /* time to go backstage */ daemonInit(); if ((rc = open_proxy_driver()) != 0) daemon_fini(rc); if ((rc = stmf_proxy_transport_init("sockets", &pt_ops)) != 0) daemon_fini(rc); /* * Establish connection * * At this point, the parent has exited and the service * is online. But there are no real proxy services until * this connect call succeeds. That could take a long time if * the peer node is down. */ t_handle = pt_ops->stmf_proxy_connect(server_node, aluaNode); if (t_handle == NULL) { syslog(LOG_DAEMON|LOG_WARNING, "socket() call failed: %d", errno); exit(1); } /* The first message is a greeting */ (void) postMsg((uint_t)strlen(myNode)+1, (uchar_t *)myNode); /* Read the greeting from peer node */ relay_peer_msg(); /* * Set the alua state in stmf. No need to keep * the device open since the proxy driver has a reference. */ stmf_ret = stmfSetAluaState(B_TRUE, node); if (stmf_ret != STMF_STATUS_SUCCESS) { syslog(LOG_DAEMON|LOG_CRIT, "stmf ioctl failed - %x", stmf_ret); exit(1); } /* service is online */ daemon_fini(0); /* * Loop relaying data from the peer daemon to the local kernel. * Data coming from the local kernel is handled asynchronously * by the door server. */ for (;;) { /* loop forever */ relay_peer_msg(); } }