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; }
/* 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; }
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; }
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); }
/* * 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); }
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; }
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); }
/* * 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)"); } } }