Lines Matching +full:uni +full:- +full:directional
2 * dnstap/unbound-dnstap-socket.c - debug program that listens for DNSTAP logs.
66 #include <protobuf-c/protobuf-c.h>
67 #include "dnstap/dnstap.pb-c.h"
80 printf("-u <socketpath> listen to unix socket with this file name\n");
81 printf("-s <serverip[@port]> listen for TCP on the IP and port\n");
82 printf("-t <serverip[@port]> listen for TLS on IP and port\n");
83 printf("-x <server.key> server key file for TLS service\n");
84 printf("-y <server.pem> server cert file for TLS service\n");
85 printf("-z <verify.pem> cert file to verify client connections\n");
86 printf("-l long format for DNS printout\n");
87 printf("-v more verbose log output\n");
88 printf("-c internal unit test and exit\n");
89 printf("-h this help text\n");
134 /** are we bi-directional (if false, uni-directional) */
182 log_assert(!list->d);
183 if(!list->next) /* we are the last, we can't remove ourselves */
185 list = list->next;
187 if(list->d) /* a tail entry still has data; return */
189 list = list->next;
192 list = current->next;
194 current->next = NULL;
197 list = list->next;
207 if(data->ev) {
208 ub_event_del(data->ev);
209 ub_event_free(data->ev);
212 SSL_free(data->ssl);
214 sock_close(data->fd);
215 free(data->id);
216 free(data->frame);
217 if(data->data_list) {
218 data->data_list->d = NULL;
220 tap_data_list_try_to_free_tail(data->data_list);
233 entry->next = *liststart;
234 entry->d = d;
235 d->data_list = entry;
245 next = e->next;
246 if(e->d) {
247 tap_data_free(e->d, 0);
248 e->d = NULL;
259 if(!s->ev) return;
260 if(!s->ev_added) return;
261 ub_event_del(s->ev);
262 s->ev_added = 0;
269 if(s->fd == -1) return;
270 sock_close(s->fd);
271 s->fd = -1;
279 SSL_CTX_free(s->sslctx);
281 tap_data_list_delete(s->data_list);
282 ub_event_free(s->ev);
283 free(s->socketpath);
284 free(s->ip);
288 /** create new socket (unconnected, not base-added), or NULL malloc fail */
297 s->socketpath = strdup(socketpath);
298 if(!s->socketpath) {
303 s->fd = -1;
304 s->ev_cb = ev_cb;
305 s->data = data;
309 /** create new socket (unconnected, not base-added), or NULL malloc fail */
318 s->ip = strdup(ip);
319 if(!s->ip) {
324 s->fd = -1;
325 s->ev_cb = ev_cb;
326 s->data = data;
330 /** create new socket (unconnected, not base-added), or NULL malloc fail */
340 s->ip = strdup(ip);
341 if(!s->ip) {
346 s->fd = -1;
347 s->ev_cb = ev_cb;
348 s->data = data;
349 s->sslctx = listen_sslctx_create(server_key, server_cert, verifypem,
351 if(!s->sslctx) {
353 free(s->ip);
374 return -1;
377 if((s = socket(addr.ss_family, SOCK_STREAM, 0)) == -1) {
379 return -1;
387 return -1;
394 return -1;
398 return -1;
400 if(listen(s, LISTEN_BACKLOG) == -1) {
403 return -1;
411 if(s->socketpath) {
413 s->fd = create_local_accept_sock(s->socketpath, NULL, 0);
414 if(s->fd == -1) {
418 } else if(s->ip || s->sslctx) {
420 s->fd = make_tcp_accept(s->ip);
421 if(s->fd == -1) {
426 s->ev = ub_event_new(base, s->fd, UB_EV_READ | UB_EV_PERSIST,
427 s->ev_cb, s);
428 if(!s->ev) {
432 if(ub_event_add(s->ev, NULL) != 0) {
436 s->ev_added = 1;
448 entry->next = *liststart;
449 entry->s = s;
459 next = e->next;
460 tap_socket_delev(e->s);
461 tap_socket_close(e->s);
462 tap_socket_delete(e->s);
473 for(entry = list; entry; entry = entry->next) {
474 if(!tap_socket_setup(entry->s, base)) {
549 if(sldns_wire2str_rrquestion_buf(message.data+12, message.len-12,
553 if(buf[0] != 0) buf[strlen(buf)-1]=0;
623 if(d->base.descriptor != &dnstap__dnstap__descriptor) {
628 if(d->type != DNSTAP__DNSTAP__TYPE__MESSAGE) {
633 if(d->message) {
634 mtype = mtype_to_str(d->message->type);
635 if(d->message->has_query_address)
636 maddr = str_of_addr(d->message->query_address);
637 else if(d->message->has_response_address)
638 maddr = str_of_addr(d->message->response_address);
639 if(d->message->has_query_message)
640 qinf = q_of_msg(d->message->query_message);
641 else if(d->message->has_response_message)
642 qinf = q_of_msg(d->message->response_message);
655 if(d->has_identity) {
656 id=possible_str(d->identity);
658 if(d->has_version) {
659 vs=possible_str(d->version);
667 if(d->message && d->message->has_query_message &&
668 d->message->query_message.data) {
670 d->message->query_message.data,
671 d->message->query_message.len);
677 if(d->message && d->message->has_query_time_sec) {
678 char* qtv = tv_to_str(d->message->has_query_time_sec,
679 d->message->query_time_sec,
680 d->message->has_query_time_nsec,
681 d->message->query_time_nsec);
687 if(d->message && d->message->has_response_message &&
688 d->message->response_message.data) {
690 d->message->response_message.data,
691 d->message->response_message.len);
697 if(d->message && d->message->has_response_time_sec) {
698 char* rtv = tv_to_str(d->message->has_response_time_sec,
699 d->message->response_time_sec,
700 d->message->has_response_time_nsec,
701 d->message->response_time_nsec);
714 * returns 0: closed/error, -1: continue, >0 number of bytes */
722 (data->id?data->id:""));
724 } else if(ret == -1) {
728 return -1;
731 return -1;
733 ub_winsock_tcp_wouldblock(data->ev, UB_EV_READ);
734 return -1;
739 (data->id?data->id:""));
750 ub_event_del(data->ev);
751 ub_event_del_bits(data->ev, UB_EV_READ);
752 ub_event_add_bits(data->ev, UB_EV_WRITE);
753 if(ub_event_add(data->ev, NULL) != 0)
755 data->ssl_brief_write = 1;
764 ub_event_del(data->ev);
765 ub_event_del_bits(data->ev, UB_EV_WRITE);
766 ub_event_add_bits(data->ev, UB_EV_READ);
767 if(ub_event_add(data->ev, NULL) != 0)
769 data->ssl_brief_write = 0;
775 * returns 0: closed/error, -1: continue, >0 number of bytes */
780 r = SSL_read(data->ssl, buf, len);
782 int want = SSL_get_error(data->ssl, r);
786 (data->id?data->id:""));
790 return -1;
794 return -1;
804 (data->id?data->id:""));
809 (data->id?data->id:""));
817 * returns 0: closed/error, -1: continue, >0 number of bytes */
821 if(data->ssl)
824 return receive_bytes(data, data->fd, buf, len);
841 fd_set_block(data->fd);
842 if(data->ssl) {
845 if((r=SSL_write(data->ssl, acceptframe, len)) <= 0) {
847 if((r2=SSL_get_error(data->ssl, r)) == SSL_ERROR_ZERO_RETURN)
851 fd_set_nonblock(data->fd);
857 if(send(data->fd, acceptframe, len, 0) == -1) {
859 fd_set_nonblock(data->fd);
864 if(verbosity) log_info("sent control frame(accept) content-type:(%s)",
867 fd_set_nonblock(data->fd);
889 fd_set_block(data->fd);
890 if(data->ssl) {
893 if((r=SSL_write(data->ssl, finishframe, len)) <= 0) {
895 if((r2=SSL_get_error(data->ssl, r)) == SSL_ERROR_ZERO_RETURN)
899 fd_set_nonblock(data->fd);
905 if(send(data->fd, finishframe, len, 0) == -1) {
907 fd_set_nonblock(data->fd);
914 fd_set_nonblock(data->fd);
928 if((SSL_get_verify_mode(data->ssl)&SSL_VERIFY_PEER)) {
930 if(SSL_get_verify_result(data->ssl) == X509_V_OK) {
932 X509* x = SSL_get1_peer_certificate(data->ssl);
934 X509* x = SSL_get_peer_certificate(data->ssl);
938 " failed no certificate", data->id);
944 if(SSL_get0_peername(data->ssl)) {
946 "to %s authenticated", data->id,
947 SSL_get0_peername(data->ssl));
951 "authenticated", data->id);
958 X509* x = SSL_get1_peer_certificate(data->ssl);
960 X509* x = SSL_get_peer_certificate(data->ssl);
968 "failed to authenticate", data->id);
974 if(verbosity) log_info("SSL connection %s", data->id);
985 if(data->ssl_brief_write) {
989 if(data->ssl_handshake_done)
993 r = SSL_do_handshake(data->ssl);
995 int want = SSL_get_error(data->ssl, r);
1029 "from %s", data->id);
1036 data->ssl_handshake_done = 1;
1052 if(data->ssl && (!data->ssl_handshake_done ||
1053 data->ssl_brief_write)) {
1058 while(data->len_done < 4) {
1059 uint32_t l = (uint32_t)data->len;
1061 ((uint8_t*)&l)+data->len_done, 4-data->len_done);
1067 } else if(ret == -1) {
1071 data->len_done += ret;
1072 data->len = (size_t)l;
1073 if(data->len_done < 4)
1075 data->len = (size_t)(ntohl(l));
1076 if(verbosity>=3) log_info("length is %d", (int)data->len);
1077 if(data->len == 0) {
1079 data->control_frame = 1;
1081 data->len_done = 0;
1084 data->frame = calloc(1, data->len);
1085 if(!data->frame) {
1094 if(data->data_done < data->len) {
1095 ssize_t r = tap_receive(data, data->frame + data->data_done,
1096 data->len - data->data_done);
1102 } else if(r == -1) {
1106 data->data_done += r;
1107 if(data->data_done < data->len)
1113 (data->control_frame?"control ":""), (int)data->len);
1115 if(data->control_frame)
1116 log_control_frame(data->frame, data->len);
1117 else log_data_frame(data->frame, data->len);
1120 if(data->len >= 4 && sldns_read_uint32(data->frame) ==
1122 data->is_bidirectional = 1;
1128 } else if(data->len >= 4 && sldns_read_uint32(data->frame) ==
1129 FSTRM_CONTROL_FRAME_STOP && data->is_bidirectional) {
1137 free(data->frame);
1138 data->frame = NULL;
1139 data->control_frame = 0;
1140 data->len = 0;
1141 data->len_done = 0;
1142 data->data_done = 0;
1150 tap_sock->data;
1158 if(s == -1) {
1178 ub_winsock_tcp_wouldblock(maindata->ev, UB_EV_READ);
1193 if(getsockname(fd, (struct sockaddr*)usock, &ulen) != -1) {
1194 log_info("accepted new dnstap client from %s", usock->sun_path);
1195 id = strdup(usock->sun_path);
1217 data->fd = s;
1218 data->id = id;
1219 if(tap_sock->sslctx) {
1220 data->ssl = incoming_ssl_fd(tap_sock->sslctx, data->fd);
1221 if(!data->ssl) fatal_exit("could not SSL_new");
1223 data->ev = ub_event_new(maindata->base, s, UB_EV_READ | UB_EV_PERSIST,
1225 if(!data->ev) fatal_exit("could not ub_event_new");
1226 if(ub_event_add(data->ev, NULL) != 0) fatal_exit("could not ub_event_add");
1227 if(!tap_data_list_insert(&tap_sock->data_list, data))
1236 for(item = local_list->first; item; item = item->next) {
1238 s = tap_socket_new_local(item->str, &dtio_mainfdcallback,
1241 if(!tap_socket_list_insert(&maindata->acceptlist, s))
1251 for(item = tcp_list->first; item; item = item->next) {
1253 s = tap_socket_new_tcpaccept(item->str, &dtio_mainfdcallback,
1256 if(!tap_socket_list_insert(&maindata->acceptlist, s))
1267 for(item = tls_list->first; item; item = item->next) {
1269 s = tap_socket_new_tlsaccept(item->str, &dtio_mainfdcallback,
1272 if(!tap_socket_list_insert(&maindata->acceptlist, s))
1288 /* simple cast to void will not silence Wunused-result */
1316 maindata->base = base;
1330 if(!tap_socket_list_addevs(maindata->acceptlist, base))
1338 tap_socket_list_delete(maindata->acceptlist);
1357 log_assert(tap_data_list_insert(&socket->data_list, datas[i]));
1360 list = socket->data_list;
1361 for(i=0; list; i++) list = list->next;
1365 list = socket->data_list;
1366 while(list->next) list = list->next;
1367 free(list->d);
1368 list->d = NULL;
1370 list = socket->data_list;
1371 for(i=0; list; i++) list = list->next;
1375 list = socket->data_list;
1376 for(i=0; i<unit_tap_datas_max-3; i++) list = list->next;
1377 free(list->d);
1378 list->d = NULL;
1380 list = socket->data_list;
1381 for(i=0; list; i++) list = list->next;
1386 list = socket->data_list;
1387 for(i=0; i<unit_tap_datas_max-2; i++) list = list->next;
1388 free(list->d);
1389 list->d = NULL;
1390 list = socket->data_list;
1391 while(list->d) list = list->next;
1393 list = socket->data_list;
1394 for(i=0; list; i++) list = list->next;
1395 log_assert(i==unit_tap_datas_max-2);
1399 list = socket->data_list;
1401 free(list->d);
1402 list->d = NULL;
1403 list = list->next;
1405 tap_data_list_try_to_free_tail(socket->data_list);
1406 list = socket->data_list;
1407 for(i=0; list; i++) list = list->next;
1411 tap_data_list_delete(socket->data_list);
1420 log_assert(tap_data_list_insert(&socket->data_list, datas[i]));
1423 list = socket->data_list;
1424 for(i=0; list; i++) list = list->next;
1428 list = socket->data_list;
1429 while(list->next) list = list->next;
1430 free(list->d);
1431 list->d = NULL;
1433 list = socket->data_list;
1434 for(i=0; list; i++) list = list->next;
1438 tap_data_list_delete(socket->data_list);
1490 log_ident_set("unbound-dnstap-socket");
1501 while( (c=getopt(argc, argv, "hcls:t:u:vx:y:z:")) != -1) {
1539 fatal_exit("-c option needs compilation with "
1540 "--enable-debug");
1549 /* argc -= optind; not using further arguments */
1589 /***--- definitions to make fptr_wlist work. ---***/
1754 /** keep track of lock id in lock-verify application */
1766 if(o1->thr < o2->thr) return -1;
1767 if(o1->thr > o2->thr) return 1;
1768 if(o1->instance < o2->instance) return -1;
1769 if(o1->instance > o2->instance) return 1;