From b5ac7650197c487c084d80bc7a92796a83ebc5ed Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 17 Oct 2016 15:08:22 +0200 Subject: [PATCH] Fix tevent incompatibility issue resolves: 1375973 --- samba-4.5-fix_tevent_abi_issues.patch | 1597 +++++++++++++++++++++++++ samba.spec | 9 +- 2 files changed, 1605 insertions(+), 1 deletion(-) create mode 100644 samba-4.5-fix_tevent_abi_issues.patch diff --git a/samba-4.5-fix_tevent_abi_issues.patch b/samba-4.5-fix_tevent_abi_issues.patch new file mode 100644 index 0000000..6f1e879 --- /dev/null +++ b/samba-4.5-fix_tevent_abi_issues.patch @@ -0,0 +1,1597 @@ +From e13b5ac52204bb8fb5569162d64a0e02111c86de Mon Sep 17 00:00:00 2001 +From: Stefan Metzmacher +Date: Wed, 27 Feb 2013 09:29:47 +0100 +Subject: [PATCH 01/12] s3:nmbd: fix talloc_zero_array() check in + nmbd_packets.c + +Signed-off-by: Stefan Metzmacher +Reviewed-by: Volker Lendecke + +Autobuild-User(master): Volker Lendecke +Autobuild-Date(master): Fri Sep 23 18:08:21 CEST 2016 on sn-devel-144 + +BUG: https://bugzilla.samba.org/show_bug.cgi?id=12283 + +(cherry picked from commit 4470f01605a2f09b054550ee5a8f8d3b4ebc2098) +--- + source3/nmbd/nmbd_packets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index b608354..c9a2dc7 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1724,7 +1724,7 @@ static bool create_listen_pollfds(struct pollfd **pfds, + } + + attrs = talloc_array(NULL, struct socket_attributes, count); +- if (fds == NULL) { ++ if (attrs == NULL) { + DEBUG(1, ("create_listen_pollfds: malloc fail for attrs. " + "size %d\n", count)); + TALLOC_FREE(fds); +-- +1.9.1 + + +From 5822d51b20780248082b9885af55d01250a09d48 Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 12:05:59 -0700 +Subject: [PATCH 02/12] s3: nmbd: Add fd, triggered elements to struct + socket_attributes. + +Zero the attrs array on allocation, and mirror the fd's. + +This will allow us to eventually remove source3/lib/events.c +dependency and make nmbd purely tevent based. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit d8ade0730797df22bfe28847e034eb6d116b0e00) +--- + source3/nmbd/nmbd_packets.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index c9a2dc7..619cc9a 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1683,6 +1683,8 @@ on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip), subrec->subnet_ + struct socket_attributes { + enum packet_type type; + bool broadcast; ++ int fd; ++ bool triggered; + }; + + static bool create_listen_pollfds(struct pollfd **pfds, +@@ -1723,7 +1725,7 @@ static bool create_listen_pollfds(struct pollfd **pfds, + return true; + } + +- attrs = talloc_array(NULL, struct socket_attributes, count); ++ attrs = talloc_zero_array(NULL, struct socket_attributes, count); + if (attrs == NULL) { + DEBUG(1, ("create_listen_pollfds: malloc fail for attrs. " + "size %d\n", count)); +@@ -1734,11 +1736,13 @@ static bool create_listen_pollfds(struct pollfd **pfds, + num = 0; + + fds[num].fd = ClientNMB; ++ attrs[num].fd = ClientNMB; + attrs[num].type = NMB_PACKET; + attrs[num].broadcast = false; + num += 1; + + fds[num].fd = ClientDGRAM; ++ attrs[num].fd = ClientDGRAM; + attrs[num].type = DGRAM_PACKET; + attrs[num].broadcast = false; + num += 1; +@@ -1747,6 +1751,7 @@ static bool create_listen_pollfds(struct pollfd **pfds, + + if (subrec->nmb_sock != -1) { + fds[num].fd = subrec->nmb_sock; ++ attrs[num].fd = subrec->nmb_sock; + attrs[num].type = NMB_PACKET; + attrs[num].broadcast = false; + num += 1; +@@ -1754,6 +1759,7 @@ static bool create_listen_pollfds(struct pollfd **pfds, + + if (subrec->nmb_bcast != -1) { + fds[num].fd = subrec->nmb_bcast; ++ attrs[num].fd = subrec->nmb_bcast; + attrs[num].type = NMB_PACKET; + attrs[num].broadcast = true; + num += 1; +@@ -1761,6 +1767,7 @@ static bool create_listen_pollfds(struct pollfd **pfds, + + if (subrec->dgram_sock != -1) { + fds[num].fd = subrec->dgram_sock; ++ attrs[num].fd = subrec->dgram_sock; + attrs[num].type = DGRAM_PACKET; + attrs[num].broadcast = false; + num += 1; +@@ -1768,6 +1775,7 @@ static bool create_listen_pollfds(struct pollfd **pfds, + + if (subrec->dgram_bcast != -1) { + fds[num].fd = subrec->dgram_bcast; ++ attrs[num].fd = subrec->dgram_bcast; + attrs[num].type = DGRAM_PACKET; + attrs[num].broadcast = true; + num += 1; +-- +1.9.1 + + +From ce0a36819b6d1fcf6c97a004227bdcb4a53143bc Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 12:12:43 -0700 +Subject: [PATCH 03/12] s3: nmbd: Ensure attrs array mirrors fd's array for + dns. + +This will allow us to eventually remove source3/lib/events.c +dependency and make nmbd purely tevent based. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit 7f0717e751930cd5da029c1852ff9f61f95e40b7) +--- + source3/nmbd/nmbd_packets.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index 619cc9a..2648679 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1919,8 +1919,23 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + if (fds == NULL) { + return true; + } ++ attrs = talloc_realloc(NULL, ++ attrs, ++ struct socket_attributes, ++ num_sockets + 1); ++ if (attrs == NULL) { ++ TALLOC_FREE(fds); ++ return true; ++ } + dns_pollidx = num_sockets; + fds[num_sockets].fd = dns_fd; ++ attrs[dns_pollidx].fd = dns_fd; ++ /* ++ * dummy values, we only need ++ * fd and triggered. ++ */ ++ attrs[dns_pollidx].type = NMB_PACKET; ++ attrs[dns_pollidx].broadcast = false; + num_sockets += 1; + } + #endif +-- +1.9.1 + + +From 2d8baf18040b67f2d4504bded60cf03f65072cc5 Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 12:16:58 -0700 +Subject: [PATCH 04/12] s3: nmbd: Now attrs array mirrors fd's array use it in + preference. + +This will allow us to eventually remove source3/lib/events.c +dependency and make nmbd purely tevent based. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit 376e04656b6755d1a182430b39273a93495d00b2) +--- + source3/nmbd/nmbd_packets.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index 2648679..7321922 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -2004,7 +2004,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + client_port = DGRAM_PORT; + } + +- packet = read_packet(fds[i].fd, packet_type); ++ packet = read_packet(attrs[i].fd, packet_type); + if (!packet) { + continue; + } +@@ -2014,7 +2014,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + * only is set then check it came from one of our local nets. + */ + if (lp_bind_interfaces_only() && +- (fds[i].fd == client_fd) && ++ (attrs[i].fd == client_fd) && + (!is_local_net_v4(packet->ip))) { + DEBUG(7,("discarding %s packet sent to broadcast socket from %s:%d\n", + packet_name, inet_ntoa(packet->ip), packet->port)); +@@ -2053,10 +2053,10 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + + if (attrs[i].broadcast) { + /* this is a broadcast socket */ +- packet->send_fd = fds[i-1].fd; ++ packet->send_fd = attrs[i-1].fd; + } else { + /* this is already a unicast socket */ +- packet->send_fd = fds[i].fd; ++ packet->send_fd = attrs[i].fd; + } + + queue_packet(packet); +-- +1.9.1 + + +From 6ad7738fd892b2edd75dc699e962dd557ebcf1b2 Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 12:18:37 -0700 +Subject: [PATCH 05/12] s3: nmbd: Add (currently unused) timeout and fd + handlers. + +This will allow us to eventually remove source3/lib/events.c +dependency and make nmbd purely tevent based. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit cca25c8f75147873280464eaf2699ff449f609ad) +--- + source3/nmbd/nmbd_packets.c | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index 7321922..caef1db 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1872,6 +1872,32 @@ static void free_processed_packet_list(struct processed_packet **pp_processed_pa + } + + /**************************************************************************** ++ Timeout callback - just notice we timed out. ++***************************************************************************/ ++ ++static void nmbd_timeout_handler(struct tevent_context *ev, ++ struct tevent_timer *te, ++ struct timeval current_time, ++ void *private_data) ++{ ++ bool *got_timeout = private_data; ++ *got_timeout = true; ++} ++ ++/**************************************************************************** ++ fd callback - remember the fd that triggered. ++***************************************************************************/ ++ ++static void nmbd_fd_handler(struct tevent_context *ev, ++ struct tevent_fd *fde, ++ uint16_t flags, ++ void *private_data) ++{ ++ struct socket_attributes *attr = private_data; ++ attr->triggered = true; ++} ++ ++/**************************************************************************** + Listens for NMB or DGRAM packets, and queues them. + return True if the socket is dead + ***************************************************************************/ +-- +1.9.1 + + +From 01573b2d214a20819226908f3e3653a513e78c11 Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 12:22:53 -0700 +Subject: [PATCH 06/12] s3: nmbd: Add a talloc_stackframe(). + +We will use this to create real tevent timer and fd +events. + +This will allow us to eventually remove source3/lib/events.c +dependency and make nmbd purely tevent based. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit 36b67729a6fc8518da71944db3fac6d9236b9348) +--- + source3/nmbd/nmbd_packets.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index caef1db..c0c4925 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1917,10 +1917,12 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + int dns_pollidx = -1; + #endif + struct processed_packet *processed_packet_list = NULL; ++ TALLOC_CTX *frame = talloc_stackframe(); + + if ((fds == NULL) || rescan_listen_set) { + if (create_listen_pollfds(&fds, &attrs, &listen_number)) { + DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n")); ++ TALLOC_FREE(frame); + return True; + } + rescan_listen_set = False; +@@ -1934,6 +1936,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + + fds = talloc_realloc(NULL, fds, struct pollfd, listen_number); + if (fds == NULL) { ++ TALLOC_FREE(frame); + return true; + } + num_sockets = listen_number; +@@ -1943,6 +1946,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + if (dns_fd != -1) { + fds = talloc_realloc(NULL, fds, struct pollfd, num_sockets+1); + if (fds == NULL) { ++ TALLOC_FREE(frame); + return true; + } + attrs = talloc_realloc(NULL, +@@ -1951,6 +1955,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + num_sockets + 1); + if (attrs == NULL) { + TALLOC_FREE(fds); ++ TALLOC_FREE(frame); + return true; + } + dns_pollidx = num_sockets; +@@ -1972,6 +1977,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + + /* Process a signal and timer events now... */ + if (run_events_poll(nmbd_event_context(), 0, NULL, 0)) { ++ TALLOC_FREE(frame); + return False; + } + +@@ -1991,10 +1997,12 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + pollrtn = poll(fds, num_sockets, timeout); + + if (run_events_poll(nmbd_event_context(), pollrtn, fds, num_sockets)) { ++ TALLOC_FREE(frame); + return False; + } + + if (pollrtn == -1) { ++ TALLOC_FREE(frame); + return False; + } + +@@ -2089,6 +2097,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + } + + free_processed_packet_list(&processed_packet_list); ++ TALLOC_FREE(frame); + return False; + } + +-- +1.9.1 + + +From 0a9d66eda6e3dd65ff669355081fc60f420968f3 Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 12:31:00 -0700 +Subject: [PATCH 07/12] s3: nmbd: Change over to using tevent functions from + direct poll. + +This will allow us to eventually remove source3/lib/events.c +dependency and make nmbd purely tevent based. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit b857bf9b3fa3a836647edc40ead92db7b782d367) +--- + source3/nmbd/nmbd_packets.c | 58 +++++++++++++++++++++++++++++---------------- + 1 file changed, 38 insertions(+), 20 deletions(-) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index c0c4925..3e94e6e 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1909,14 +1909,16 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + static int listen_number = 0; + int num_sockets; + int i; ++ int loop_rtn; ++ int timeout_secs; + +- int pollrtn; +- int timeout; + #ifndef SYNC_DNS + int dns_fd; + int dns_pollidx = -1; + #endif + struct processed_packet *processed_packet_list = NULL; ++ struct tevent_timer *te = NULL; ++ bool got_timeout = false; + TALLOC_CTX *frame = talloc_stackframe(); + + if ((fds == NULL) || rescan_listen_set) { +@@ -1972,13 +1974,17 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + #endif + + for (i=0; i +Date: Fri, 23 Sep 2016 12:37:52 -0700 +Subject: [PATCH 08/12] s3: nmbd: Final changeover to stock tevent for nmbd. + +Removes unused references to fds array used for (removed) +poll call. Renames create_listen_pollfds() to +create_listen_array(). + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit 6e8bd13660d7795df429dbf852345124db38ea96) +--- + source3/nmbd/nmbd_packets.c | 46 ++++----------------------------------------- + 1 file changed, 4 insertions(+), 42 deletions(-) + +diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c +index 3e94e6e..de5ae1e 100644 +--- a/source3/nmbd/nmbd_packets.c ++++ b/source3/nmbd/nmbd_packets.c +@@ -1687,14 +1687,12 @@ struct socket_attributes { + bool triggered; + }; + +-static bool create_listen_pollfds(struct pollfd **pfds, +- struct socket_attributes **pattrs, ++static bool create_listen_array(struct socket_attributes **pattrs, + int *pnum_sockets) + { + struct subnet_record *subrec = NULL; + int count = 0; + int num = 0; +- struct pollfd *fds; + struct socket_attributes *attrs; + + /* The ClientNMB and ClientDGRAM sockets */ +@@ -1718,30 +1716,20 @@ static bool create_listen_pollfds(struct pollfd **pfds, + } + } + +- fds = talloc_zero_array(NULL, struct pollfd, count); +- if (fds == NULL) { +- DEBUG(1, ("create_listen_pollfds: malloc fail for fds. " +- "size %d\n", count)); +- return true; +- } +- + attrs = talloc_zero_array(NULL, struct socket_attributes, count); + if (attrs == NULL) { +- DEBUG(1, ("create_listen_pollfds: malloc fail for attrs. " ++ DEBUG(1, ("talloc fail for attrs. " + "size %d\n", count)); +- TALLOC_FREE(fds); + return true; + } + + num = 0; + +- fds[num].fd = ClientNMB; + attrs[num].fd = ClientNMB; + attrs[num].type = NMB_PACKET; + attrs[num].broadcast = false; + num += 1; + +- fds[num].fd = ClientDGRAM; + attrs[num].fd = ClientDGRAM; + attrs[num].type = DGRAM_PACKET; + attrs[num].broadcast = false; +@@ -1750,7 +1738,6 @@ static bool create_listen_pollfds(struct pollfd **pfds, + for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { + + if (subrec->nmb_sock != -1) { +- fds[num].fd = subrec->nmb_sock; + attrs[num].fd = subrec->nmb_sock; + attrs[num].type = NMB_PACKET; + attrs[num].broadcast = false; +@@ -1758,7 +1745,6 @@ static bool create_listen_pollfds(struct pollfd **pfds, + } + + if (subrec->nmb_bcast != -1) { +- fds[num].fd = subrec->nmb_bcast; + attrs[num].fd = subrec->nmb_bcast; + attrs[num].type = NMB_PACKET; + attrs[num].broadcast = true; +@@ -1766,7 +1752,6 @@ static bool create_listen_pollfds(struct pollfd **pfds, + } + + if (subrec->dgram_sock != -1) { +- fds[num].fd = subrec->dgram_sock; + attrs[num].fd = subrec->dgram_sock; + attrs[num].type = DGRAM_PACKET; + attrs[num].broadcast = false; +@@ -1774,7 +1759,6 @@ static bool create_listen_pollfds(struct pollfd **pfds, + } + + if (subrec->dgram_bcast != -1) { +- fds[num].fd = subrec->dgram_bcast; + attrs[num].fd = subrec->dgram_bcast; + attrs[num].type = DGRAM_PACKET; + attrs[num].broadcast = true; +@@ -1782,9 +1766,6 @@ static bool create_listen_pollfds(struct pollfd **pfds, + } + } + +- TALLOC_FREE(*pfds); +- *pfds = fds; +- + TALLOC_FREE(*pattrs); + *pattrs = attrs; + +@@ -1904,7 +1885,6 @@ static void nmbd_fd_handler(struct tevent_context *ev, + + bool listen_for_packets(struct messaging_context *msg, bool run_election) + { +- static struct pollfd *fds = NULL; + static struct socket_attributes *attrs = NULL; + static int listen_number = 0; + int num_sockets; +@@ -1921,8 +1901,8 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + bool got_timeout = false; + TALLOC_CTX *frame = talloc_stackframe(); + +- if ((fds == NULL) || rescan_listen_set) { +- if (create_listen_pollfds(&fds, &attrs, &listen_number)) { ++ if ((attrs == NULL) || rescan_listen_set) { ++ if (create_listen_array(&attrs, &listen_number)) { + DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n")); + TALLOC_FREE(frame); + return True; +@@ -1930,38 +1910,20 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) + rescan_listen_set = False; + } + +- /* +- * "fds" can be enlarged by event_add_to_poll_args +- * below. Shrink it again to what was given to us by +- * create_listen_pollfds. +- */ +- +- fds = talloc_realloc(NULL, fds, struct pollfd, listen_number); +- if (fds == NULL) { +- TALLOC_FREE(frame); +- return true; +- } + num_sockets = listen_number; + + #ifndef SYNC_DNS + dns_fd = asyncdns_fd(); + if (dns_fd != -1) { +- fds = talloc_realloc(NULL, fds, struct pollfd, num_sockets+1); +- if (fds == NULL) { +- TALLOC_FREE(frame); +- return true; +- } + attrs = talloc_realloc(NULL, + attrs, + struct socket_attributes, + num_sockets + 1); + if (attrs == NULL) { +- TALLOC_FREE(fds); + TALLOC_FREE(frame); + return true; + } + dns_pollidx = num_sockets; +- fds[num_sockets].fd = dns_fd; + attrs[dns_pollidx].fd = dns_fd; + /* + * dummy values, we only need +-- +1.9.1 + + +From 9c5022ebec416cdfaa5c94097fea2eaf9b50d24a Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 19:07:39 -0700 +Subject: [PATCH 09/12] s3: winbind: Remove dump_event_list() calls. + +If needed we can add this into actual tevent. + +Preparing to remove source3/lib/events.c + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit 72785309aa2d1bed7abc6dd7c6475ff0f78411da) +--- + source3/winbindd/winbindd_dual.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c +index 17a89a7..c16b94e 100644 +--- a/source3/winbindd/winbindd_dual.c ++++ b/source3/winbindd/winbindd_dual.c +@@ -835,7 +835,7 @@ void winbind_msg_dump_event_list(struct messaging_context *msg_ctx, + + DEBUG(10,("winbind_msg_dump_event_list received\n")); + +- dump_event_list(winbind_event_context()); ++ DBG_WARNING("dump event list no longer implemented\n"); + + for (child = winbindd_children; child != NULL; child = child->next) { + +@@ -1240,8 +1240,7 @@ static void child_msg_dump_event_list(struct messaging_context *msg, + DATA_BLOB *data) + { + DEBUG(5,("child_msg_dump_event_list received\n")); +- +- dump_event_list(winbind_event_context()); ++ DBG_WARNING("dump_event_list no longer implemented\n"); + } + + NTSTATUS winbindd_reinit_after_fork(const struct winbindd_child *myself, +-- +1.9.1 + + +From 74deb057bffa9ab18d22862b3bbd159c92a849dc Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 19:11:17 -0700 +Subject: [PATCH 10/12] s3: server: s3_tevent_context_init() -> + samba_tevent_context_init() + +We can now remove source3/lib/events.c + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(cherry picked from commit fbfea52e1ce8f22d8d020a2bf3aebd1bc69faceb) +--- + source3/lib/server_contexts.c | 2 +- + source3/rpc_server/rpc_ncacn_np.c | 8 ++++---- + source3/smbd/process.c | 4 ++-- + source3/smbd/server.c | 1 - + 4 files changed, 7 insertions(+), 8 deletions(-) + +diff --git a/source3/lib/server_contexts.c b/source3/lib/server_contexts.c +index d49e334..50072e6 100644 +--- a/source3/lib/server_contexts.c ++++ b/source3/lib/server_contexts.c +@@ -31,7 +31,7 @@ struct tevent_context *server_event_context(void) + * autofree context, to avoid side effects in forked + * children exiting. + */ +- server_event_ctx = s3_tevent_context_init(NULL); ++ server_event_ctx = samba_tevent_context_init(NULL); + } + if (!server_event_ctx) { + smb_panic("Could not init server's event context"); +diff --git a/source3/rpc_server/rpc_ncacn_np.c b/source3/rpc_server/rpc_ncacn_np.c +index f9c73de..083cbbe 100644 +--- a/source3/rpc_server/rpc_ncacn_np.c ++++ b/source3/rpc_server/rpc_ncacn_np.c +@@ -708,9 +708,9 @@ NTSTATUS make_external_rpc_pipe(TALLOC_CTX *mem_ctx, + goto out; + } + +- ev_ctx = s3_tevent_context_init(tmp_ctx); ++ ev_ctx = samba_tevent_context_init(tmp_ctx); + if (ev_ctx == NULL) { +- DEBUG(0, ("s3_tevent_context_init failed\n")); ++ DEBUG(0, ("samba_tevent_context_init failed\n")); + status = NT_STATUS_NO_MEMORY; + goto out; + } +@@ -816,9 +816,9 @@ struct np_proxy_state *make_external_rpc_pipe_p(TALLOC_CTX *mem_ctx, + goto fail; + } + +- ev = s3_tevent_context_init(talloc_tos()); ++ ev = samba_tevent_context_init(talloc_tos()); + if (ev == NULL) { +- DEBUG(0, ("s3_tevent_context_init failed\n")); ++ DEBUG(0, ("samba_tevent_context_init failed\n")); + goto fail; + } + +diff --git a/source3/smbd/process.c b/source3/smbd/process.c +index e3c32f9..8f097ec 100644 +--- a/source3/smbd/process.c ++++ b/source3/smbd/process.c +@@ -3224,9 +3224,9 @@ static void smbd_echo_loop(struct smbXsrv_connection *xconn, + } + state->xconn = xconn; + state->parent_pipe = parent_pipe; +- state->ev = s3_tevent_context_init(state); ++ state->ev = samba_tevent_context_init(state); + if (state->ev == NULL) { +- DEBUG(1, ("tevent_context_init failed\n")); ++ DEBUG(1, ("samba_tevent_context_init failed\n")); + TALLOC_FREE(state); + return; + } +diff --git a/source3/smbd/server.c b/source3/smbd/server.c +index 97c0fdc..6d0c664 100644 +--- a/source3/smbd/server.c ++++ b/source3/smbd/server.c +@@ -1670,7 +1670,6 @@ extern void build_options(bool screen); + * Initialize the event context. The event context needs to be + * initialized before the messaging context, cause the messaging + * context holds an event context. +- * FIXME: This should be s3_tevent_context_init() + */ + ev_ctx = server_event_context(); + if (ev_ctx == NULL) { +-- +1.9.1 + + +From bc6a9794fe2b7fb95423c99174f5e31df9be35ee Mon Sep 17 00:00:00 2001 +From: Jeremy Allison +Date: Fri, 23 Sep 2016 20:00:33 -0700 +Subject: [PATCH 11/12] s3: events. Move events.c to util_event.c + +Remove all tevent internal code. + +Everything is now stock tevent. + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Jeremy Allison +Reviewed-by: Volker Lendecke +(similar to commit 4ed790ebbf474c4e4ef9b4f0f3aeca65118796df) +--- + source3/include/event.h | 42 ---- + source3/include/includes.h | 4 +- + source3/include/util_event.h | 28 +++ + source3/lib/events.c | 486 ------------------------------------------- + source3/lib/util_event.c | 101 +++++++++ + source3/wscript_build | 2 +- + 6 files changed, 132 insertions(+), 531 deletions(-) + delete mode 100644 source3/include/event.h + create mode 100644 source3/include/util_event.h + delete mode 100644 source3/lib/events.c + create mode 100644 source3/lib/util_event.c + +diff --git a/source3/include/event.h b/source3/include/event.h +deleted file mode 100644 +index 108026e..0000000 +--- a/source3/include/event.h ++++ /dev/null +@@ -1,42 +0,0 @@ +-/* +- Unix SMB/CIFS implementation. +- event handling +- Copyright (C) Andrew Tridgell 1992-1998 +- Copyright (C) Volker Lendecke 2005-2007 +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program. If not, see . +-*/ +- +-#include +- +-/* The following definitions come from lib/events.c */ +-struct pollfd; +-struct timeval *get_timed_events_timeout(struct tevent_context *event_ctx, +- struct timeval *to_ret); +-void dump_event_list(struct tevent_context *event_ctx); +-struct tevent_context *s3_tevent_context_init(TALLOC_CTX *mem_ctx); +- +-bool event_add_to_poll_args(struct tevent_context *ev, TALLOC_CTX *mem_ctx, +- struct pollfd **pfds, int *num_pfds, +- int *ptimeout); +-bool run_events_poll(struct tevent_context *ev, int pollrtn, +- struct pollfd *pfds, int num_pfds); +- +-struct idle_event *event_add_idle(struct tevent_context *event_ctx, +- TALLOC_CTX *mem_ctx, +- struct timeval interval, +- const char *name, +- bool (*handler)(const struct timeval *now, +- void *private_data), +- void *private_data); +diff --git a/source3/include/includes.h b/source3/include/includes.h +index 81bba40..234a564 100644 +--- a/source3/include/includes.h ++++ b/source3/include/includes.h +@@ -310,8 +310,8 @@ typedef char fstring[FSTRING_LEN]; + #include "../lib/util/dlinklist.h" + + #include +- +-#include "event.h" ++#include ++#include "util_event.h" + + #include "../lib/util/data_blob.h" + #include "../lib/util/time.h" +diff --git a/source3/include/util_event.h b/source3/include/util_event.h +new file mode 100644 +index 0000000..df608a1 +--- /dev/null ++++ b/source3/include/util_event.h +@@ -0,0 +1,28 @@ ++/* ++ Unix SMB/CIFS implementation. ++ event handling ++ Copyright (C) Andrew Tridgell 1992-1998 ++ Copyright (C) Volker Lendecke 2005-2007 ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++*/ ++ ++/* The following definitions come from lib/util_event.c */ ++struct idle_event *event_add_idle(struct tevent_context *event_ctx, ++ TALLOC_CTX *mem_ctx, ++ struct timeval interval, ++ const char *name, ++ bool (*handler)(const struct timeval *now, ++ void *private_data), ++ void *private_data); +diff --git a/source3/lib/events.c b/source3/lib/events.c +deleted file mode 100644 +index 2e862ca..0000000 +--- a/source3/lib/events.c ++++ /dev/null +@@ -1,486 +0,0 @@ +-/* +- Unix SMB/CIFS implementation. +- Timed event library. +- Copyright (C) Andrew Tridgell 1992-1998 +- Copyright (C) Volker Lendecke 2005-2007 +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program. If not, see . +-*/ +- +-#include "includes.h" +-#include "lib/tevent/tevent_internal.h" +-#include "../lib/util/select.h" +-#include "system/select.h" +- +-struct tevent_poll_private { +- /* +- * Index from file descriptor into the pollfd array +- */ +- int *pollfd_idx; +- +- /* +- * Cache for s3_event_loop_once to avoid reallocs +- */ +- struct pollfd *pfds; +-}; +- +-static struct tevent_poll_private *tevent_get_poll_private( +- struct tevent_context *ev) +-{ +- struct tevent_poll_private *state; +- +- state = (struct tevent_poll_private *)ev->additional_data; +- if (state == NULL) { +- state = talloc_zero(ev, struct tevent_poll_private); +- ev->additional_data = (void *)state; +- if (state == NULL) { +- DEBUG(10, ("talloc failed\n")); +- } +- } +- return state; +-} +- +-static void count_fds(struct tevent_context *ev, +- int *pnum_fds, int *pmax_fd) +-{ +- struct tevent_fd *fde; +- int num_fds = 0; +- int max_fd = 0; +- +- for (fde = ev->fd_events; fde != NULL; fde = fde->next) { +- if (fde->flags & (TEVENT_FD_READ|TEVENT_FD_WRITE)) { +- num_fds += 1; +- if (fde->fd > max_fd) { +- max_fd = fde->fd; +- } +- } +- } +- *pnum_fds = num_fds; +- *pmax_fd = max_fd; +-} +- +-bool event_add_to_poll_args(struct tevent_context *ev, TALLOC_CTX *mem_ctx, +- struct pollfd **pfds, int *pnum_pfds, +- int *ptimeout) +-{ +- struct tevent_poll_private *state; +- struct tevent_fd *fde; +- int i, num_fds, max_fd, num_pollfds, idx_len; +- struct pollfd *fds; +- struct timeval now, diff; +- int timeout; +- +- state = tevent_get_poll_private(ev); +- if (state == NULL) { +- return false; +- } +- count_fds(ev, &num_fds, &max_fd); +- +- idx_len = max_fd+1; +- +- if (talloc_array_length(state->pollfd_idx) < idx_len) { +- state->pollfd_idx = talloc_realloc( +- state, state->pollfd_idx, int, idx_len); +- if (state->pollfd_idx == NULL) { +- DEBUG(10, ("talloc_realloc failed\n")); +- return false; +- } +- } +- +- fds = *pfds; +- num_pollfds = *pnum_pfds; +- +- if (talloc_array_length(fds) < num_pollfds + num_fds) { +- fds = talloc_realloc(mem_ctx, fds, struct pollfd, +- num_pollfds + num_fds); +- if (fds == NULL) { +- DEBUG(10, ("talloc_realloc failed\n")); +- return false; +- } +- } +- +- memset(&fds[num_pollfds], 0, sizeof(struct pollfd) * num_fds); +- +- /* +- * This needs tuning. We need to cope with multiple fde's for a file +- * descriptor. The problem is that we need to re-use pollfd_idx across +- * calls for efficiency. One way would be a direct bitmask that might +- * be initialized quicker, but our bitmap_init implementation is +- * pretty heavy-weight as well. +- */ +- for (i=0; ipollfd_idx[i] = -1; +- } +- +- for (fde = ev->fd_events; fde; fde = fde->next) { +- struct pollfd *pfd; +- +- if ((fde->flags & (TEVENT_FD_READ|TEVENT_FD_WRITE)) == 0) { +- continue; +- } +- +- if (state->pollfd_idx[fde->fd] == -1) { +- /* +- * We haven't seen this fd yet. Allocate a new pollfd. +- */ +- state->pollfd_idx[fde->fd] = num_pollfds; +- pfd = &fds[num_pollfds]; +- num_pollfds += 1; +- } else { +- /* +- * We have already seen this fd. OR in the flags. +- */ +- pfd = &fds[state->pollfd_idx[fde->fd]]; +- } +- +- pfd->fd = fde->fd; +- +- if (fde->flags & TEVENT_FD_READ) { +- pfd->events |= (POLLIN|POLLHUP); +- } +- if (fde->flags & TEVENT_FD_WRITE) { +- pfd->events |= POLLOUT; +- } +- } +- *pfds = fds; +- *pnum_pfds = num_pollfds; +- +- if (ev->immediate_events != NULL) { +- *ptimeout = 0; +- return true; +- } +- if (ev->timer_events == NULL) { +- *ptimeout = MIN(*ptimeout, INT_MAX); +- return true; +- } +- +- now = timeval_current(); +- diff = timeval_until(&now, &ev->timer_events->next_event); +- timeout = timeval_to_msec(diff); +- +- if (timeout < *ptimeout) { +- *ptimeout = timeout; +- } +- +- return true; +-} +- +-bool run_events_poll(struct tevent_context *ev, int pollrtn, +- struct pollfd *pfds, int num_pfds) +-{ +- struct tevent_poll_private *state; +- int *pollfd_idx; +- struct tevent_fd *fde; +- +- if (ev->signal_events && +- tevent_common_check_signal(ev)) { +- return true; +- } +- +- if (ev->immediate_events && +- tevent_common_loop_immediate(ev)) { +- return true; +- } +- +- if (pollrtn <= 0) { +- struct timeval tval; +- +- tval = tevent_common_loop_timer_delay(ev); +- if (tevent_timeval_is_zero(&tval)) { +- return true; +- } +- +- /* +- * No fd ready +- */ +- return false; +- } +- +- state = (struct tevent_poll_private *)ev->additional_data; +- pollfd_idx = state->pollfd_idx; +- +- for (fde = ev->fd_events; fde; fde = fde->next) { +- struct pollfd *pfd; +- uint16_t flags = 0; +- +- if ((fde->flags & (TEVENT_FD_READ|TEVENT_FD_WRITE)) == 0) { +- continue; +- } +- +- if (pollfd_idx[fde->fd] >= num_pfds) { +- DEBUG(1, ("internal error: pollfd_idx[fde->fd] (%d) " +- ">= num_pfds (%d)\n", pollfd_idx[fde->fd], +- num_pfds)); +- return false; +- } +- pfd = &pfds[pollfd_idx[fde->fd]]; +- +- if (pfd->fd != fde->fd) { +- DEBUG(1, ("internal error: pfd->fd (%d) " +- "!= fde->fd (%d)\n", pollfd_idx[fde->fd], +- num_pfds)); +- return false; +- } +- +- if (pfd->revents & (POLLHUP|POLLERR)) { +- /* If we only wait for TEVENT_FD_WRITE, we +- should not tell the event handler about it, +- and remove the writable flag, as we only +- report errors when waiting for read events +- to match the select behavior. */ +- if (!(fde->flags & TEVENT_FD_READ)) { +- TEVENT_FD_NOT_WRITEABLE(fde); +- continue; +- } +- flags |= TEVENT_FD_READ; +- } +- +- if (pfd->revents & POLLIN) { +- flags |= TEVENT_FD_READ; +- } +- if (pfd->revents & POLLOUT) { +- flags |= TEVENT_FD_WRITE; +- } +- if (flags & fde->flags) { +- DLIST_DEMOTE(ev->fd_events, fde); +- fde->handler(ev, fde, flags, fde->private_data); +- return true; +- } +- } +- +- return false; +-} +- +-struct timeval *get_timed_events_timeout(struct tevent_context *ev, +- struct timeval *to_ret) +-{ +- struct timeval now; +- +- if ((ev->timer_events == NULL) && (ev->immediate_events == NULL)) { +- return NULL; +- } +- if (ev->immediate_events != NULL) { +- *to_ret = timeval_zero(); +- return to_ret; +- } +- +- now = timeval_current(); +- *to_ret = timeval_until(&now, &ev->timer_events->next_event); +- +- DEBUG(10, ("timed_events_timeout: %d/%d\n", (int)to_ret->tv_sec, +- (int)to_ret->tv_usec)); +- +- return to_ret; +-} +- +-static int s3_event_loop_once(struct tevent_context *ev, const char *location) +-{ +- struct tevent_poll_private *state; +- int timeout; +- int num_pfds; +- int ret; +- int poll_errno; +- +- timeout = INT_MAX; +- +- state = tevent_get_poll_private(ev); +- if (state == NULL) { +- errno = ENOMEM; +- return -1; +- } +- +- if (run_events_poll(ev, 0, NULL, 0)) { +- return 0; +- } +- +- num_pfds = 0; +- if (!event_add_to_poll_args(ev, state, +- &state->pfds, &num_pfds, &timeout)) { +- return -1; +- } +- +- tevent_trace_point_callback(ev, TEVENT_TRACE_BEFORE_WAIT); +- ret = poll(state->pfds, num_pfds, timeout); +- poll_errno = errno; +- tevent_trace_point_callback(ev, TEVENT_TRACE_AFTER_WAIT); +- errno = poll_errno; +- +- if (ret == -1 && errno != EINTR) { +- tevent_debug(ev, TEVENT_DEBUG_FATAL, +- "poll() failed: %d:%s\n", +- errno, strerror(errno)); +- return -1; +- } +- +- run_events_poll(ev, ret, state->pfds, num_pfds); +- return 0; +-} +- +-static int s3_event_context_init(struct tevent_context *ev) +-{ +- return 0; +-} +- +-void dump_event_list(struct tevent_context *ev) +-{ +- struct tevent_timer *te; +- struct tevent_fd *fe; +- struct timeval evt, now; +- +- if (!ev) { +- return; +- } +- +- now = timeval_current(); +- +- DEBUG(10,("dump_event_list:\n")); +- +- for (te = ev->timer_events; te; te = te->next) { +- +- evt = timeval_until(&now, &te->next_event); +- +- DEBUGADD(10,("Timed Event \"%s\" %p handled in %d seconds (at %s)\n", +- te->handler_name, +- te, +- (int)evt.tv_sec, +- http_timestring(talloc_tos(), te->next_event.tv_sec))); +- } +- +- for (fe = ev->fd_events; fe; fe = fe->next) { +- +- DEBUGADD(10,("FD Event %d %p, flags: 0x%04x\n", +- fe->fd, +- fe, +- fe->flags)); +- } +-} +- +-static const struct tevent_ops s3_event_ops = { +- .context_init = s3_event_context_init, +- .add_fd = tevent_common_add_fd, +- .set_fd_close_fn = tevent_common_fd_set_close_fn, +- .get_fd_flags = tevent_common_fd_get_flags, +- .set_fd_flags = tevent_common_fd_set_flags, +- .add_timer = tevent_common_add_timer, +- .schedule_immediate = tevent_common_schedule_immediate, +- .add_signal = tevent_common_add_signal, +- .loop_once = s3_event_loop_once, +- .loop_wait = tevent_common_loop_wait, +-}; +- +-static bool s3_tevent_init(void) +-{ +- static bool initialized; +- if (initialized) { +- return true; +- } +- initialized = tevent_register_backend("s3", &s3_event_ops); +- tevent_set_default_backend("s3"); +- return initialized; +-} +- +-struct tevent_context *s3_tevent_context_init(TALLOC_CTX *mem_ctx) +-{ +- struct tevent_context *ev; +- +- s3_tevent_init(); +- +- ev = tevent_context_init_byname(mem_ctx, "s3"); +- if (ev) { +- samba_tevent_set_debug(ev, "s3_tevent"); +- } +- +- return ev; +-} +- +-struct idle_event { +- struct tevent_timer *te; +- struct timeval interval; +- char *name; +- bool (*handler)(const struct timeval *now, void *private_data); +- void *private_data; +-}; +- +-static void smbd_idle_event_handler(struct tevent_context *ctx, +- struct tevent_timer *te, +- struct timeval now, +- void *private_data) +-{ +- struct idle_event *event = +- talloc_get_type_abort(private_data, struct idle_event); +- +- TALLOC_FREE(event->te); +- +- DEBUG(10,("smbd_idle_event_handler: %s %p called\n", +- event->name, event->te)); +- +- if (!event->handler(&now, event->private_data)) { +- DEBUG(10,("smbd_idle_event_handler: %s %p stopped\n", +- event->name, event->te)); +- /* Don't repeat, delete ourselves */ +- TALLOC_FREE(event); +- return; +- } +- +- DEBUG(10,("smbd_idle_event_handler: %s %p rescheduled\n", +- event->name, event->te)); +- +- event->te = tevent_add_timer(ctx, event, +- timeval_sum(&now, &event->interval), +- smbd_idle_event_handler, event); +- +- /* We can't do much but fail here. */ +- SMB_ASSERT(event->te != NULL); +-} +- +-struct idle_event *event_add_idle(struct tevent_context *event_ctx, +- TALLOC_CTX *mem_ctx, +- struct timeval interval, +- const char *name, +- bool (*handler)(const struct timeval *now, +- void *private_data), +- void *private_data) +-{ +- struct idle_event *result; +- struct timeval now = timeval_current(); +- +- result = talloc(mem_ctx, struct idle_event); +- if (result == NULL) { +- DEBUG(0, ("talloc failed\n")); +- return NULL; +- } +- +- result->interval = interval; +- result->handler = handler; +- result->private_data = private_data; +- +- if (!(result->name = talloc_asprintf(result, "idle_evt(%s)", name))) { +- DEBUG(0, ("talloc failed\n")); +- TALLOC_FREE(result); +- return NULL; +- } +- +- result->te = tevent_add_timer(event_ctx, result, +- timeval_sum(&now, &interval), +- smbd_idle_event_handler, result); +- if (result->te == NULL) { +- DEBUG(0, ("event_add_timed failed\n")); +- TALLOC_FREE(result); +- return NULL; +- } +- +- DEBUG(10,("event_add_idle: %s %p\n", result->name, result->te)); +- return result; +-} +- +diff --git a/source3/lib/util_event.c b/source3/lib/util_event.c +new file mode 100644 +index 0000000..4ca2840 +--- /dev/null ++++ b/source3/lib/util_event.c +@@ -0,0 +1,101 @@ ++/* ++ Unix SMB/CIFS implementation. ++ Timed event library. ++ Copyright (C) Andrew Tridgell 1992-1998 ++ Copyright (C) Volker Lendecke 2005-2007 ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++*/ ++ ++#include "includes.h" ++ ++struct idle_event { ++ struct tevent_timer *te; ++ struct timeval interval; ++ char *name; ++ bool (*handler)(const struct timeval *now, void *private_data); ++ void *private_data; ++}; ++ ++static void smbd_idle_event_handler(struct tevent_context *ctx, ++ struct tevent_timer *te, ++ struct timeval now, ++ void *private_data) ++{ ++ struct idle_event *event = ++ talloc_get_type_abort(private_data, struct idle_event); ++ ++ TALLOC_FREE(event->te); ++ ++ DEBUG(10,("smbd_idle_event_handler: %s %p called\n", ++ event->name, event->te)); ++ ++ if (!event->handler(&now, event->private_data)) { ++ DEBUG(10,("smbd_idle_event_handler: %s %p stopped\n", ++ event->name, event->te)); ++ /* Don't repeat, delete ourselves */ ++ TALLOC_FREE(event); ++ return; ++ } ++ ++ DEBUG(10,("smbd_idle_event_handler: %s %p rescheduled\n", ++ event->name, event->te)); ++ ++ event->te = tevent_add_timer(ctx, event, ++ timeval_sum(&now, &event->interval), ++ smbd_idle_event_handler, event); ++ ++ /* We can't do much but fail here. */ ++ SMB_ASSERT(event->te != NULL); ++} ++ ++struct idle_event *event_add_idle(struct tevent_context *event_ctx, ++ TALLOC_CTX *mem_ctx, ++ struct timeval interval, ++ const char *name, ++ bool (*handler)(const struct timeval *now, ++ void *private_data), ++ void *private_data) ++{ ++ struct idle_event *result; ++ struct timeval now = timeval_current(); ++ ++ result = talloc(mem_ctx, struct idle_event); ++ if (result == NULL) { ++ DEBUG(0, ("talloc failed\n")); ++ return NULL; ++ } ++ ++ result->interval = interval; ++ result->handler = handler; ++ result->private_data = private_data; ++ ++ if (!(result->name = talloc_asprintf(result, "idle_evt(%s)", name))) { ++ DEBUG(0, ("talloc failed\n")); ++ TALLOC_FREE(result); ++ return NULL; ++ } ++ ++ result->te = tevent_add_timer(event_ctx, result, ++ timeval_sum(&now, &interval), ++ smbd_idle_event_handler, result); ++ if (result->te == NULL) { ++ DEBUG(0, ("event_add_timed failed\n")); ++ TALLOC_FREE(result); ++ return NULL; ++ } ++ ++ DEBUG(10,("event_add_idle: %s %p\n", result->name, result->te)); ++ return result; ++} +diff --git a/source3/wscript_build b/source3/wscript_build +index 8546e8d..d19b583 100755 +--- a/source3/wscript_build ++++ b/source3/wscript_build +@@ -333,7 +333,7 @@ bld.SAMBA3_SUBSYSTEM('samba3core', + lib/dmallocmsg.c + intl/lang_tdb.c + lib/gencache.c +- lib/events.c ++ lib/util_event.c + lib/server_contexts.c + lib/server_prefork.c + lib/server_prefork_util.c +-- +1.9.1 + + +From cf8c45874d968494b622e7b0c22ada4d054c5c05 Mon Sep 17 00:00:00 2001 +From: Volker Lendecke +Date: Sat, 24 Sep 2016 10:45:13 -0700 +Subject: [PATCH 12/12] glusterfs: Avoid tevent_internal.h +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Günther confirmed it still compiles :-) + +Bug: https://bugzilla.samba.org/show_bug.cgi?id=12283 +Signed-off-by: Volker Lendecke +Reviewed-by: Günther Deschner + +Autobuild-User(master): Volker Lendecke +Autobuild-Date(master): Sat Sep 24 23:41:56 CEST 2016 on sn-devel-144 + +(cherry picked from commit c60ea2c17814f9f7b55514e0d0a553accaa54b15) +--- + source3/modules/vfs_glusterfs.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c +index fbcaf5c..a467235 100644 +--- a/source3/modules/vfs_glusterfs.c ++++ b/source3/modules/vfs_glusterfs.c +@@ -41,7 +41,6 @@ + #include "api/glfs.h" + #include "lib/util/dlinklist.h" + #include "lib/util/tevent_unix.h" +-#include "lib/tevent/tevent_internal.h" + #include "smbd/globals.h" + #include "lib/util/sys_rw.h" + #include "smbprofile.h" +-- +1.9.1 + diff --git a/samba.spec b/samba.spec index f7a7f99..48555d6 100644 --- a/samba.spec +++ b/samba.spec @@ -6,7 +6,7 @@ # ctdb is enabled by default, you can disable it with: --without clustering %bcond_without clustering -%define main_release 2 +%define main_release 3 %define samba_version 4.5.0 %define talloc_version 2.1.8 @@ -107,6 +107,8 @@ Source6: samba.pamd Source200: README.dc Source201: README.downgrade +Patch0: samba-4.5-fix_tevent_abi_issues.patch + BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) Requires(pre): /usr/sbin/groupadd @@ -689,6 +691,8 @@ and use CTDB instead. %prep %setup -q -n samba-%{version}%{pre_release} +%patch0 -p1 -b .samba-4.5-fix_tevent_abi_issues.patch + %build %global _talloc_lib ,talloc,pytalloc,pytalloc-util %global _tevent_lib ,tevent,pytevent @@ -1997,6 +2001,9 @@ rm -rf %{buildroot} %endif # with_clustering_support %changelog +* Mon Oct 17 2016 Andreas Schneider - 4.5.0-3 +- resolves: 1375973 - Fix tevent incompatibility issue + * Wed Sep 14 2016 Guenther Deschner - 4.5.0-2 - Fix smbspool alternatives handling during samba-client uninstall