Blackadder::Blackadder(bool user_space) { int ret; if (user_space) { #if HAVE_USE_NETLINK sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); #else sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0); #endif } else { #if HAVE_USE_NETLINK sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BADDER); #else sock_fd = -1; errno = EPFNOSUPPORT; /* XXX */ #endif } if (sock_fd < 0) { perror("socket"); } /* source netlink address */ memset(&s_nladdr, 0, sizeof (s_nladdr)); #if HAVE_USE_NETLINK s_nladdr.nl_family = AF_NETLINK; s_nladdr.nl_pad = 0; s_nladdr.nl_pid = getpid(); ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr)); #else s_nladdr.sun_len = sizeof (s_nladdr); s_nladdr.sun_family = PF_LOCAL; /* XXX: Probably shouldn't use getpid() here. */ ba_id2path(s_nladdr.sun_path, getpid()); if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT) perror("unlink"); ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr)); #endif if (ret < 0) { perror("bind"); exit(0); } /* destination netlink address */ memset(&d_nladdr, 0, sizeof (d_nladdr)); #if HAVE_USE_NETLINK d_nladdr.nl_family = AF_NETLINK; d_nladdr.nl_pad = 0; if (user_space) { d_nladdr.nl_pid = 9999; /* destined to user space blackadder */ } else { d_nladdr.nl_pid = 0; /* destined to kernel */ } #else d_nladdr.sun_len = sizeof (d_nladdr); d_nladdr.sun_family = PF_LOCAL; ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */ #endif }
NB_Blackadder::NB_Blackadder(bool user_space) { int ret; (void) signal(SIGINT, signal_handler); if (user_space) { cout << "NB_Blackadder Library: Initializing blackadder client for user space" << endl; #if HAVE_USE_NETLINK sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); #else sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0); #endif } else { cout << "NB_Blackadder Library: Initializing blackadder client for kernel space" << endl; #if HAVE_USE_NETLINK sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BADDER); #else sock_fd = -1; errno = EPFNOSUPPORT; /* XXX */ #endif } if (sock_fd < 0) { perror("NB_Blackadder Library: socket"); } else { cout << "NB_Blackadder Library: Created and opened netlink socket" << endl; } int x; x = fcntl(sock_fd, F_GETFL, 0); fcntl(sock_fd, F_SETFL, x | O_NONBLOCK); /* source address */ memset(&s_nladdr, 0, sizeof (s_nladdr)); #if HAVE_USE_NETLINK s_nladdr.nl_family = AF_NETLINK; s_nladdr.nl_pad = 0; s_nladdr.nl_pid = getpid(); ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr)); #else s_nladdr.sun_len = sizeof (s_nladdr); s_nladdr.sun_family = PF_LOCAL; /* XXX: Probably shouldn't use getpid() here. */ ba_id2path(s_nladdr.sun_path, getpid()); if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT) perror("unlink"); ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr)); #endif if (ret < 0) { perror("NB_Blackadder Library: bind"); } /* destination address */ memset(&d_nladdr, 0, sizeof (d_nladdr)); #if HAVE_USE_NETLINK d_nladdr.nl_family = AF_NETLINK; d_nladdr.nl_pad = 0; if (user_space) { d_nladdr.nl_pid = 9999; /* destined to user space blackadder */ } else { d_nladdr.nl_pid = 0; /* destined to kernel */ } #else d_nladdr.sun_len = sizeof (d_nladdr); d_nladdr.sun_family = PF_LOCAL; ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */ #endif /*initialize pipes*/ if (pipe(pipe_fds) != 0) { perror("pipe"); /* XXX: Should we raise an exception or something? */ } FD_ZERO(&read_set); FD_SET(sock_fd, &read_set); FD_SET(pipe_fds[0], &read_set); /*register default callback method*/ cf = &defaultCallback; pthread_mutex_init(&selector_mutex, NULL); pthread_mutex_init(&worker_mutex, NULL); pthread_cond_init(&queue_overflow_cond, NULL); pthread_cond_init(&worker_cond, NULL); pthread_create(&selector_thread, NULL, selector, NULL); pthread_create(&worker_thread, NULL, worker, NULL); }
blackadder::blackadder (bool user_space) { int ret; protocol = 0; if (user_space) { #if HAVE_USE_NETLINK sock_fd = socket (AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); #elif HAVE_USE_UNIX sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0); #else sock_fd = -1; errno = EPFNOSUPPORT; /* XXX */ #endif } else { #if HAVE_USE_NETLINK sock_fd = socket (AF_NETLINK, SOCK_RAW, NETLINK_BADDER); #else sock_fd = -1; errno = EPFNOSUPPORT; /* XXX */ #endif } if (sock_fd < 0) { perror ("socket"); } #ifdef __APPLE__ int bufsize = 229376; /* XXX */ setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof (bufsize)); setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof (bufsize)); #endif #ifdef __FreeBSD__ kq = kqueue(); if (kq < 0) { perror("kqueue"); } struct kevent kev; EV_SET(&kev, sock_fd, EVFILT_READ, EV_ADD | EV_CLEAR, 0x0, 0, NULL); if (kevent(kq, &kev, 1, NULL, 0, NULL)) { perror("kevent"); } #endif /* source netlink address */ memset (&s_nladdr, 0, sizeof(s_nladdr)); #if HAVE_USE_NETLINK s_nladdr.nl_family = AF_NETLINK; s_nladdr.nl_pad = 0; s_nladdr.nl_pid = getpid (); ret = bind (sock_fd, (struct sockaddr *) &s_nladdr, sizeof(s_nladdr)); #elif HAVE_USE_UNIX if (user_space) { #ifndef __linux__ s_nladdr.sun_len = sizeof (s_nladdr); #endif s_nladdr.sun_family = PF_LOCAL; /* XXX: Probably shouldn't use getpid() here. */ ba_id2path(s_nladdr.sun_path, getpid()); if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT) perror("unlink"); #ifdef __linux__ ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr)); #else ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr)); #endif } else { if (sock_fd > 0) ret = 0; else { ret = -1; errno = EBADF; } } #endif if (ret < 0) { perror ("bind"); exit (0); } /* destination netlink address */ memset (&d_nladdr, 0, sizeof(d_nladdr)); #if HAVE_USE_NETLINK d_nladdr.nl_family = AF_NETLINK; d_nladdr.nl_pad = 0; if (user_space) { d_nladdr.nl_pid = 9999; /* destined to user space blackadder */ } else { d_nladdr.nl_pid = 0; /* destined to kernel */ } #elif HAVE_USE_UNIX if (user_space) { #ifndef __linux__ d_nladdr.sun_len = sizeof (d_nladdr); #endif d_nladdr.sun_family = PF_LOCAL; ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */ } #endif }
NB_Blackadder::NB_Blackadder(bool user_space) { int ret; (void) signal(SIGINT, signal_handler); if (user_space) { //cout << "NB_Blackadder Library: Initializing blackadder client for user space" << endl; #if HAVE_USE_NETLINK sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); #elif HAVE_USE_UNIX sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0); #endif } else { //cout << "NB_Blackadder Library: Initializing blackadder client for kernel space" << endl; #if HAVE_USE_NETLINK sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BADDER); #elif __FreeBSD__ /* XXX */ sock_fd = socket(AF_BLACKADDER, SOCK_RAW, PROTO_BLACKADDER); #else sock_fd = -1; errno = EPFNOSUPPORT; /* XXX */ #endif } if (sock_fd < 0) { perror("NB_Blackadder Library: socket"); } else { //cout << "NB_Blackadder Library: Created and opened netlink socket" << endl; } int x; x = fcntl(sock_fd, F_GETFL, 0); fcntl(sock_fd, F_SETFL, x | O_NONBLOCK); #ifdef __APPLE__ int bufsize = 229376; /* XXX */ setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)); setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)); #endif /* source address */ memset(&s_nladdr, 0, sizeof (s_nladdr)); #if HAVE_USE_NETLINK s_nladdr.nl_family = AF_NETLINK; s_nladdr.nl_pad = 0; s_nladdr.nl_pid = getpid(); ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr)); #elif HAVE_USE_UNIX if (user_space) { # ifndef __linux__ s_nladdr.sun_len = sizeof (s_nladdr); # endif s_nladdr.sun_family = PF_LOCAL; /* XXX: Probably shouldn't use getpid() here. */ ba_id2path(s_nladdr.sun_path, getpid()); if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT) perror("unlink"); # ifdef __linux__ ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof(s_nladdr)); # else ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr)); # endif } else { if (sock_fd > 0) ret = 0; else { ret = -1; errno = EBADF; } } #endif if (ret < 0) { perror("NB_Blackadder Library: bind"); } /* destination address */ memset(&d_nladdr, 0, sizeof (d_nladdr)); #if HAVE_USE_NETLINK d_nladdr.nl_family = AF_NETLINK; d_nladdr.nl_pad = 0; if (user_space) { // Sebastian Robitzsch: TODO Decide on unified Blackadder PID, 9999 is // actually already taken! d_nladdr.nl_pid = 9999; /* destined to user space blackadder */ } else { d_nladdr.nl_pid = 0; /* destined to kernel */ } #elif HAVE_USE_UNIX if (user_space) { # ifndef __linux__ d_nladdr.sun_len = sizeof (d_nladdr); # endif d_nladdr.sun_family = PF_LOCAL; ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */ } #endif /*initialize pipes*/ if (pipe(pipe_fds) != 0) { perror("pipe"); /* XXX: Should we raise an exception or something? */ } FD_ZERO(&read_set); FD_SET(sock_fd, &read_set); FD_SET(pipe_fds[0], &read_set); /*register default callback method*/ cf = &defaultCallback; pthread_mutex_init(&selector_mutex, NULL); pthread_mutex_init(&worker_mutex, NULL); pthread_cond_init(&queue_overflow_cond, NULL); pthread_cond_init(&worker_cond, NULL); pthread_create(&selector_thread, NULL, selector, NULL); pthread_create(&worker_thread, NULL, worker, NULL); }