#include "control_common.h"
#include "graph.h"
#include "logger.h"
+#include "meta.h"
+#include "net.h"
+#include "netutl.h"
#include "protocol.h"
+#include "route.h"
+#include "splay_tree.h"
#include "utils.h"
#include "xalloc.h"
char controlcookie[65];
-extern char *controlcookiename;
+extern char *pidfilename;
static bool control_return(connection_t *c, int type, int error) {
return send_request(c, "%d %d %d", CONTROL, type, error);
case REQ_DUMP_TRAFFIC:
return dump_traffic(c);
+ case REQ_PCAP:
+ c->status.pcap = true;
+ pcap = true;
+ return true;
+
default:
return send_request(c, "%d %d", CONTROL, REQ_INVALID);
}
}
-bool init_control() {
+bool init_control(void) {
randomize(controlcookie, sizeof controlcookie / 2);
bin2hex(controlcookie, controlcookie, sizeof controlcookie / 2);
controlcookie[sizeof controlcookie - 1] = 0;
- FILE *f = fopen(controlcookiename, "w");
+ FILE *f = fopen(pidfilename, "w");
if(!f) {
- logger(LOG_ERR, "Cannot write control socket cookie file %s: %s", controlcookiename, strerror(errno));
+ logger(LOG_ERR, "Cannot write control socket cookie file %s: %s", pidfilename, strerror(errno));
return false;
}
#ifdef HAVE_FCHMOD
fchmod(fileno(f), 0600);
#else
- chmod(controlcookiename, 0600);
+ chmod(pidfilename, 0600);
#endif
+ // Get the address and port of the first listening socket
+
+ char *localhost = NULL;
+ sockaddr_t sa;
+ socklen_t len = sizeof sa;
+
+ if(getsockname(listen_socket[0].tcp, (struct sockaddr *)&sa, &len))
+ xasprintf(&localhost, "127.0.0.1 port %d", myport);
+ else
+ localhost = sockaddr2hostname(&sa);
+
+ fprintf(f, "%d %s %s\n", (int)getpid(), controlcookie, localhost);
- fprintf(f, "%s %s %d\n", controlcookie, myport, getpid());
+ free(localhost);
fclose(f);
return true;
}
-void exit_control() {
- unlink(controlcookiename);
+void exit_control(void) {
+ unlink(pidfilename);
}