示例#1
0
int SetKsocketSendBuf (char path[NG_PATHSIZ], int value) {
    union {
		u_char buf[sizeof(struct ng_ksocket_sockopt) + sizeof(int)];
		struct ng_ksocket_sockopt sockopt;
	} sockopt_buf;
	struct ng_ksocket_sockopt * const sockopt = &sockopt_buf.sockopt;

    struct ng_ksocket_sockopt *sk;
    struct ng_mesg *resp;
    size_t sockopt_len = sizeof(struct ng_ksocket_sockopt) + sizeof(int);

    memset(sockopt, 0, sizeof(sockopt_buf));

    sockopt->level = SOL_SOCKET;
    sockopt->name = SO_SNDBUF;
    memcpy(sockopt->value, &value, sizeof(value));
    NgSetDebug(3);
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_SETOPT, 
                            sockopt, sizeof(sockopt_buf)) == -1 ) {
        printf("Error while trying to set sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    NgSetDebug(0);
    return 1;
}
示例#2
0
/* Get Error from ksocket node if any */
int GetKsocketError(char path[NG_PATHSIZ]) {
    struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int)); 
    struct ng_mesg *resp;
    memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));

    sockopt_resp->level = SOL_SOCKET;
    sockopt_resp->name = SO_ERROR;
    NgSetDebug(3);
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT, 
                            sockopt_resp, sizeof(*sockopt_resp)) == -1 ) {
        printf("Error while trying to get sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    if ( NgAllocRecvMsg(csock, &resp, 0 ) < 0 ) {
        fprintf(stderr, "Error while trying to get message from getsockopt: %s\n", strerror(errno));
        return 1;
    }

    int sockError = *((struct ng_ksocket_sockopt *)resp->data)->value; 
    if (sockError != 0) { 
        printf("Error = %d string = %s\n", sockError, strerror(sockError));
    }
    free(sockopt_resp);
    free(resp);
    return 1;
}
示例#3
0
int CreateNgKsocket() {
    char path[NG_PATHSIZ];
    struct ngm_mkpeer arg;
    
    sprintf(arg.type, "ksocket");
    sprintf(arg.peerhook, "inet/stream/tcp");
    sprintf(arg.ourhook, "delusion");
    
    memset(path, 0, sizeof(path));
    sprintf(path, ".:");
    if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE, NGM_MKPEER, &arg, sizeof(arg)) < 0 ) {
        printf("%s(): Error sending message: %s", __func__, strerror(errno));
        return -1;
    }
    sprintf(path, ".:%s", arg.ourhook);
    memset( ksock_name, 0, sizeof(ksock_name) );
    sprintf(ksock_name, "http-ksocket-%d", getpid());
    if ( NgNameNode(csock, path, ksock_name, getpid()) < 0 ) {
        printf("%s: error naming node : %s", __func__, strerror(errno));
        return -1;
    }

    /* make kscoket bind and listen state */
    struct sockaddr_in source;
    source.sin_family = AF_INET;
    inet_aton(SRC_IP, &source.sin_addr);
    source.sin_port = htons(atoi(SRC_PORT));
    source.sin_len = sizeof(struct sockaddr_in);
    sprintf(path, "%s:", ksock_name);
    NgSetDebug(3);
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_BIND,  &source, sizeof(source)) < 0 ) {
        printf("%s(): Error sending ksocket bind: %s\n", __func__, strerror(errno));
        return -1;
    }
    /* Listening ksocket */
    int lst = 1024;
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_LISTEN,  &lst, sizeof(lst)) < 0 ) {
        printf("%s(): Error sending ksocket bind: %s\n", __func__, strerror(errno));
        return -1;
    }
    int token;
    token = NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_ACCEPT, NULL, 0);
    if ( token < 0 && errno != EINPROGRESS && errno != EALREADY ) {
        printf("%s(): Accept Failed %s\n", __func__, strerror(errno));
        return -1;
    }
    SetKsocketKeepAlive(ksock_name);
    return token;
}
示例#4
0
int
main(int argc, char **argv)
{
	int c;
	char sname[NG_NODESIZ];
	int rcvbuf = SORCVBUF_SIZE;

	/* parse options */
	while ((c = getopt(argc, argv, "d:")) != -1) {
		switch (c) {
		case 'd':	/* set libnetgraph debug level. */
			NgSetDebug(atoi(optarg));
			break;
		}
	}

	argc -= optind;
	argv += optind;
	ng_path = argv[0];
	if (ng_path == NULL || (strlen(ng_path) > NG_PATHSIZ))
		help();
	argc--;
	argv++;

	/* create control socket. */
	snprintf(sname, sizeof(sname), "flowctl%i", getpid());

	if (NgMkSockNode(sname, &cs, NULL) == -1)
		err(1, "NgMkSockNode");

	/* set receive buffer size */
	if (setsockopt(cs, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(int)) == -1)
		err(1, "setsockopt(SOL_SOCKET, SO_RCVBUF)");

	/* parse and execute command */
	execute_command(argc, argv);

	close(cs);
	
	exit(0);
}
示例#5
0
文件: main.c 项目: AhmadTux/freebsd
/*
 * main()
 */
int
main(int ac, char *av[])
{
	char	name[NG_NODESIZ];
	int	interactive = isatty(0) && isatty(1);
	FILE	*fp = NULL;
	int	ch, rtn = 0;

	/* Set default node name */
	snprintf(name, sizeof(name), "ngctl%d", getpid());

	/* Parse command line */
	while ((ch = getopt(ac, av, "df:n:")) != -1) {
		switch (ch) {
		case 'd':
			NgSetDebug(NgSetDebug(-1) + 1);
			break;
		case 'f':
			if (strcmp(optarg, "-") == 0)
				fp = stdin;
			else if ((fp = fopen(optarg, "r")) == NULL)
				err(EX_NOINPUT, "%s", optarg);
			break;
		case 'n':
			snprintf(name, sizeof(name), "%s", optarg);
			break;
		case '?':
		default:
			Usage((char *)NULL);
			break;
		}
	}
	ac -= optind;
	av += optind;

	/* Create a new socket node */
	if (NgMkSockNode(name, &csock, &dsock) < 0)
		err(EX_OSERR, "can't create node");

	/* Do commands as requested */
	if (ac == 0) {
		if (fp != NULL) {
			rtn = ReadFile(fp);
		} else if (interactive) {
			rtn = DoInteractive();
		} else
			Usage("no command specified");
	} else {
		rtn = DoCommand(ac, av);
	}

	/* Convert command return code into system exit code */
	switch (rtn) {
	case CMDRTN_OK:
	case CMDRTN_QUIT:
		rtn = 0;
		break;
	case CMDRTN_USAGE:
		rtn = EX_USAGE;
		break;
	case CMDRTN_ERROR:
		rtn = EX_OSERR;
		break;
	}
	return (rtn);
}
示例#6
0
int
main(int argc, char *argv[])
{
  char hostname[MAXHOSTNAMELEN], *exec, rhook[NG_HOOKSIZ];
  unsigned char response[1024];
  const char *label, *prog, *provider, *acname;
  struct ngm_connect ngc;
  struct sigaction act;
  int ch, cs, ds, ret, optF, optd, optn, sz, f;
  const char *pidfile;

  prog = strrchr(argv[0], '/');
  prog = prog ? prog + 1 : argv[0];
  pidfile = NULL;
  exec = NULL;
  label = NULL;
  acname = NULL;
  provider = "";
  optF = optd = optn = 0;

  while ((ch = getopt(argc, argv, "FP:a:de:l:n:p:")) != -1) {
    switch (ch) {
      case 'F':
        optF = 1;
        break;

      case 'P':
        pidfile = optarg;
        break;

      case 'a':
        acname = optarg;
        break;

      case 'd':
        optd = 1;
        break;

      case 'e':
        exec = optarg;
        break;

      case 'l':
        label = optarg;
        break;

      case 'n':
        optn = 1;
        NgSetDebug(atoi(optarg));
        break;

      case 'p':
        provider = optarg;
        break;

      default:
        return usage(prog);
    }
  }

  if (optind >= argc || optind + 2 < argc)
    return usage(prog);

  if (exec != NULL && label != NULL)
    return usage(prog);

  if (exec == NULL) {
    if (label == NULL)
      label = provider;
    if (label == NULL) {
      fprintf(stderr, "%s: Either a provider, a label or an exec command"
              " must be given\n", prog);
      return usage(prog);
    }
    exec = (char *)alloca(sizeof DEFAULT_EXEC_PREFIX + strlen(label));
    if (exec == NULL) {
      fprintf(stderr, "%s: Cannot allocate %d bytes\n", prog,
              (int)(sizeof DEFAULT_EXEC_PREFIX) + strlen(label));
      return EX_OSERR;
    }
    strcpy(exec, DEFAULT_EXEC_PREFIX);
    strcpy(exec + sizeof DEFAULT_EXEC_PREFIX - 1, label);
  }

  if (acname == NULL) {
    char *dot;

    if (gethostname(hostname, sizeof hostname))
      strcpy(hostname, "localhost");
    else if ((dot = strchr(hostname, '.')))
      *dot = '\0';

    acname = hostname;
  }

#ifndef NOKLDLOAD
  if (!LoadModules())
    return EX_UNAVAILABLE;
#endif

  /* Create a socket node */
  if (NgMkSockNode(NULL, &cs, &ds) == -1) {
    perror("Cannot create netgraph socket node");
    return EX_CANTCREAT;
  }

  /* Connect it up (and fill in `ngc') */
  if ((ret = ConfigureNode(prog, argv[optind], provider, cs, ds,
                           optd, &ngc)) != 0) {
    close(cs);
    close(ds);
    return ret;
  }

  if (!optF && daemon(1, 0) == -1) {
    perror("daemon()");
    close(cs);
    close(ds);
    return EX_OSERR;
  }


  if (pidfile != NULL) {
    FILE *fp;

    if ((fp = fopen(pidfile, "w")) == NULL) {
      perror(pidfile);
      close(cs);
      close(ds);
      return EX_CANTCREAT;
    } else {
      fprintf(fp, "%d\n", (int)getpid());
      fclose(fp);
    }
  }

  openlog(prog, LOG_PID | (optF ? LOG_PERROR : 0), LOG_DAEMON);
  if (!optF && optn)
    NgSetErrLog(nglog, nglogx);

  memset(&act, '\0', sizeof act);
  act.sa_handler = Farewell;
  act.sa_flags = 0;
  sigemptyset(&act.sa_mask);
  sigaction(SIGHUP, &act, NULL);
  sigaction(SIGINT, &act, NULL);
  sigaction(SIGQUIT, &act, NULL);
  sigaction(SIGTERM, &act, NULL);

  while (!ReceivedSignal) {
    if (*provider)
      syslog(LOG_INFO, "Listening as provider %s", provider);
    else
      syslog(LOG_INFO, "Listening");

    switch (sz = NgRecvData(ds, response, sizeof response, rhook)) {
      case -1:
        syslog(LOG_INFO, "NgRecvData: %m");
        break;
      case 0:
        syslog(LOG_INFO, "NgRecvData: socket closed");
        break;
      default:
        if (optd) {
          char *dbuf, *ptr;

          ptr = dbuf = alloca(sz * 2 + 1);
          for (f = 0; f < sz; f++, ptr += 2)
            sprintf(ptr, "%02x", (u_char)response[f]);
          *ptr = '\0';
          syslog(LOG_INFO, "Got %d bytes of data: %s", sz, dbuf);
        }
    }
    if (sz <= 0) {
      ret = EX_UNAVAILABLE;
      break;
    }
    Spawn(prog, acname, provider, exec, ngc, cs, ds, response, sz, optd);
  }

  if (pidfile)
    remove(pidfile);

  if (ReceivedSignal) {
    syslog(LOG_INFO, "Received signal %d, exiting", ReceivedSignal);

    signal(ReceivedSignal, SIG_DFL);
    raise(ReceivedSignal);

    /* NOTREACHED */

    ret = -ReceivedSignal;
  }

  return ret;
}
示例#7
0
int
main(int argc, char **argv)
{
	int     c;
	char    sname[16];
    char	*ng_name;
	char	*rflags = "0", *rfname = NULL, *wfname = NULL;

	fl_use_in = fl_use_out = 1;

	/* parse options */
	while ((c = getopt(argc, argv, "T:d:f:inor:w:")) != -1) {
		switch (c) {
        case 'T':   /* set socket ready timeout, in secs. */
            read_to = atoi(optarg);
            break;

		case 'd':	/* set libnetgraph debug level. */
			NgSetDebug(atoi(optarg));
			break;

		case 'f':	/* flags for -r switch */
			rflags = optarg;
			break;

		case 'i':	/* use only input hook */
			fl_use_in = 1;
			fl_use_out = 0;
			break;
		case 'n':
			fl_ipnum = 1;
			break;
		case 'o':	/* use only output hook */
			fl_use_out = 1;
			fl_use_in = 0;
			break;

		case 'r':	/* get data from file, not from node */
			fl_rfile = 1;
			rfname = optarg;
			break;

		case 'w':	/* write data in binary to file */
			wfname = optarg;
			break;
			
		}
	}

	if (fl_rfile) {
		ip_account_read(rfname, rflags);
		exit(0);
	}

	if (wfname != NULL) {
		wfp = fopen(wfname, "a");
		if (wfp == NULL)
			err(1, "fopen");
	}

	argc -= optind;
	argv += optind;
	ng_name = argv[0];
	if (ng_name == NULL)
		help();
	argc --;
	argv ++;

	if((ng_hookprefix = strchr(ng_name, ':')))
		*(ng_hookprefix++) = '\0';
	else
		ng_hookprefix = ng_nodename;
	snprintf(ng_nodename, sizeof(ng_nodename), "%s:", ng_name);

	/* creat control socket. */
	snprintf(sname, sizeof(sname), "ipacct%i", getpid());

	if (NgMkSockNode(sname, &ng_cs, NULL) == -1)
		err(1, "NgMkSockNode");
#if 0
	/* set control socket nonblocking */
	if ((flags = fcntl(ng_cs, F_GETFL, 0)) == -1)
		err(1, "fcntl(F_GETFL)");
	flags |= O_NONBLOCK;
	if (fcntl(ng_cs, F_SETFL, flags) == -1)
		err(1, "fcntl(F_SETFL)");

    /* 
     * XXX we don't set receive buffer size 'cause
     * reply size (NG control message + accounting
     * chunk) is smaller than default buffer size.
     * But this is sometimes can be not true.
     */

	/* set receive buffer size */
	if (setsockopt(ng_cs, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(int)) == -1)
		err(1, "setsockopt(SOL_SOCKET, SO_RCVBUF)");
#endif
	/* check versions */
	g_vinfo = check_version();

	/* parse and execute command */
	execute_command(argc, argv);

	close(ng_cs);
	
	exit(0);
}
示例#8
0
/*
 * main()
 */
int
main(int ac, char *av[])
{
	struct ngm_connect ngc;
	const char *path = NULL;
	const char *hook = DEFAULT_HOOKNAME;
	int     csock, dsock;
	int     asciiFlag = 0;
	int     loopFlag = 0;
	int	noInput = 0;
	int	execFlag = 0;
	int	ch;

	if ((msgs = sl_init()) == NULL)
		err(EX_OSERR, NULL);

	/* Parse flags */
	while ((ch = getopt(ac, av, "aedlm:nsS")) != -1) {
		switch (ch) {
		case 'a':
			asciiFlag = 1;
			break;
		case 'd':
			NgSetDebug(NgSetDebug(-1) + 1);
			break;
		case 'e':
			execFlag = 1;
			break;
		case 'l':
			loopFlag = 1;
			break;
		case 'n':
			noInput = 1;
			break;
		case 'm':
			if (sl_add(msgs, optarg) == -1)
				err(EX_OSERR, NULL);
			break;
		case 's':
			outfd = STDIN_FILENO;
			break;
		case 'S':
			infd = STDOUT_FILENO;
			break;
		case '?':
		default:
			Usage();
		}
	}
	ac -= optind;
	av += optind;

	if (execFlag) {
		if (asciiFlag || loopFlag) {
			fprintf(stderr, "conflicting options\n");
			Usage();
		}
		if (ac < 3)
			Usage();
		path = av[0];
		hook = av[1];
		av += 2;
		ac -= 2;
	} else {
		/* Get params */
		switch (ac) {
		case 2:
			hook = av[1];
			/* FALLTHROUGH */
		case 1:
			path = av[0];
			break;
		default:
			Usage();
		}
	}

	/* Get sockets */
	if (NgMkSockNode(NULL, &csock, &dsock) < 0)
		errx(EX_OSERR, "can't get sockets");

	/* Connect socket node to specified node */
	snprintf(ngc.path, sizeof(ngc.path), "%s", path);
	snprintf(ngc.ourhook, sizeof(ngc.ourhook), NG_SOCK_HOOK_NAME);
	snprintf(ngc.peerhook, sizeof(ngc.peerhook), "%s", hook);

	if (NgSendMsg(csock, ".",
	    NGM_GENERIC_COOKIE, NGM_CONNECT, &ngc, sizeof(ngc)) < 0)
		errx(EX_OSERR, "can't connect to node");

	if (execFlag) {
		/* move dsock to fd 0 and 1 */
		(void)close(0);
		(void)close(1);
		if (!noInput)
			(void)dup2(dsock, 0);
		(void)dup2(dsock, 1);

		send_msgs(csock, path);

		/* try executing the program */
		(void)execv(av[0], av);
		err(EX_OSERR, "%s", av[0]);

	} else
		send_msgs(csock, path);

	/* Close standard input if not reading from it */
	if (noInput)
		fclose(stdin);

	/* Relay data */
	while (1) {
		fd_set  rfds;

		/* Setup bits */
		FD_ZERO(&rfds);
		if (!noInput)
			FD_SET(infd, &rfds);
		FD_SET(dsock, &rfds);

		/* Wait for something to happen */
		if (select(FD_SETSIZE, &rfds, NULL, NULL, NULL) < 0)
			err(EX_OSERR, "select");

		/* Check data from socket */
		if (FD_ISSET(dsock, &rfds)) {
			char    buf[BUF_SIZE];
			int     rl, wl;

			/* Read packet from socket */
			if ((rl = NgRecvData(dsock,
			    buf, sizeof(buf), NULL)) < 0)
				err(EX_OSERR, "read(hook)");
			if (rl == 0)
				errx(EX_OSERR, "read EOF from hook?!");

			/* Write packet to stdout */
			if (asciiFlag)
				WriteAscii((u_char *) buf, rl);
			else if ((wl = write(outfd, buf, rl)) != rl) {
				if (wl < 0) {
					err(EX_OSERR, "write(stdout)");
				} else {
					errx(EX_OSERR,
					    "stdout: read %d, wrote %d",
					    rl, wl);
				}
			}
			/* Loopback */
			if (loopFlag) {
				if (NgSendData(dsock, NG_SOCK_HOOK_NAME, buf, rl) < 0)
					err(EX_OSERR, "write(hook)");
			}
		}

		/* Check data from stdin */
		if (FD_ISSET(infd, &rfds)) {
			char    buf[BUF_SIZE];
			int     rl;

			/* Read packet from stdin */
			if ((rl = read(infd, buf, sizeof(buf))) < 0)
				err(EX_OSERR, "read(stdin)");
			if (rl == 0)
				errx(EX_OSERR, "EOF(stdin)");

			/* Write packet to socket */
			if (NgSendData(dsock, NG_SOCK_HOOK_NAME, buf, rl) < 0)
				err(EX_OSERR, "write(hook)");
		}
	}
}