int intdhcrelay(char *ifname, int ifs, int argc, char **argv) { char *cmd[] = { DHCRELAY, "-i", ifname, NULL, '\0' }; char fname[SIZE_CONF_TEMP]; int set; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; argc--; argv++; if ((!set && argc > 1) || (set && argc != 1)) { printf("%% dhcrelay <relayserver>\n"); printf("%% no dhcrelay [relayserver]\n"); return(0); } cmd[3] = argv[0]; snprintf(fname, sizeof(fname), "/var/run/dhcrelay.%s", ifname); if (set) { flag_x(fname, X_ENABLE, argv[0]); cmdargs(DHCRELAY, cmd); } else { char server[24], argue[SIZE_CONF_TEMP]; char *killcmd[] = { PKILL, "-xf", NULL, '\0' }; if (conf_dhcrelay(ifname, server, sizeof(server)) == NULL) { if (errno == ENOENT) printf("%% No relay configured for %s\n", ifname); else printf("%% int_dhcrelay: conf_dhcrelay failed: %s\n", strerror(errno)); return(0); } /* if dhcrelay not relaying to specified dhcp server, bail out */ if (argc && strcmp(server, argv[0]) != 0) { printf("%% Server expected: %s (not %s)\n", server, argv[0]); return(0); } /* delete .enabled file */ flag_x(fname, X_DISABLE, NULL); /* setup argument list as one argument for pkill -xf */ snprintf(argue, sizeof(argue), "%s %s %s %s", cmd[0], cmd[1], cmd[2], server); killcmd[2] = argue; cmdargs(PKILL, killcmd); } return(0); }
/* * Handles variable inspection and changing from the console * * called by cmdexecstr when cmdargv(0) doesn't match a known * command. Returns true if the command was a variable reference that * was handled. (print or change) */ qbool cvariscmd(void) { Cvar *v; /* check variables */ v = look(cmdargv(0)); if(v == nil) return qfalse; /* perform a variable print or set */ if(cmdargc() == 1){ printcvar(v); return qtrue; } /* set the value if forcing isn't required */ cvarsetstr2(v->name, cmdargs(), qfalse); return qtrue; }
int main( int argc, char **argv ) { bool help( false ); std::int64_t sim_count( 100000 ); CmdArgs cmdargs( argv[ 0 ] /** prog name **/, std::cout /** std stream **/, std::cerr /** err stream **/); cmdargs.addOption( new Option< bool >( help, "-h", "print this menu and exit" ) ); cmdargs.addOption( new Option< std::int64_t >( sim_count, "-count", "number of simulation iterations" ) ); cmdargs.processArgs( argc, argv ); if( help ) { cmdargs.printArgs(); exit( EXIT_SUCCESS ); } using sim_t = double; using sim = pisim< sim_t >; using print = raft::print< sim_t, '\n' >; using gen = raft::random_variate< std::mt19937_64, std::uniform_real_distribution, sim_t >; gen rngen_a( sim_count ), rngen_b( sim_count ); sim s; print p( std::cout ); raft::map m; m += rngen_a >> s[ "x" ]; m += rngen_b >> s[ "y" ]; m += s >> p; m.exe(); return( EXIT_SUCCESS ); }
int intip(char *ifname, int ifs, int argc, char **argv) { int set, alias, flags, argcmax; ip_t ip; struct in_addr destbcast; struct ifaliasreq addreq, ridreq; struct sockaddr_in *sin; char *msg, *cmdname; memset(&addreq, 0, sizeof(addreq)); memset(&ridreq, 0, sizeof(ridreq)); if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; /* * We use this function for ip and alias setup since they are * the same thing. */ if (isprefix(argv[0], "alias")) { alias = 1; cmdname = "alias"; } else if (isprefix(argv[0], "ip")) { alias = 0; cmdname = "ip"; } else { printf("%% intip: Internal error\n"); return 0; } argc--; argv++; flags = get_ifflags(ifname, ifs); if (flags & IFF_POINTOPOINT) { argcmax = 2; msg = "destination"; } else if (flags & IFF_BROADCAST) { argcmax = 2; msg = "broadcast"; } else { argcmax = 1; msg = NULL; } if (argc < 1 || argc > argcmax) { printf("%% %s <address>/<bits> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% %s <address>/<netmask> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% no %s <address>[/bits]\n", cmdname); printf("%% no %s <address>[/netmask]\n", cmdname); return(0); } /* ignore 'address' keyword, don't print error */ if (isprefix(argv[0], "address")) { argc--; argv++; } if (isprefix(argv[0], "dhcp")) { char *args[] = { PKILL, "dhclient", ifname, '\0' }; char leasefile[sizeof(LEASEPREFIX)+1+IFNAMSIZ]; if (set) cmdarg(DHCLIENT, ifname); else { cmdargs(PKILL, args); snprintf(leasefile, sizeof(leasefile), "%s.%s", LEASEPREFIX, ifname); rmtemp(leasefile); } return(0); } ip = parse_ip(argv[0], NO_NETMASK); if (ip.family == 0) /* bad IP specified */ return(0); if (ip.bitlen == -1) { printf("%% Netmask not specified\n"); return(0); } if (argc == 2) if (!inet_aton(argv[1], &destbcast)) { printf("%% Invalid %s address\n", msg); return(0); } strlcpy(addreq.ifra_name, ifname, sizeof(addreq.ifra_name)); strlcpy(ridreq.ifra_name, ifname, sizeof(ridreq.ifra_name)); if (!set) { sin = (struct sockaddr_in *)&ridreq.ifra_addr; sin->sin_len = sizeof(ridreq.ifra_addr); sin->sin_family = AF_INET; sin->sin_addr.s_addr = ip.addr.sin.s_addr; } if (!alias || !set) { /* * Here we remove the top IP on the interface before we * might add another one, or we delete the specified IP. */ if (ioctl(ifs, SIOCDIFADDR, &ridreq) < 0) if (!set) printf("%% intip: SIOCDIFADDR: %s\n", strerror(errno)); } if (set) { sin = (struct sockaddr_in *)&addreq.ifra_addr; sin->sin_family = AF_INET; sin->sin_len = sizeof(addreq.ifra_addr); sin->sin_addr.s_addr = ip.addr.sin.s_addr; sin = (struct sockaddr_in *)&addreq.ifra_mask; sin->sin_family = AF_INET; sin->sin_len = sizeof(addreq.ifra_mask); sin->sin_addr.s_addr = htonl(0xffffffff << (32 - ip.bitlen)); if (argc == 2) { sin = (struct sockaddr_in *)&addreq.ifra_dstaddr; sin->sin_family = AF_INET; sin->sin_len = sizeof(addreq.ifra_dstaddr); sin->sin_addr.s_addr = destbcast.s_addr; } if (ioctl(ifs, SIOCAIFADDR, &addreq) < 0) printf("%% intip: SIOCAIFADDR: %s\n", strerror(errno)); } return(0); }
int intip(char *ifname, int ifs, int argc, char **argv) { int s, set, flags, argcmax; char *msg, *cmdname; ip_t ip; /* ipv4 structures */ struct in_addr in4dest; struct ifaliasreq ip4req; /* ipv6 structures */ struct in6_addr in6dest; struct in6_aliasreq ip6req; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; /* * We use this function for ip and alias setup since they are * the same thing. */ if (isprefix(argv[0], "alias")) { cmdname = "alias"; } else if (isprefix(argv[0], "ip")) { cmdname = "ip"; } else { printf("%% intip: Internal error\n"); return 0; } argc--; argv++; flags = get_ifflags(ifname, ifs); if (flags & IFF_POINTOPOINT) { argcmax = 2; msg = "destination"; } else if (flags & IFF_BROADCAST) { argcmax = 2; msg = "broadcast"; } else { argcmax = 1; msg = NULL; } if (argc < 1 || argc > argcmax) { printf("%% %s <address>/<bits> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% %s <address>/<netmask> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% no %s <address>[/bits]\n", cmdname); printf("%% no %s <address>[/netmask]\n", cmdname); return(0); } /* ignore 'address' keyword, don't print error */ if (isprefix(argv[0], "address")) { argc--; argv++; } if (isprefix(argv[0], "dhcp")) { char *args[] = { PKILL, "dhclient", ifname, '\0' }; char *args_set[] = { DHCLIENT, ifname, '\0' }; char leasefile[sizeof(LEASEPREFIX)+1+IFNAMSIZ]; if (set) cmdargs(DHCLIENT, args_set); else { cmdargs(PKILL, args); snprintf(leasefile, sizeof(leasefile), "%s.%s", LEASEPREFIX, ifname); rmtemp(leasefile); } return(0); } memset(&ip, 0, sizeof(ip)); parse_ip_pfx(argv[0], NO_NETMASK, &ip); if (ip.family == 0) /* bad IP specified */ return(0); if (set && !(flags & IFF_POINTOPOINT) && ip.bitlen == -1) { printf("%% Netmask not specified\n"); return(0); } if (ip.bitlen == -1) { /* * No netmask specified, set the field at 0. * The kernel mostly ignores netmask for PTP interfaces, * but won't allow anything less than a /128 for an IPv6 * PTP interface. */ if (!(flags & IFF_POINTOPOINT)) ip.bitlen = 0; else if (ip.family == AF_INET) ip.bitlen = 32; else if (ip.family == AF_INET6) ip.bitlen = 128; } switch(ip.family) { case AF_INET: memset(&in4dest, 0, sizeof(in4dest)); if (argc == 2 && !inet_pton(AF_INET, argv[1], &in4dest)) { printf("%% Invalid %s address\n", msg); return(0); } memset(&ip4req, 0, sizeof(ip4req)); pack_ifaliasreq(&ip4req, &ip, &in4dest, ifname); /* do it */ if (ioctl(ifs, set ? SIOCAIFADDR : SIOCDIFADDR, &ip4req) < 0) printf("%% intip: SIOC%sIFADDR: %s\n", set ? "A" : "D", strerror(errno)); break; case AF_INET6: memset(&in6dest, 0, sizeof(in6dest)); if (argc == 2 && parse_ipv6(argv[1], &in6dest) != 0) { printf("%% Invalid destination address %s\n", argv[1]); return(0); } memset(&ip6req, 0, sizeof(ip6req)); pack_in6aliasreq(&ip6req, &ip, &in6dest, ifname); /* get inet6 socket */ s = socket(PF_INET6, SOCK_DGRAM, 0); if (s < 0) { printf("%% socket failed: %s\n", strerror(errno)); return(0); } /* turn on inet6 */ addaf(ifname, AF_INET6, ifs); /* do it */ if (ioctl(s, set ? SIOCAIFADDR_IN6 : SIOCDIFADDR_IN6, &ip6req) < 0) { if (!set && errno == EADDRNOTAVAIL) printf("%% IP address not found on %s\n", ifname); else printf("%% intip: SIOC%sIFADDR_IN6: %s\n", set ? "A" : "D", strerror(errno)); } else { ipv6ll_db_store( (struct sockaddr_in6 *)&ip6req.ifra_addr, (struct sockaddr_in6 *)&ip6req.ifra_prefixmask, set ? DB_X_ENABLE : DB_X_REMOVE, ifname); } close(s); break; default: printf("%% unknown address family: %d\n", ip.family); break; } return(0); }
int intrtd(char *ifname, int ifs, int argc, char **argv) { StringList *dbreturn; char *cmdpath, *cmdname; int set; if (NO_ARG(argv[0])) { argv++; argc--; set = 0; } else set = 1; if (isprefix(argv[0], "rtadvd")) { cmdname = "rtadvd"; cmdpath = RTADVD; } else { printf("%% intrtd: Internal error\n"); return 0; } if (argc > 1) { printf ("%% %s\n", cmdname); printf ("%% no %s\n", cmdname); return(0); } dbreturn = sl_init(); if (db_select_flag_x_ctl(dbreturn, cmdname, ifname) < 0) { printf("%% database failure select flag x ctl\n"); sl_free(dbreturn, 1); return(1); } if (dbreturn->sl_cur > 0) { /* already found in db for ifname */ if (!set) { if (db_delete_flag_x_ctl(cmdname, ifname) < 0) printf("%% database delete failure\n"); } else { printf("%% %s already running\n", cmdname); } if (!set && strcmp(cmdname, "rtadvd") == 0) { char *args[] = { PKILL, cmdpath, "-c", "/var/run/rtadvd.0", ifname, '\0' }; cmdargs(PKILL, args); } } else { /* not found in db for ifname */ if (set) { if(db_insert_flag_x(cmdname, ifname, 0, DB_X_ENABLE, NULL) < 0) { printf("%% database insert failure\n"); sl_free(dbreturn, 1); return(1); } } else { printf("%% %s not running\n", cmdname); } if (set && strcmp(cmdname, "rtadvd") == 0) { char *args[] = { cmdpath, "-c", "/var/run/rtadvd.0", ifname, '\0' }; cmdargs(cmdpath, args); } } sl_free(dbreturn, 1); return(0); }
int intdhcrelay(char *ifname, int ifs, int argc, char **argv) { char *cmd[] = { DHCRELAY, "-i", ifname, NULL, '\0' }; int set, alen; struct in_addr notused; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; argc--; argv++; if ((!set && argc > 1) || (set && argc != 1)) { printf("%% dhcrelay <relayserver>\n"); printf("%% no dhcrelay [relayserver]\n"); return(0); } if (inet_pton(AF_INET, argv[0], ¬used)) { cmd[3] = argv[0]; } else { printf("%% Not a valid IPv4 address: %s\n", argv[0]); return 0; } if (set) { flag_x("dhcrelay", ifname, DB_X_ENABLE, argv[0]); cmdargs(DHCRELAY, cmd); } else { char server[24], argue[SIZE_CONF_TEMP]; char *killcmd[] = { PKILL, "-xf", NULL, '\0' }; if ((alen = conf_dhcrelay(ifname, server, sizeof(server))) < 1) { if (alen == 0) printf("%% No relay configured for %s\n", ifname); else printf("%% int_dhcrelay: conf_dhcrelay failed:" " %d\n", alen); return(0); } /* bail if dhcrelay not relaying to specified dhcp server */ if (argc && strcmp(server, argv[0]) != 0) { printf("%% Server expected: %s (not %s)\n", server, argv[0]); return(0); } flag_x("dhcrelay", ifname, DB_X_REMOVE, NULL); /* setup argument list as one argument for pkill -xf */ snprintf(argue, sizeof(argue), "%s %s %s %s", cmd[0], cmd[1], cmd[2], server); killcmd[3] = argue; cmdargs(PKILL, killcmd); } return(0); }
int mtnexec_fork(MTNSVR *svr, ARG arg) { int f; int pp[3][2]; MTNJOB *job; struct epoll_event ev; if(!(job = mtnexec_wait())){ return(-1); } mtnexec_initjob(job, arg); job->svr = svr; job->argc = cmdargs(job); job->cmd = joinarg(job->argc, " "); job->std = stdname(job); job->echo = (ctx->echo) ? convarg(newstr(ctx->echo), job) : NULL; job->putarg = cpconvarg(ctx->putarg, ctx->conv ? job : NULL); job->getarg = cpconvarg(ctx->getarg, ctx->conv ? job : NULL); if(is_empty(job->cmd)){ jclose(job); return(-1); } if(ctx->dryrun){ mtnexec_dryrun(job); jclose(job); return(0); } if(ctx->verbose){ mtnexec_verbose(job); } pipe(pp[0]); pipe(pp[1]); pipe(pp[2]); gettimeofday(&(job->start), NULL); job->pid = fork(); if(job->pid == -1){ job->pid = 0; close(pp[0][0]); close(pp[0][1]); close(pp[1][0]); close(pp[1][1]); close(pp[2][0]); close(pp[2][1]); mtnlogger(mtn, 0, "[error] %s: %s\n", __func__, strerror(errno)); return(-1); } if(job->pid){ close(pp[0][1]); close(pp[1][1]); close(pp[2][1]); job->ctl = pp[0][0]; job->out = pp[1][0]; job->err = pp[2][0]; job->cct = 1; job->pstat = calloc(1, sizeof(MTNPROCSTAT)); job->pstat[0].pid = job->pid; fcntl(job->ctl, F_SETFD, FD_CLOEXEC); fcntl(job->out, F_SETFD, FD_CLOEXEC); fcntl(job->err, F_SETFD, FD_CLOEXEC); fcntl(job->out, F_SETFL, O_NONBLOCK); fcntl(job->err, F_SETFL, O_NONBLOCK); ev.data.ptr = job; ev.events = EPOLLIN; if(epoll_ctl(ctx->efd, EPOLL_CTL_ADD, job->out, &ev) == -1){ mtnlogger(mtn, 0, "[error] %s: epoll_ctl %s stdout fd=%d\n", __func__, strerror(errno), job->out); } if(epoll_ctl(ctx->efd, EPOLL_CTL_ADD, job->err, &ev) == -1){ mtnlogger(mtn, 0, "[error] %s: epoll_ctl %s stderr fd=%d\n", __func__, strerror(errno), job->err); } char d; while(read(job->ctl,&d,1)); close(job->ctl); job->ctl = 0; return(0); } //===== execute process ===== setpgid(0,0); close(pp[0][0]); close(pp[1][0]); close(pp[2][0]); if(strlen(job->std[0])){ f = open(job->std[0], O_RDONLY); if(f == -1){ mtnlogger(mtn, 0, "[error] %s: %s %s\n", __func__, strerror(errno), job->std[0]); _exit(1); } close(0); dup2(f, 0); close(f); } if(strlen(job->std[1])){ f = open(job->std[1], O_WRONLY | O_TRUNC | O_CREAT, 0660); if(f == -1){ mtnlogger(mtn, 0, "[error] %s: %s %s\n", __func__, strerror(errno), job->std[1]); _exit(1); } close(1); if(dup2(f, 1) == -1){ mtnlogger(mtn, 0, "[error] %s: %s\n", __func__, strerror(errno)); _exit(1); } close(f); }else{ close(1); dup2(pp[1][1], 1); } if(strlen(job->std[2])){ f = open(job->std[2], O_WRONLY | O_TRUNC | O_CREAT, 0660); if(f == -1){ mtnlogger(mtn, 0, "[error] %s: %s %s\n", __func__, strerror(errno), job->std[2]); _exit(1); } close(2); dup2(f, 2); close(f); }else{ close(2); dup2(pp[2][1], 2); } close(pp[1][1]); close(pp[2][1]); job->ctl = pp[0][1]; if(job->svr){ /*===== remote execute process =====*/ mtn_exec(mtn, job); mtnlogger(mtn, 0, "[error] %s: host=%s addr=%s %s '%s'\n", __func__, job->svr->host, inet_ntoa(job->svr->addr.addr.in.sin_addr), strerror(errno), job->cmd); }else{ /*===== local exec process =====*/ close(job->ctl); job->ctl = 0; execl("/bin/sh", "/bin/sh", "-c", job->cmd, NULL); mtnlogger(mtn, 0, "[error] %s: %s '%s'\n", __func__, strerror(errno), job->cmd); } _exit(127); }
int main( int argc, char **argv ) { const static auto chunksize( 65536 ); using chunk_t = raft::filechunk< chunksize >; using fr_t = raft::filereader< chunk_t, false >; using fw_t = filewrite< chunk_t >; using comp = compress< chunk_t >; /** variables to set below **/ bool help( false ); int blocksize ( 9 ); int verbosity ( 0 ); int workfactor( 250 ); std::string inputfile( "" ); std::string outputfile( "" ); std::int64_t num_threads( 1 ); CmdArgs cmdargs( argv[ 0 ] /** prog name **/, std::cout /** std stream **/, std::cerr /** err stream **/ ); /** set options **/ cmdargs.addOption( new Option< bool >( help, "-h", "print this message" ) ); cmdargs.addOption( new Option< int >( blocksize, "-b", "set block size to 100k .. 900k" ) ); cmdargs.addOption( new Option< int >( workfactor, "-e", "effort" ) ); cmdargs.addOption( new Option< std::string >( inputfile, "-i", "input file", true /** required **/ ) ); cmdargs.addOption( new Option< std::string >( outputfile, "-o", "output file", true /** required **/ ) ); cmdargs.addOption( new Option< std::int64_t >( num_threads, "-th", "number of worker threads" ) ); /** process args **/ cmdargs.processArgs( argc, argv ); if( help || ! cmdargs.allMandatorySet() ) { cmdargs.printArgs(); exit( EXIT_SUCCESS ); } /** declare kernels **/ fr_t reader( inputfile, num_threads /** manually set threads for b-marking **/ ); fw_t writer( outputfile, num_threads /** manually set threads for b-marking **/ ); comp c( blocksize, verbosity, workfactor ); /** set-up map **/ raft::map m; /** * detect # output ports from reader, * duplicate c that #, assign each * output port to the input ports in * writer */ m += reader <= c >= writer; m.exe(); return( EXIT_SUCCESS ); }