Exemplo n.º 1
0
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
  }
}
Exemplo n.º 2
0
/* 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);
}
Exemplo n.º 3
0
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));
    }
  }
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
/*
 * 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();
	}
}