static COMMAND(xmsg_connect) { if (session_connected_get(session)) { printq("already_connected", session_name(session)); return -1; } if (command_exec(NULL, session, "/session --lock", 0) == -1) return -1; if (xmsg_add_watch(session, session_uid_get(session)+XMSG_UID_DIROFFSET)) { print("conn_failed", format_find("xmsg_addwatch_failed"), session_name(session)); return -1; } session_status_set(session, EKG_STATUS_AVAIL); protocol_connected_emit(session); xmsg_iterate_dir(0, (void*) session); xmsg_timer_change(session, "rescan_timer"); return 0; }
static COMMAND(sniff_command_connect) { struct bpf_program fp; char errbuf[PCAP_ERRBUF_SIZE] = { 0 }; pcap_t *dev; const char *filter; char *device; char *tmp; filter = session_get(session, "filter"); if (session_connected_get(session)) { printq("already_connected", session_name(session)); return -1; } if (session->uid[6] != '/') { if ((tmp = xstrchr(session->uid+6, ':'))) device = xstrndup(session->uid+6, tmp-(session->uid+6)); else device = xstrdup(session->uid+6); dev = pcap_open_live(device, SNAPLEN, PROMISC, 1000, errbuf); } else { device = xstrdup(session->uid+6); dev = pcap_open_offline(device, errbuf); } if (!dev) { debug_error("Couldn't open dev: %s (%s)\n", device, errbuf); printq("conn_failed", errbuf, session_name(session)); xfree(device); return -1; } if (pcap_setnonblock(dev, 1, errbuf) == -1) { debug_error("Could not set device \"%s\" to non-blocking: %s\n", device, errbuf); pcap_close(dev); xfree(device); return -1; } xfree(device); if (filter && *filter) { if (pcap_compile(dev, &fp, (char *) filter, 0, 0 /*net*/) == -1) { debug_error("Couldn't parse filter %s: %s\n", filter, pcap_geterr(dev)); pcap_close(dev); return -1; } if (pcap_setfilter(dev, &fp) == -1) { debug_error("Couldn't install filter %s: %s\n", filter, pcap_geterr(dev)); pcap_close(dev); return -1; } /* pcap_freecode(&fp); */ } session->priv = dev; switch (pcap_datalink(dev)) { case DLT_LINUX_SLL: watch_add_session(session, pcap_fileno(dev), WATCH_READ, sniff_pcap_read_SLL); break; case DLT_EN10MB: watch_add_session(session, pcap_fileno(dev), WATCH_READ, sniff_pcap_read_EN10MB); break; default: debug_error("_connect() unk: %s\n", pcap_datalink_val_to_name(pcap_datalink(dev))); watch_add_session(session, pcap_fileno(dev), WATCH_READ, sniff_pcap_read); } session->status = EKG_STATUS_AVAIL; protocol_connected_emit(session); return 0; }