static int argv_join(char *dst, int dst_sz, char **argv, const char *delimiter) { if (argv[0]) { int r = snprintf(dst, dst_sz, "%s%s", delimiter, argv[0]); if (r < 0 || r >= dst_sz) { return dst_sz - 1; } else { return r + argv_join(dst + r, dst_sz - r, &argv[1], delimiter); } } else { if (dst_sz > 0) dst[0] = '\0'; return 0; } }
void Parrot_debug(struct Parrot_Interp *interpreter, int argc, char ** argv) { PDB_t *pdb; const char *command; pdb = (PDB_t *)mem_sys_allocate_zeroed(sizeof(PDB_t)); interpreter->pdb = pdb; pdb->cur_opcode = interpreter->code->byte_code; /* Parrot_setup_argv(interpreter, argc, argv); */ PDB_init(interpreter, argv_join(argv)); PDB_disassemble(interpreter,NULL); while (!(pdb->state & PDB_EXIT)) { PDB_get_command(interpreter); command = pdb->cur_command; PDB_run_command(interpreter, command); } }
int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s command [arguments ...]\n", argv[0]); exit(EXIT_FAILURE); } struct trace *trace = trace_new(process_new, NULL); int pid = trace_execvp(trace, &argv[1]); char buf[1024]; argv_join(buf, sizeof(buf), &argv[1], " "); fprintf(stderr, "[+] pid=%i, running: %s\n", pid, buf); while (trace_process_count(trace) > 0) { trace_read(trace); } trace_free(trace); return 0; }
int main(int argc, char **argv) { char *dev, *capfile, *bpf_prog; extern char *optarg; extern int optind; extern char *__progname; int ch, dontfork_flag, r; pcap_t *pcap = NULL; struct sockaddr_storage dest, src; socklen_t destlen, srclen; #ifdef NF9 int opt =0; #endif bpf_prog = NULL; dev = capfile = NULL; dontfork_flag = 0; memset(&dest, '\0', sizeof(dest)); memset(&src, '\0', sizeof(src)); destlen = 0; srclen = 0; #ifdef NF9 while ((ch = getopt(argc, argv, "hdDi:n:r:S:s:v:m:p:e:")) != -1) { #else while ((ch = getopt(argc, argv, "hdDi:n:r:S:v:")) != -1) { #endif /*NF9*/ switch (ch) { case 'h': usage(); return (0); case 'S': if (strcasecmp(optarg, "any") == 0) { direction = 0; break; } if (strcasecmp(optarg, "in") == 0) { direction = PF_IN; break; } if (strcasecmp(optarg, "out") == 0) { direction = PF_OUT; break; } usage(); return (0); case 'D': verbose_flag = 1; /* FALLTHROUGH */ case 'd': dontfork_flag = 1; break; case 'i': if (capfile != NULL || dev != NULL) { fprintf(stderr, "Packet source already specified.\n\n"); usage(); exit(1); } dev = optarg; break; case 'n': /* Will exit on failure */ destlen = sizeof(dest); parse_hostport(optarg, (struct sockaddr *)&dest, &destlen); break; case 'r': if (capfile != NULL || dev != NULL) { fprintf(stderr, "Packet source already specified.\n\n"); usage(); exit(1); } capfile = optarg; dontfork_flag = 1; break; case 's': /* Will exit on failure */ srclen = sizeof(src); parse_host(optarg, (struct sockaddr *)&src, &srclen); break; case 'v': switch((export_version = atoi(optarg))) { case 1: case 5: #ifdef NF9 case NF9_VERSION: #endif /*NF9*/ break; default: fprintf(stderr, "Invalid NetFlow version\n"); exit(1); } break; #ifdef NF9 case 'm': { opt= atoi(optarg); if(opt>=0) refresh_minutes_interval=opt; } break; case 'p': { opt= atoi(optarg); if(opt>0) refresh_packets_interval=opt; } break; case 'e': source_id = atoi(optarg); break; #endif /*NF9*/ default: fprintf(stderr, "Invalid commandline option.\n"); usage(); exit(1); } } if (capfile == NULL && dev == NULL) dev = DEFAULT_INTERFACE; /* join remaining arguments (if any) into bpf program */ bpf_prog = argv_join(argc - optind, argv + optind); /* Will exit on failure */ setup_packet_capture(&pcap, dev, capfile, bpf_prog); /* Netflow send socket */ if (dest.ss_family != 0 && src.ss_family != 0) netflow_socket = connsock_bind((struct sockaddr *)&dest, destlen, (struct sockaddr *)&src, srclen); else if (dest.ss_family != 0) netflow_socket = connsock((struct sockaddr *)&dest, destlen); else { fprintf(stderr, "No export target defined\n"); if (!verbose_flag) exit(1); } if (dontfork_flag) { if (!verbose_flag) drop_privs(); openlog(__progname, LOG_PID|LOG_PERROR, LOG_DAEMON); } else { daemon(0, 0); openlog(__progname, LOG_PID, LOG_DAEMON); if (pidfile(NULL) == -1) { syslog(LOG_WARNING, "Couldn't write pidfile: %s", strerror(errno)); } /* Close and reopen syslog to pickup chrooted /dev/log */ closelog(); openlog(__progname, LOG_PID, LOG_DAEMON); drop_privs(); signal(SIGINT, sighand_exit); signal(SIGTERM, sighand_exit); } if (dev != NULL) syslog(LOG_NOTICE, "%s listening on %s", __progname, dev); /* Main processing loop */ gettimeofday(&start_time, NULL); r = pcap_loop(pcap, -1, packet_cb, NULL); if (r == -1) { syslog(LOG_ERR, "pcap_dispatch: %s", pcap_geterr(pcap)); exit(1); } if (r == 0 && capfile == NULL) syslog(LOG_NOTICE, "Exiting on pcap EOF"); exit(0); }