diff options
| author | Khem Raj <raj.khem@gmail.com> | 2018-04-28 00:33:41 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-05-09 10:47:50 +0100 |
| commit | 6ef11123ef775676c4708a1b2ca162426b9791c3 (patch) | |
| tree | e9849f91315de77882802141244bbfef41721bce /meta | |
| parent | 00a5c6c010f3167b38fc33d450729f893d64806e (diff) | |
| download | poky-6ef11123ef775676c4708a1b2ca162426b9791c3.tar.gz | |
libtirpc: Upgrade to 1.0.4-tc1
Drop backported patches
Redo musl support patch such that it
can be applied universally
(From OE-Core rev: 94c23613724073f8def71bc9e76d7fd7a9f318ad)
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc/0001-include-stdint.h-for-uintptr_t.patch | 29 | ||||
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc/0001-replace-__bzero-with-memset-API.patch | 64 | ||||
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc/Use-netbsd-queue.h.patch | 878 | ||||
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc/export_key_secretkey_is_set.patch | 31 | ||||
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc/libtirpc-1.0.4-rc1.patch | 103 | ||||
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc/musl.patch | 18 | ||||
| -rw-r--r-- | meta/recipes-extended/libtirpc/libtirpc_1.0.3.bb (renamed from meta/recipes-extended/libtirpc/libtirpc_1.0.2.bb) | 13 |
7 files changed, 125 insertions, 1011 deletions
diff --git a/meta/recipes-extended/libtirpc/libtirpc/0001-include-stdint.h-for-uintptr_t.patch b/meta/recipes-extended/libtirpc/libtirpc/0001-include-stdint.h-for-uintptr_t.patch deleted file mode 100644 index 7e3e2f86ad..0000000000 --- a/meta/recipes-extended/libtirpc/libtirpc/0001-include-stdint.h-for-uintptr_t.patch +++ /dev/null | |||
| @@ -1,29 +0,0 @@ | |||
| 1 | Upstream-Status: Backport | ||
| 2 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
| 3 | |||
| 4 | From acb9a37977cf0a9630eac74af9adebf35e38e719 Mon Sep 17 00:00:00 2001 | ||
| 5 | From: Thorsten Kukuk <kukuk@thkukuk.de> | ||
| 6 | Date: Tue, 14 Nov 2017 10:39:08 -0500 | ||
| 7 | Subject: [PATCH] Include stdint.h from xdr_sizeof.c to avoid missing | ||
| 8 | declaration errors. | ||
| 9 | |||
| 10 | Signed-off-by: Thorsten Kukuk <kukuk@suse.de> | ||
| 11 | Signed-off-by: Steve Dickson <steved@redhat.com> | ||
| 12 | --- | ||
| 13 | src/xdr_sizeof.c | 1 + | ||
| 14 | 1 file changed, 1 insertion(+) | ||
| 15 | |||
| 16 | diff --git a/src/xdr_sizeof.c b/src/xdr_sizeof.c | ||
| 17 | index d23fbd1..79d6707 100644 | ||
| 18 | --- a/src/xdr_sizeof.c | ||
| 19 | +++ b/src/xdr_sizeof.c | ||
| 20 | @@ -39,6 +39,7 @@ | ||
| 21 | #include <rpc/xdr.h> | ||
| 22 | #include <sys/types.h> | ||
| 23 | #include <stdlib.h> | ||
| 24 | +#include <stdint.h> | ||
| 25 | #include "un-namespace.h" | ||
| 26 | |||
| 27 | /* ARGSUSED */ | ||
| 28 | -- | ||
| 29 | 1.8.3.1 | ||
diff --git a/meta/recipes-extended/libtirpc/libtirpc/0001-replace-__bzero-with-memset-API.patch b/meta/recipes-extended/libtirpc/libtirpc/0001-replace-__bzero-with-memset-API.patch deleted file mode 100644 index 7ae19cb319..0000000000 --- a/meta/recipes-extended/libtirpc/libtirpc/0001-replace-__bzero-with-memset-API.patch +++ /dev/null | |||
| @@ -1,64 +0,0 @@ | |||
| 1 | Upstream-Status: Backport | ||
| 2 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
| 3 | |||
| 4 | From 5356b63005e9d8169e0399cb76f26fbd29a78dee Mon Sep 17 00:00:00 2001 | ||
| 5 | From: Joshua Kinard <kumba@gentoo.org> | ||
| 6 | Date: Wed, 23 Aug 2017 14:31:36 -0400 | ||
| 7 | Subject: [PATCH] Replace bzero() calls with equivalent memset() calls | ||
| 8 | |||
| 9 | As annotated in the bzero(3) man page, bzero() was marked as LEGACY in | ||
| 10 | POSIX.1-2001 and removed in POSIX.1-2008, and should be replaced with | ||
| 11 | memset() calls to write zeros to a memory region. The attached patch | ||
| 12 | replaces two bzero() calls and one __bzero() call in libtirpc with | ||
| 13 | equivalent memset() calls. The latter replacement fixes a compile error | ||
| 14 | under uclibc-ng, which lacks a definition for __bzero() | ||
| 15 | |||
| 16 | Signed-off-by: Joshua Kinard <kumba@gentoo.org> | ||
| 17 | Signed-off-by: Steve Dickson <steved@redhat.com> | ||
| 18 | --- | ||
| 19 | src/auth_time.c | 2 +- | ||
| 20 | src/des_impl.c | 2 +- | ||
| 21 | src/svc_auth_des.c | 2 +- | ||
| 22 | 3 files changed, 3 insertions(+), 3 deletions(-) | ||
| 23 | |||
| 24 | diff --git a/src/auth_time.c b/src/auth_time.c | ||
| 25 | index 7f83ab4..69400bc 100644 | ||
| 26 | --- a/src/auth_time.c | ||
| 27 | +++ b/src/auth_time.c | ||
| 28 | @@ -317,7 +317,7 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid) | ||
| 29 | sprintf(ipuaddr, "%d.%d.%d.%d.0.111", a1, a2, a3, a4); | ||
| 30 | useua = &ipuaddr[0]; | ||
| 31 | |||
| 32 | - bzero((char *)&sin, sizeof(sin)); | ||
| 33 | + memset(&sin, 0, sizeof(sin)); | ||
| 34 | if (uaddr_to_sockaddr(useua, &sin)) { | ||
| 35 | msg("unable to translate uaddr to sockaddr."); | ||
| 36 | if (needfree) | ||
| 37 | diff --git a/src/des_impl.c b/src/des_impl.c | ||
| 38 | index 9dbccaf..15bec2a 100644 | ||
| 39 | --- a/src/des_impl.c | ||
| 40 | +++ b/src/des_impl.c | ||
| 41 | @@ -588,7 +588,7 @@ _des_crypt (char *buf, unsigned len, struct desparams *desp) | ||
| 42 | } | ||
| 43 | tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0; | ||
| 44 | tbuf[0] = tbuf[1] = 0; | ||
| 45 | - __bzero (schedule, sizeof (schedule)); | ||
| 46 | + memset (schedule, 0, sizeof (schedule)); | ||
| 47 | |||
| 48 | return (1); | ||
| 49 | } | ||
| 50 | diff --git a/src/svc_auth_des.c b/src/svc_auth_des.c | ||
| 51 | index 2e90146..19a7c60 100644 | ||
| 52 | --- a/src/svc_auth_des.c | ||
| 53 | +++ b/src/svc_auth_des.c | ||
| 54 | @@ -356,7 +356,7 @@ cache_init() | ||
| 55 | |||
| 56 | authdes_cache = (struct cache_entry *) | ||
| 57 | mem_alloc(sizeof(struct cache_entry) * AUTHDES_CACHESZ); | ||
| 58 | - bzero((char *)authdes_cache, | ||
| 59 | + memset(authdes_cache, 0, | ||
| 60 | sizeof(struct cache_entry) * AUTHDES_CACHESZ); | ||
| 61 | |||
| 62 | authdes_lru = (short *)mem_alloc(sizeof(short) * AUTHDES_CACHESZ); | ||
| 63 | -- | ||
| 64 | 1.8.3.1 | ||
diff --git a/meta/recipes-extended/libtirpc/libtirpc/Use-netbsd-queue.h.patch b/meta/recipes-extended/libtirpc/libtirpc/Use-netbsd-queue.h.patch deleted file mode 100644 index f93223feb4..0000000000 --- a/meta/recipes-extended/libtirpc/libtirpc/Use-netbsd-queue.h.patch +++ /dev/null | |||
| @@ -1,878 +0,0 @@ | |||
| 1 | musl does not provide sys/queue.h implementation. Borrow queue.h from | ||
| 2 | the NetBSD project | ||
| 3 | http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/sys/queue.h?rev=1.68 | ||
| 4 | |||
| 5 | Upstream-Status: Inappropriate [musl specific] | ||
| 6 | |||
| 7 | Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks> | ||
| 8 | Signed-off-by: Maxin B. John <maxin.john@intel.com> | ||
| 9 | --- | ||
| 10 | diff -Naur libtirpc-1.0.1-orig/src/clnt_bcast.c libtirpc-1.0.1/src/clnt_bcast.c | ||
| 11 | --- libtirpc-1.0.1-orig/src/clnt_bcast.c 2015-10-30 17:15:14.000000000 +0200 | ||
| 12 | +++ libtirpc-1.0.1/src/clnt_bcast.c 2015-12-21 17:03:52.066008311 +0200 | ||
| 13 | @@ -40,7 +40,6 @@ | ||
| 14 | */ | ||
| 15 | #include <sys/socket.h> | ||
| 16 | #include <sys/types.h> | ||
| 17 | -#include <sys/queue.h> | ||
| 18 | |||
| 19 | #include <net/if.h> | ||
| 20 | #include <netinet/in.h> | ||
| 21 | @@ -62,6 +61,7 @@ | ||
| 22 | #include <err.h> | ||
| 23 | #include <string.h> | ||
| 24 | |||
| 25 | +#include "queue.h" | ||
| 26 | #include "rpc_com.h" | ||
| 27 | #include "debug.h" | ||
| 28 | |||
| 29 | diff -Naur libtirpc-1.0.1-orig/tirpc/queue.h libtirpc-1.0.1/tirpc/queue.h | ||
| 30 | --- libtirpc-1.0.1-orig/tirpc/queue.h 1970-01-01 02:00:00.000000000 +0200 | ||
| 31 | +++ libtirpc-1.0.1/tirpc/queue.h 2015-12-21 17:02:44.427853905 +0200 | ||
| 32 | @@ -0,0 +1,846 @@ | ||
| 33 | +/* $NetBSD: queue.h,v 1.68 2014/11/19 08:10:01 uebayasi Exp $ */ | ||
| 34 | + | ||
| 35 | +/* | ||
| 36 | + * Copyright (c) 1991, 1993 | ||
| 37 | + * The Regents of the University of California. All rights reserved. | ||
| 38 | + * | ||
| 39 | + * Redistribution and use in source and binary forms, with or without | ||
| 40 | + * modification, are permitted provided that the following conditions | ||
| 41 | + * are met: | ||
| 42 | + * 1. Redistributions of source code must retain the above copyright | ||
| 43 | + * notice, this list of conditions and the following disclaimer. | ||
| 44 | + * 2. Redistributions in binary form must reproduce the above copyright | ||
| 45 | + * notice, this list of conditions and the following disclaimer in the | ||
| 46 | + * documentation and/or other materials provided with the distribution. | ||
| 47 | + * 3. Neither the name of the University nor the names of its contributors | ||
| 48 | + * may be used to endorse or promote products derived from this software | ||
| 49 | + * without specific prior written permission. | ||
| 50 | + * | ||
| 51 | + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||
| 52 | + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 53 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 54 | + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||
| 55 | + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 56 | + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 57 | + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 58 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 59 | + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
| 60 | + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 61 | + * SUCH DAMAGE. | ||
| 62 | + * | ||
| 63 | + * @(#)queue.h 8.5 (Berkeley) 8/20/94 | ||
| 64 | + */ | ||
| 65 | + | ||
| 66 | +#ifndef _SYS_QUEUE_H_ | ||
| 67 | +#define _SYS_QUEUE_H_ | ||
| 68 | + | ||
| 69 | +/* | ||
| 70 | + * This file defines five types of data structures: singly-linked lists, | ||
| 71 | + * lists, simple queues, tail queues, and circular queues. | ||
| 72 | + * | ||
| 73 | + * A singly-linked list is headed by a single forward pointer. The | ||
| 74 | + * elements are singly linked for minimum space and pointer manipulation | ||
| 75 | + * overhead at the expense of O(n) removal for arbitrary elements. New | ||
| 76 | + * elements can be added to the list after an existing element or at the | ||
| 77 | + * head of the list. Elements being removed from the head of the list | ||
| 78 | + * should use the explicit macro for this purpose for optimum | ||
| 79 | + * efficiency. A singly-linked list may only be traversed in the forward | ||
| 80 | + * direction. Singly-linked lists are ideal for applications with large | ||
| 81 | + * datasets and few or no removals or for implementing a LIFO queue. | ||
| 82 | + * | ||
| 83 | + * A list is headed by a single forward pointer (or an array of forward | ||
| 84 | + * pointers for a hash table header). The elements are doubly linked | ||
| 85 | + * so that an arbitrary element can be removed without a need to | ||
| 86 | + * traverse the list. New elements can be added to the list before | ||
| 87 | + * or after an existing element or at the head of the list. A list | ||
| 88 | + * may only be traversed in the forward direction. | ||
| 89 | + * | ||
| 90 | + * A simple queue is headed by a pair of pointers, one the head of the | ||
| 91 | + * list and the other to the tail of the list. The elements are singly | ||
| 92 | + * linked to save space, so elements can only be removed from the | ||
| 93 | + * head of the list. New elements can be added to the list after | ||
| 94 | + * an existing element, at the head of the list, or at the end of the | ||
| 95 | + * list. A simple queue may only be traversed in the forward direction. | ||
| 96 | + * | ||
| 97 | + * A tail queue is headed by a pair of pointers, one to the head of the | ||
| 98 | + * list and the other to the tail of the list. The elements are doubly | ||
| 99 | + * linked so that an arbitrary element can be removed without a need to | ||
| 100 | + * traverse the list. New elements can be added to the list before or | ||
| 101 | + * after an existing element, at the head of the list, or at the end of | ||
| 102 | + * the list. A tail queue may be traversed in either direction. | ||
| 103 | + * | ||
| 104 | + * A circle queue is headed by a pair of pointers, one to the head of the | ||
| 105 | + * list and the other to the tail of the list. The elements are doubly | ||
| 106 | + * linked so that an arbitrary element can be removed without a need to | ||
| 107 | + * traverse the list. New elements can be added to the list before or after | ||
| 108 | + * an existing element, at the head of the list, or at the end of the list. | ||
| 109 | + * A circle queue may be traversed in either direction, but has a more | ||
| 110 | + * complex end of list detection. | ||
| 111 | + * | ||
| 112 | + * For details on the use of these macros, see the queue(3) manual page. | ||
| 113 | + */ | ||
| 114 | + | ||
| 115 | +/* | ||
| 116 | + * Include the definition of NULL only on NetBSD because sys/null.h | ||
| 117 | + * is not available elsewhere. This conditional makes the header | ||
| 118 | + * portable and it can simply be dropped verbatim into any system. | ||
| 119 | + * The caveat is that on other systems some other header | ||
| 120 | + * must provide NULL before the macros can be used. | ||
| 121 | + */ | ||
| 122 | +#ifdef __NetBSD__ | ||
| 123 | +#include <sys/null.h> | ||
| 124 | +#endif | ||
| 125 | + | ||
| 126 | +#if defined(QUEUEDEBUG) | ||
| 127 | +# if defined(_KERNEL) | ||
| 128 | +# define QUEUEDEBUG_ABORT(...) panic(__VA_ARGS__) | ||
| 129 | +# else | ||
| 130 | +# include <err.h> | ||
| 131 | +# define QUEUEDEBUG_ABORT(...) err(1, __VA_ARGS__) | ||
| 132 | +# endif | ||
| 133 | +#endif | ||
| 134 | + | ||
| 135 | +/* | ||
| 136 | + * Singly-linked List definitions. | ||
| 137 | + */ | ||
| 138 | +#define SLIST_HEAD(name, type) \ | ||
| 139 | +struct name { \ | ||
| 140 | + struct type *slh_first; /* first element */ \ | ||
| 141 | +} | ||
| 142 | + | ||
| 143 | +#define SLIST_HEAD_INITIALIZER(head) \ | ||
| 144 | + { NULL } | ||
| 145 | + | ||
| 146 | +#define SLIST_ENTRY(type) \ | ||
| 147 | +struct { \ | ||
| 148 | + struct type *sle_next; /* next element */ \ | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +/* | ||
| 152 | + * Singly-linked List access methods. | ||
| 153 | + */ | ||
| 154 | +#define SLIST_FIRST(head) ((head)->slh_first) | ||
| 155 | +#define SLIST_END(head) NULL | ||
| 156 | +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) | ||
| 157 | +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) | ||
| 158 | + | ||
| 159 | +#define SLIST_FOREACH(var, head, field) \ | ||
| 160 | + for((var) = (head)->slh_first; \ | ||
| 161 | + (var) != SLIST_END(head); \ | ||
| 162 | + (var) = (var)->field.sle_next) | ||
| 163 | + | ||
| 164 | +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ | ||
| 165 | + for ((var) = SLIST_FIRST((head)); \ | ||
| 166 | + (var) != SLIST_END(head) && \ | ||
| 167 | + ((tvar) = SLIST_NEXT((var), field), 1); \ | ||
| 168 | + (var) = (tvar)) | ||
| 169 | + | ||
| 170 | +/* | ||
| 171 | + * Singly-linked List functions. | ||
| 172 | + */ | ||
| 173 | +#define SLIST_INIT(head) do { \ | ||
| 174 | + (head)->slh_first = SLIST_END(head); \ | ||
| 175 | +} while (/*CONSTCOND*/0) | ||
| 176 | + | ||
| 177 | +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ | ||
| 178 | + (elm)->field.sle_next = (slistelm)->field.sle_next; \ | ||
| 179 | + (slistelm)->field.sle_next = (elm); \ | ||
| 180 | +} while (/*CONSTCOND*/0) | ||
| 181 | + | ||
| 182 | +#define SLIST_INSERT_HEAD(head, elm, field) do { \ | ||
| 183 | + (elm)->field.sle_next = (head)->slh_first; \ | ||
| 184 | + (head)->slh_first = (elm); \ | ||
| 185 | +} while (/*CONSTCOND*/0) | ||
| 186 | + | ||
| 187 | +#define SLIST_REMOVE_AFTER(slistelm, field) do { \ | ||
| 188 | + (slistelm)->field.sle_next = \ | ||
| 189 | + SLIST_NEXT(SLIST_NEXT((slistelm), field), field); \ | ||
| 190 | +} while (/*CONSTCOND*/0) | ||
| 191 | + | ||
| 192 | +#define SLIST_REMOVE_HEAD(head, field) do { \ | ||
| 193 | + (head)->slh_first = (head)->slh_first->field.sle_next; \ | ||
| 194 | +} while (/*CONSTCOND*/0) | ||
| 195 | + | ||
| 196 | +#define SLIST_REMOVE(head, elm, type, field) do { \ | ||
| 197 | + if ((head)->slh_first == (elm)) { \ | ||
| 198 | + SLIST_REMOVE_HEAD((head), field); \ | ||
| 199 | + } \ | ||
| 200 | + else { \ | ||
| 201 | + struct type *curelm = (head)->slh_first; \ | ||
| 202 | + while(curelm->field.sle_next != (elm)) \ | ||
| 203 | + curelm = curelm->field.sle_next; \ | ||
| 204 | + curelm->field.sle_next = \ | ||
| 205 | + curelm->field.sle_next->field.sle_next; \ | ||
| 206 | + } \ | ||
| 207 | +} while (/*CONSTCOND*/0) | ||
| 208 | + | ||
| 209 | + | ||
| 210 | +/* | ||
| 211 | + * List definitions. | ||
| 212 | + */ | ||
| 213 | +#define LIST_HEAD(name, type) \ | ||
| 214 | +struct name { \ | ||
| 215 | + struct type *lh_first; /* first element */ \ | ||
| 216 | +} | ||
| 217 | + | ||
| 218 | +#define LIST_HEAD_INITIALIZER(head) \ | ||
| 219 | + { NULL } | ||
| 220 | + | ||
| 221 | +#define LIST_ENTRY(type) \ | ||
| 222 | +struct { \ | ||
| 223 | + struct type *le_next; /* next element */ \ | ||
| 224 | + struct type **le_prev; /* address of previous next element */ \ | ||
| 225 | +} | ||
| 226 | + | ||
| 227 | +/* | ||
| 228 | + * List access methods. | ||
| 229 | + */ | ||
| 230 | +#define LIST_FIRST(head) ((head)->lh_first) | ||
| 231 | +#define LIST_END(head) NULL | ||
| 232 | +#define LIST_EMPTY(head) ((head)->lh_first == LIST_END(head)) | ||
| 233 | +#define LIST_NEXT(elm, field) ((elm)->field.le_next) | ||
| 234 | + | ||
| 235 | +#define LIST_FOREACH(var, head, field) \ | ||
| 236 | + for ((var) = ((head)->lh_first); \ | ||
| 237 | + (var) != LIST_END(head); \ | ||
| 238 | + (var) = ((var)->field.le_next)) | ||
| 239 | + | ||
| 240 | +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ | ||
| 241 | + for ((var) = LIST_FIRST((head)); \ | ||
| 242 | + (var) != LIST_END(head) && \ | ||
| 243 | + ((tvar) = LIST_NEXT((var), field), 1); \ | ||
| 244 | + (var) = (tvar)) | ||
| 245 | + | ||
| 246 | +#define LIST_MOVE(head1, head2) do { \ | ||
| 247 | + LIST_INIT((head2)); \ | ||
| 248 | + if (!LIST_EMPTY((head1))) { \ | ||
| 249 | + (head2)->lh_first = (head1)->lh_first; \ | ||
| 250 | + LIST_INIT((head1)); \ | ||
| 251 | + } \ | ||
| 252 | +} while (/*CONSTCOND*/0) | ||
| 253 | + | ||
| 254 | +/* | ||
| 255 | + * List functions. | ||
| 256 | + */ | ||
| 257 | +#if defined(QUEUEDEBUG) | ||
| 258 | +#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) \ | ||
| 259 | + if ((head)->lh_first && \ | ||
| 260 | + (head)->lh_first->field.le_prev != &(head)->lh_first) \ | ||
| 261 | + QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head), \ | ||
| 262 | + __FILE__, __LINE__); | ||
| 263 | +#define QUEUEDEBUG_LIST_OP(elm, field) \ | ||
| 264 | + if ((elm)->field.le_next && \ | ||
| 265 | + (elm)->field.le_next->field.le_prev != \ | ||
| 266 | + &(elm)->field.le_next) \ | ||
| 267 | + QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm), \ | ||
| 268 | + __FILE__, __LINE__); \ | ||
| 269 | + if (*(elm)->field.le_prev != (elm)) \ | ||
| 270 | + QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm), \ | ||
| 271 | + __FILE__, __LINE__); | ||
| 272 | +#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) \ | ||
| 273 | + (elm)->field.le_next = (void *)1L; \ | ||
| 274 | + (elm)->field.le_prev = (void *)1L; | ||
| 275 | +#else | ||
| 276 | +#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) | ||
| 277 | +#define QUEUEDEBUG_LIST_OP(elm, field) | ||
| 278 | +#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) | ||
| 279 | +#endif | ||
| 280 | + | ||
| 281 | +#define LIST_INIT(head) do { \ | ||
| 282 | + (head)->lh_first = LIST_END(head); \ | ||
| 283 | +} while (/*CONSTCOND*/0) | ||
| 284 | + | ||
| 285 | +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ | ||
| 286 | + QUEUEDEBUG_LIST_OP((listelm), field) \ | ||
| 287 | + if (((elm)->field.le_next = (listelm)->field.le_next) != \ | ||
| 288 | + LIST_END(head)) \ | ||
| 289 | + (listelm)->field.le_next->field.le_prev = \ | ||
| 290 | + &(elm)->field.le_next; \ | ||
| 291 | + (listelm)->field.le_next = (elm); \ | ||
| 292 | + (elm)->field.le_prev = &(listelm)->field.le_next; \ | ||
| 293 | +} while (/*CONSTCOND*/0) | ||
| 294 | + | ||
| 295 | +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ | ||
| 296 | + QUEUEDEBUG_LIST_OP((listelm), field) \ | ||
| 297 | + (elm)->field.le_prev = (listelm)->field.le_prev; \ | ||
| 298 | + (elm)->field.le_next = (listelm); \ | ||
| 299 | + *(listelm)->field.le_prev = (elm); \ | ||
| 300 | + (listelm)->field.le_prev = &(elm)->field.le_next; \ | ||
| 301 | +} while (/*CONSTCOND*/0) | ||
| 302 | + | ||
| 303 | +#define LIST_INSERT_HEAD(head, elm, field) do { \ | ||
| 304 | + QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field) \ | ||
| 305 | + if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head))\ | ||
| 306 | + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ | ||
| 307 | + (head)->lh_first = (elm); \ | ||
| 308 | + (elm)->field.le_prev = &(head)->lh_first; \ | ||
| 309 | +} while (/*CONSTCOND*/0) | ||
| 310 | + | ||
| 311 | +#define LIST_REMOVE(elm, field) do { \ | ||
| 312 | + QUEUEDEBUG_LIST_OP((elm), field) \ | ||
| 313 | + if ((elm)->field.le_next != NULL) \ | ||
| 314 | + (elm)->field.le_next->field.le_prev = \ | ||
| 315 | + (elm)->field.le_prev; \ | ||
| 316 | + *(elm)->field.le_prev = (elm)->field.le_next; \ | ||
| 317 | + QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ | ||
| 318 | +} while (/*CONSTCOND*/0) | ||
| 319 | + | ||
| 320 | +#define LIST_REPLACE(elm, elm2, field) do { \ | ||
| 321 | + if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ | ||
| 322 | + (elm2)->field.le_next->field.le_prev = \ | ||
| 323 | + &(elm2)->field.le_next; \ | ||
| 324 | + (elm2)->field.le_prev = (elm)->field.le_prev; \ | ||
| 325 | + *(elm2)->field.le_prev = (elm2); \ | ||
| 326 | + QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ | ||
| 327 | +} while (/*CONSTCOND*/0) | ||
| 328 | + | ||
| 329 | +/* | ||
| 330 | + * Simple queue definitions. | ||
| 331 | + */ | ||
| 332 | +#define SIMPLEQ_HEAD(name, type) \ | ||
| 333 | +struct name { \ | ||
| 334 | + struct type *sqh_first; /* first element */ \ | ||
| 335 | + struct type **sqh_last; /* addr of last next element */ \ | ||
| 336 | +} | ||
| 337 | + | ||
| 338 | +#define SIMPLEQ_HEAD_INITIALIZER(head) \ | ||
| 339 | + { NULL, &(head).sqh_first } | ||
| 340 | + | ||
| 341 | +#define SIMPLEQ_ENTRY(type) \ | ||
| 342 | +struct { \ | ||
| 343 | + struct type *sqe_next; /* next element */ \ | ||
| 344 | +} | ||
| 345 | + | ||
| 346 | +/* | ||
| 347 | + * Simple queue access methods. | ||
| 348 | + */ | ||
| 349 | +#define SIMPLEQ_FIRST(head) ((head)->sqh_first) | ||
| 350 | +#define SIMPLEQ_END(head) NULL | ||
| 351 | +#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == SIMPLEQ_END(head)) | ||
| 352 | +#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) | ||
| 353 | + | ||
| 354 | +#define SIMPLEQ_FOREACH(var, head, field) \ | ||
| 355 | + for ((var) = ((head)->sqh_first); \ | ||
| 356 | + (var) != SIMPLEQ_END(head); \ | ||
| 357 | + (var) = ((var)->field.sqe_next)) | ||
| 358 | + | ||
| 359 | +#define SIMPLEQ_FOREACH_SAFE(var, head, field, next) \ | ||
| 360 | + for ((var) = ((head)->sqh_first); \ | ||
| 361 | + (var) != SIMPLEQ_END(head) && \ | ||
| 362 | + ((next = ((var)->field.sqe_next)), 1); \ | ||
| 363 | + (var) = (next)) | ||
| 364 | + | ||
| 365 | +/* | ||
| 366 | + * Simple queue functions. | ||
| 367 | + */ | ||
| 368 | +#define SIMPLEQ_INIT(head) do { \ | ||
| 369 | + (head)->sqh_first = NULL; \ | ||
| 370 | + (head)->sqh_last = &(head)->sqh_first; \ | ||
| 371 | +} while (/*CONSTCOND*/0) | ||
| 372 | + | ||
| 373 | +#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ | ||
| 374 | + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ | ||
| 375 | + (head)->sqh_last = &(elm)->field.sqe_next; \ | ||
| 376 | + (head)->sqh_first = (elm); \ | ||
| 377 | +} while (/*CONSTCOND*/0) | ||
| 378 | + | ||
| 379 | +#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ | ||
| 380 | + (elm)->field.sqe_next = NULL; \ | ||
| 381 | + *(head)->sqh_last = (elm); \ | ||
| 382 | + (head)->sqh_last = &(elm)->field.sqe_next; \ | ||
| 383 | +} while (/*CONSTCOND*/0) | ||
| 384 | + | ||
| 385 | +#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ | ||
| 386 | + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ | ||
| 387 | + (head)->sqh_last = &(elm)->field.sqe_next; \ | ||
| 388 | + (listelm)->field.sqe_next = (elm); \ | ||
| 389 | +} while (/*CONSTCOND*/0) | ||
| 390 | + | ||
| 391 | +#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ | ||
| 392 | + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ | ||
| 393 | + (head)->sqh_last = &(head)->sqh_first; \ | ||
| 394 | +} while (/*CONSTCOND*/0) | ||
| 395 | + | ||
| 396 | +#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \ | ||
| 397 | + if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \ | ||
| 398 | + == NULL) \ | ||
| 399 | + (head)->sqh_last = &(elm)->field.sqe_next; \ | ||
| 400 | +} while (/*CONSTCOND*/0) | ||
| 401 | + | ||
| 402 | +#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ | ||
| 403 | + if ((head)->sqh_first == (elm)) { \ | ||
| 404 | + SIMPLEQ_REMOVE_HEAD((head), field); \ | ||
| 405 | + } else { \ | ||
| 406 | + struct type *curelm = (head)->sqh_first; \ | ||
| 407 | + while (curelm->field.sqe_next != (elm)) \ | ||
| 408 | + curelm = curelm->field.sqe_next; \ | ||
| 409 | + if ((curelm->field.sqe_next = \ | ||
| 410 | + curelm->field.sqe_next->field.sqe_next) == NULL) \ | ||
| 411 | + (head)->sqh_last = &(curelm)->field.sqe_next; \ | ||
| 412 | + } \ | ||
| 413 | +} while (/*CONSTCOND*/0) | ||
| 414 | + | ||
| 415 | +#define SIMPLEQ_CONCAT(head1, head2) do { \ | ||
| 416 | + if (!SIMPLEQ_EMPTY((head2))) { \ | ||
| 417 | + *(head1)->sqh_last = (head2)->sqh_first; \ | ||
| 418 | + (head1)->sqh_last = (head2)->sqh_last; \ | ||
| 419 | + SIMPLEQ_INIT((head2)); \ | ||
| 420 | + } \ | ||
| 421 | +} while (/*CONSTCOND*/0) | ||
| 422 | + | ||
| 423 | +#define SIMPLEQ_LAST(head, type, field) \ | ||
| 424 | + (SIMPLEQ_EMPTY((head)) ? \ | ||
| 425 | + NULL : \ | ||
| 426 | + ((struct type *)(void *) \ | ||
| 427 | + ((char *)((head)->sqh_last) - offsetof(struct type, field)))) | ||
| 428 | + | ||
| 429 | +/* | ||
| 430 | + * Tail queue definitions. | ||
| 431 | + */ | ||
| 432 | +#define _TAILQ_HEAD(name, type, qual) \ | ||
| 433 | +struct name { \ | ||
| 434 | + qual type *tqh_first; /* first element */ \ | ||
| 435 | + qual type *qual *tqh_last; /* addr of last next element */ \ | ||
| 436 | +} | ||
| 437 | +#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) | ||
| 438 | + | ||
| 439 | +#define TAILQ_HEAD_INITIALIZER(head) \ | ||
| 440 | + { TAILQ_END(head), &(head).tqh_first } | ||
| 441 | + | ||
| 442 | +#define _TAILQ_ENTRY(type, qual) \ | ||
| 443 | +struct { \ | ||
| 444 | + qual type *tqe_next; /* next element */ \ | ||
| 445 | + qual type *qual *tqe_prev; /* address of previous next element */\ | ||
| 446 | +} | ||
| 447 | +#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) | ||
| 448 | + | ||
| 449 | +/* | ||
| 450 | + * Tail queue access methods. | ||
| 451 | + */ | ||
| 452 | +#define TAILQ_FIRST(head) ((head)->tqh_first) | ||
| 453 | +#define TAILQ_END(head) (NULL) | ||
| 454 | +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) | ||
| 455 | +#define TAILQ_LAST(head, headname) \ | ||
| 456 | + (*(((struct headname *)((head)->tqh_last))->tqh_last)) | ||
| 457 | +#define TAILQ_PREV(elm, headname, field) \ | ||
| 458 | + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) | ||
| 459 | +#define TAILQ_EMPTY(head) (TAILQ_FIRST(head) == TAILQ_END(head)) | ||
| 460 | + | ||
| 461 | + | ||
| 462 | +#define TAILQ_FOREACH(var, head, field) \ | ||
| 463 | + for ((var) = ((head)->tqh_first); \ | ||
| 464 | + (var) != TAILQ_END(head); \ | ||
| 465 | + (var) = ((var)->field.tqe_next)) | ||
| 466 | + | ||
| 467 | +#define TAILQ_FOREACH_SAFE(var, head, field, next) \ | ||
| 468 | + for ((var) = ((head)->tqh_first); \ | ||
| 469 | + (var) != TAILQ_END(head) && \ | ||
| 470 | + ((next) = TAILQ_NEXT(var, field), 1); (var) = (next)) | ||
| 471 | + | ||
| 472 | +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ | ||
| 473 | + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));\ | ||
| 474 | + (var) != TAILQ_END(head); \ | ||
| 475 | + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) | ||
| 476 | + | ||
| 477 | +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \ | ||
| 478 | + for ((var) = TAILQ_LAST((head), headname); \ | ||
| 479 | + (var) != TAILQ_END(head) && \ | ||
| 480 | + ((prev) = TAILQ_PREV((var), headname, field), 1); (var) = (prev)) | ||
| 481 | + | ||
| 482 | +/* | ||
| 483 | + * Tail queue functions. | ||
| 484 | + */ | ||
| 485 | +#if defined(QUEUEDEBUG) | ||
| 486 | +#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) \ | ||
| 487 | + if ((head)->tqh_first && \ | ||
| 488 | + (head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \ | ||
| 489 | + QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head), \ | ||
| 490 | + __FILE__, __LINE__); | ||
| 491 | +#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) \ | ||
| 492 | + if (*(head)->tqh_last != NULL) \ | ||
| 493 | + QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head), \ | ||
| 494 | + __FILE__, __LINE__); | ||
| 495 | +#define QUEUEDEBUG_TAILQ_OP(elm, field) \ | ||
| 496 | + if ((elm)->field.tqe_next && \ | ||
| 497 | + (elm)->field.tqe_next->field.tqe_prev != \ | ||
| 498 | + &(elm)->field.tqe_next) \ | ||
| 499 | + QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm), \ | ||
| 500 | + __FILE__, __LINE__); \ | ||
| 501 | + if (*(elm)->field.tqe_prev != (elm)) \ | ||
| 502 | + QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm), \ | ||
| 503 | + __FILE__, __LINE__); | ||
| 504 | +#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) \ | ||
| 505 | + if ((elm)->field.tqe_next == NULL && \ | ||
| 506 | + (head)->tqh_last != &(elm)->field.tqe_next) \ | ||
| 507 | + QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d",\ | ||
| 508 | + (head), (elm), __FILE__, __LINE__); | ||
| 509 | +#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) \ | ||
| 510 | + (elm)->field.tqe_next = (void *)1L; \ | ||
| 511 | + (elm)->field.tqe_prev = (void *)1L; | ||
| 512 | +#else | ||
| 513 | +#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) | ||
| 514 | +#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) | ||
| 515 | +#define QUEUEDEBUG_TAILQ_OP(elm, field) | ||
| 516 | +#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) | ||
| 517 | +#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) | ||
| 518 | +#endif | ||
| 519 | + | ||
| 520 | +#define TAILQ_INIT(head) do { \ | ||
| 521 | + (head)->tqh_first = TAILQ_END(head); \ | ||
| 522 | + (head)->tqh_last = &(head)->tqh_first; \ | ||
| 523 | +} while (/*CONSTCOND*/0) | ||
| 524 | + | ||
| 525 | +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ | ||
| 526 | + QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field) \ | ||
| 527 | + if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head))\ | ||
| 528 | + (head)->tqh_first->field.tqe_prev = \ | ||
| 529 | + &(elm)->field.tqe_next; \ | ||
| 530 | + else \ | ||
| 531 | + (head)->tqh_last = &(elm)->field.tqe_next; \ | ||
| 532 | + (head)->tqh_first = (elm); \ | ||
| 533 | + (elm)->field.tqe_prev = &(head)->tqh_first; \ | ||
| 534 | +} while (/*CONSTCOND*/0) | ||
| 535 | + | ||
| 536 | +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ | ||
| 537 | + QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field) \ | ||
| 538 | + (elm)->field.tqe_next = TAILQ_END(head); \ | ||
| 539 | + (elm)->field.tqe_prev = (head)->tqh_last; \ | ||
| 540 | + *(head)->tqh_last = (elm); \ | ||
| 541 | + (head)->tqh_last = &(elm)->field.tqe_next; \ | ||
| 542 | +} while (/*CONSTCOND*/0) | ||
| 543 | + | ||
| 544 | +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ | ||
| 545 | + QUEUEDEBUG_TAILQ_OP((listelm), field) \ | ||
| 546 | + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != \ | ||
| 547 | + TAILQ_END(head)) \ | ||
| 548 | + (elm)->field.tqe_next->field.tqe_prev = \ | ||
| 549 | + &(elm)->field.tqe_next; \ | ||
| 550 | + else \ | ||
| 551 | + (head)->tqh_last = &(elm)->field.tqe_next; \ | ||
| 552 | + (listelm)->field.tqe_next = (elm); \ | ||
| 553 | + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ | ||
| 554 | +} while (/*CONSTCOND*/0) | ||
| 555 | + | ||
| 556 | +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ | ||
| 557 | + QUEUEDEBUG_TAILQ_OP((listelm), field) \ | ||
| 558 | + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ | ||
| 559 | + (elm)->field.tqe_next = (listelm); \ | ||
| 560 | + *(listelm)->field.tqe_prev = (elm); \ | ||
| 561 | + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ | ||
| 562 | +} while (/*CONSTCOND*/0) | ||
| 563 | + | ||
| 564 | +#define TAILQ_REMOVE(head, elm, field) do { \ | ||
| 565 | + QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field) \ | ||
| 566 | + QUEUEDEBUG_TAILQ_OP((elm), field) \ | ||
| 567 | + if (((elm)->field.tqe_next) != TAILQ_END(head)) \ | ||
| 568 | + (elm)->field.tqe_next->field.tqe_prev = \ | ||
| 569 | + (elm)->field.tqe_prev; \ | ||
| 570 | + else \ | ||
| 571 | + (head)->tqh_last = (elm)->field.tqe_prev; \ | ||
| 572 | + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ | ||
| 573 | + QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ | ||
| 574 | +} while (/*CONSTCOND*/0) | ||
| 575 | + | ||
| 576 | +#define TAILQ_REPLACE(head, elm, elm2, field) do { \ | ||
| 577 | + if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != \ | ||
| 578 | + TAILQ_END(head)) \ | ||
| 579 | + (elm2)->field.tqe_next->field.tqe_prev = \ | ||
| 580 | + &(elm2)->field.tqe_next; \ | ||
| 581 | + else \ | ||
| 582 | + (head)->tqh_last = &(elm2)->field.tqe_next; \ | ||
| 583 | + (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ | ||
| 584 | + *(elm2)->field.tqe_prev = (elm2); \ | ||
| 585 | + QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ | ||
| 586 | +} while (/*CONSTCOND*/0) | ||
| 587 | + | ||
| 588 | +#define TAILQ_CONCAT(head1, head2, field) do { \ | ||
| 589 | + if (!TAILQ_EMPTY(head2)) { \ | ||
| 590 | + *(head1)->tqh_last = (head2)->tqh_first; \ | ||
| 591 | + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ | ||
| 592 | + (head1)->tqh_last = (head2)->tqh_last; \ | ||
| 593 | + TAILQ_INIT((head2)); \ | ||
| 594 | + } \ | ||
| 595 | +} while (/*CONSTCOND*/0) | ||
| 596 | + | ||
| 597 | +/* | ||
| 598 | + * Singly-linked Tail queue declarations. | ||
| 599 | + */ | ||
| 600 | +#define STAILQ_HEAD(name, type) \ | ||
| 601 | +struct name { \ | ||
| 602 | + struct type *stqh_first; /* first element */ \ | ||
| 603 | + struct type **stqh_last; /* addr of last next element */ \ | ||
| 604 | +} | ||
| 605 | + | ||
| 606 | +#define STAILQ_HEAD_INITIALIZER(head) \ | ||
| 607 | + { NULL, &(head).stqh_first } | ||
| 608 | + | ||
| 609 | +#define STAILQ_ENTRY(type) \ | ||
| 610 | +struct { \ | ||
| 611 | + struct type *stqe_next; /* next element */ \ | ||
| 612 | +} | ||
| 613 | + | ||
| 614 | +/* | ||
| 615 | + * Singly-linked Tail queue access methods. | ||
| 616 | + */ | ||
| 617 | +#define STAILQ_FIRST(head) ((head)->stqh_first) | ||
| 618 | +#define STAILQ_END(head) NULL | ||
| 619 | +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) | ||
| 620 | +#define STAILQ_EMPTY(head) (STAILQ_FIRST(head) == STAILQ_END(head)) | ||
| 621 | + | ||
| 622 | +/* | ||
| 623 | + * Singly-linked Tail queue functions. | ||
| 624 | + */ | ||
| 625 | +#define STAILQ_INIT(head) do { \ | ||
| 626 | + (head)->stqh_first = NULL; \ | ||
| 627 | + (head)->stqh_last = &(head)->stqh_first; \ | ||
| 628 | +} while (/*CONSTCOND*/0) | ||
| 629 | + | ||
| 630 | +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ | ||
| 631 | + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ | ||
| 632 | + (head)->stqh_last = &(elm)->field.stqe_next; \ | ||
| 633 | + (head)->stqh_first = (elm); \ | ||
| 634 | +} while (/*CONSTCOND*/0) | ||
| 635 | + | ||
| 636 | +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ | ||
| 637 | + (elm)->field.stqe_next = NULL; \ | ||
| 638 | + *(head)->stqh_last = (elm); \ | ||
| 639 | + (head)->stqh_last = &(elm)->field.stqe_next; \ | ||
| 640 | +} while (/*CONSTCOND*/0) | ||
| 641 | + | ||
| 642 | +#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ | ||
| 643 | + if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ | ||
| 644 | + (head)->stqh_last = &(elm)->field.stqe_next; \ | ||
| 645 | + (listelm)->field.stqe_next = (elm); \ | ||
| 646 | +} while (/*CONSTCOND*/0) | ||
| 647 | + | ||
| 648 | +#define STAILQ_REMOVE_HEAD(head, field) do { \ | ||
| 649 | + if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ | ||
| 650 | + (head)->stqh_last = &(head)->stqh_first; \ | ||
| 651 | +} while (/*CONSTCOND*/0) | ||
| 652 | + | ||
| 653 | +#define STAILQ_REMOVE(head, elm, type, field) do { \ | ||
| 654 | + if ((head)->stqh_first == (elm)) { \ | ||
| 655 | + STAILQ_REMOVE_HEAD((head), field); \ | ||
| 656 | + } else { \ | ||
| 657 | + struct type *curelm = (head)->stqh_first; \ | ||
| 658 | + while (curelm->field.stqe_next != (elm)) \ | ||
| 659 | + curelm = curelm->field.stqe_next; \ | ||
| 660 | + if ((curelm->field.stqe_next = \ | ||
| 661 | + curelm->field.stqe_next->field.stqe_next) == NULL) \ | ||
| 662 | + (head)->stqh_last = &(curelm)->field.stqe_next; \ | ||
| 663 | + } \ | ||
| 664 | +} while (/*CONSTCOND*/0) | ||
| 665 | + | ||
| 666 | +#define STAILQ_FOREACH(var, head, field) \ | ||
| 667 | + for ((var) = ((head)->stqh_first); \ | ||
| 668 | + (var); \ | ||
| 669 | + (var) = ((var)->field.stqe_next)) | ||
| 670 | + | ||
| 671 | +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ | ||
| 672 | + for ((var) = STAILQ_FIRST((head)); \ | ||
| 673 | + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ | ||
| 674 | + (var) = (tvar)) | ||
| 675 | + | ||
| 676 | +#define STAILQ_CONCAT(head1, head2) do { \ | ||
| 677 | + if (!STAILQ_EMPTY((head2))) { \ | ||
| 678 | + *(head1)->stqh_last = (head2)->stqh_first; \ | ||
| 679 | + (head1)->stqh_last = (head2)->stqh_last; \ | ||
| 680 | + STAILQ_INIT((head2)); \ | ||
| 681 | + } \ | ||
| 682 | +} while (/*CONSTCOND*/0) | ||
| 683 | + | ||
| 684 | +#define STAILQ_LAST(head, type, field) \ | ||
| 685 | + (STAILQ_EMPTY((head)) ? \ | ||
| 686 | + NULL : \ | ||
| 687 | + ((struct type *)(void *) \ | ||
| 688 | + ((char *)((head)->stqh_last) - offsetof(struct type, field)))) | ||
| 689 | + | ||
| 690 | + | ||
| 691 | +#ifndef _KERNEL | ||
| 692 | +/* | ||
| 693 | + * Circular queue definitions. Do not use. We still keep the macros | ||
| 694 | + * for compatibility but because of pointer aliasing issues their use | ||
| 695 | + * is discouraged! | ||
| 696 | + */ | ||
| 697 | + | ||
| 698 | +/* | ||
| 699 | + * __launder_type(): We use this ugly hack to work around the the compiler | ||
| 700 | + * noticing that two types may not alias each other and elide tests in code. | ||
| 701 | + * We hit this in the CIRCLEQ macros when comparing 'struct name *' and | ||
| 702 | + * 'struct type *' (see CIRCLEQ_HEAD()). Modern compilers (such as GCC | ||
| 703 | + * 4.8) declare these comparisons as always false, causing the code to | ||
| 704 | + * not run as designed. | ||
| 705 | + * | ||
| 706 | + * This hack is only to be used for comparisons and thus can be fully const. | ||
| 707 | + * Do not use for assignment. | ||
| 708 | + * | ||
| 709 | + * If we ever choose to change the ABI of the CIRCLEQ macros, we could fix | ||
| 710 | + * this by changing the head/tail sentinal values, but see the note above | ||
| 711 | + * this one. | ||
| 712 | + */ | ||
| 713 | +static __inline const void * __launder_type(const void *); | ||
| 714 | +static __inline const void * | ||
| 715 | +__launder_type(const void *__x) | ||
| 716 | +{ | ||
| 717 | + __asm __volatile("" : "+r" (__x)); | ||
| 718 | + return __x; | ||
| 719 | +} | ||
| 720 | + | ||
| 721 | +#if defined(QUEUEDEBUG) | ||
| 722 | +#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field) \ | ||
| 723 | + if ((head)->cqh_first != CIRCLEQ_ENDC(head) && \ | ||
| 724 | + (head)->cqh_first->field.cqe_prev != CIRCLEQ_ENDC(head)) \ | ||
| 725 | + QUEUEDEBUG_ABORT("CIRCLEQ head forw %p %s:%d", (head), \ | ||
| 726 | + __FILE__, __LINE__); \ | ||
| 727 | + if ((head)->cqh_last != CIRCLEQ_ENDC(head) && \ | ||
| 728 | + (head)->cqh_last->field.cqe_next != CIRCLEQ_ENDC(head)) \ | ||
| 729 | + QUEUEDEBUG_ABORT("CIRCLEQ head back %p %s:%d", (head), \ | ||
| 730 | + __FILE__, __LINE__); | ||
| 731 | +#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field) \ | ||
| 732 | + if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) { \ | ||
| 733 | + if ((head)->cqh_last != (elm)) \ | ||
| 734 | + QUEUEDEBUG_ABORT("CIRCLEQ elm last %p %s:%d", \ | ||
| 735 | + (elm), __FILE__, __LINE__); \ | ||
| 736 | + } else { \ | ||
| 737 | + if ((elm)->field.cqe_next->field.cqe_prev != (elm)) \ | ||
| 738 | + QUEUEDEBUG_ABORT("CIRCLEQ elm forw %p %s:%d", \ | ||
| 739 | + (elm), __FILE__, __LINE__); \ | ||
| 740 | + } \ | ||
| 741 | + if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) { \ | ||
| 742 | + if ((head)->cqh_first != (elm)) \ | ||
| 743 | + QUEUEDEBUG_ABORT("CIRCLEQ elm first %p %s:%d", \ | ||
| 744 | + (elm), __FILE__, __LINE__); \ | ||
| 745 | + } else { \ | ||
| 746 | + if ((elm)->field.cqe_prev->field.cqe_next != (elm)) \ | ||
| 747 | + QUEUEDEBUG_ABORT("CIRCLEQ elm prev %p %s:%d", \ | ||
| 748 | + (elm), __FILE__, __LINE__); \ | ||
| 749 | + } | ||
| 750 | +#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field) \ | ||
| 751 | + (elm)->field.cqe_next = (void *)1L; \ | ||
| 752 | + (elm)->field.cqe_prev = (void *)1L; | ||
| 753 | +#else | ||
| 754 | +#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field) | ||
| 755 | +#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field) | ||
| 756 | +#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field) | ||
| 757 | +#endif | ||
| 758 | + | ||
| 759 | +#define CIRCLEQ_HEAD(name, type) \ | ||
| 760 | +struct name { \ | ||
| 761 | + struct type *cqh_first; /* first element */ \ | ||
| 762 | + struct type *cqh_last; /* last element */ \ | ||
| 763 | +} | ||
| 764 | + | ||
| 765 | +#define CIRCLEQ_HEAD_INITIALIZER(head) \ | ||
| 766 | + { CIRCLEQ_END(&head), CIRCLEQ_END(&head) } | ||
| 767 | + | ||
| 768 | +#define CIRCLEQ_ENTRY(type) \ | ||
| 769 | +struct { \ | ||
| 770 | + struct type *cqe_next; /* next element */ \ | ||
| 771 | + struct type *cqe_prev; /* previous element */ \ | ||
| 772 | +} | ||
| 773 | + | ||
| 774 | +/* | ||
| 775 | + * Circular queue functions. | ||
| 776 | + */ | ||
| 777 | +#define CIRCLEQ_INIT(head) do { \ | ||
| 778 | + (head)->cqh_first = CIRCLEQ_END(head); \ | ||
| 779 | + (head)->cqh_last = CIRCLEQ_END(head); \ | ||
| 780 | +} while (/*CONSTCOND*/0) | ||
| 781 | + | ||
| 782 | +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ | ||
| 783 | + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ | ||
| 784 | + QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field) \ | ||
| 785 | + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ | ||
| 786 | + (elm)->field.cqe_prev = (listelm); \ | ||
| 787 | + if ((listelm)->field.cqe_next == CIRCLEQ_ENDC(head)) \ | ||
| 788 | + (head)->cqh_last = (elm); \ | ||
| 789 | + else \ | ||
| 790 | + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ | ||
| 791 | + (listelm)->field.cqe_next = (elm); \ | ||
| 792 | +} while (/*CONSTCOND*/0) | ||
| 793 | + | ||
| 794 | +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ | ||
| 795 | + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ | ||
| 796 | + QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field) \ | ||
| 797 | + (elm)->field.cqe_next = (listelm); \ | ||
| 798 | + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ | ||
| 799 | + if ((listelm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \ | ||
| 800 | + (head)->cqh_first = (elm); \ | ||
| 801 | + else \ | ||
| 802 | + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ | ||
| 803 | + (listelm)->field.cqe_prev = (elm); \ | ||
| 804 | +} while (/*CONSTCOND*/0) | ||
| 805 | + | ||
| 806 | +#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ | ||
| 807 | + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ | ||
| 808 | + (elm)->field.cqe_next = (head)->cqh_first; \ | ||
| 809 | + (elm)->field.cqe_prev = CIRCLEQ_END(head); \ | ||
| 810 | + if ((head)->cqh_last == CIRCLEQ_ENDC(head)) \ | ||
| 811 | + (head)->cqh_last = (elm); \ | ||
| 812 | + else \ | ||
| 813 | + (head)->cqh_first->field.cqe_prev = (elm); \ | ||
| 814 | + (head)->cqh_first = (elm); \ | ||
| 815 | +} while (/*CONSTCOND*/0) | ||
| 816 | + | ||
| 817 | +#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ | ||
| 818 | + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ | ||
| 819 | + (elm)->field.cqe_next = CIRCLEQ_END(head); \ | ||
| 820 | + (elm)->field.cqe_prev = (head)->cqh_last; \ | ||
| 821 | + if ((head)->cqh_first == CIRCLEQ_ENDC(head)) \ | ||
| 822 | + (head)->cqh_first = (elm); \ | ||
| 823 | + else \ | ||
| 824 | + (head)->cqh_last->field.cqe_next = (elm); \ | ||
| 825 | + (head)->cqh_last = (elm); \ | ||
| 826 | +} while (/*CONSTCOND*/0) | ||
| 827 | + | ||
| 828 | +#define CIRCLEQ_REMOVE(head, elm, field) do { \ | ||
| 829 | + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ | ||
| 830 | + QUEUEDEBUG_CIRCLEQ_ELM((head), (elm), field) \ | ||
| 831 | + if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) \ | ||
| 832 | + (head)->cqh_last = (elm)->field.cqe_prev; \ | ||
| 833 | + else \ | ||
| 834 | + (elm)->field.cqe_next->field.cqe_prev = \ | ||
| 835 | + (elm)->field.cqe_prev; \ | ||
| 836 | + if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \ | ||
| 837 | + (head)->cqh_first = (elm)->field.cqe_next; \ | ||
| 838 | + else \ | ||
| 839 | + (elm)->field.cqe_prev->field.cqe_next = \ | ||
| 840 | + (elm)->field.cqe_next; \ | ||
| 841 | + QUEUEDEBUG_CIRCLEQ_POSTREMOVE((elm), field) \ | ||
| 842 | +} while (/*CONSTCOND*/0) | ||
| 843 | + | ||
| 844 | +#define CIRCLEQ_FOREACH(var, head, field) \ | ||
| 845 | + for ((var) = ((head)->cqh_first); \ | ||
| 846 | + (var) != CIRCLEQ_ENDC(head); \ | ||
| 847 | + (var) = ((var)->field.cqe_next)) | ||
| 848 | + | ||
| 849 | +#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ | ||
| 850 | + for ((var) = ((head)->cqh_last); \ | ||
| 851 | + (var) != CIRCLEQ_ENDC(head); \ | ||
| 852 | + (var) = ((var)->field.cqe_prev)) | ||
| 853 | + | ||
| 854 | +/* | ||
| 855 | + * Circular queue access methods. | ||
| 856 | + */ | ||
| 857 | +#define CIRCLEQ_FIRST(head) ((head)->cqh_first) | ||
| 858 | +#define CIRCLEQ_LAST(head) ((head)->cqh_last) | ||
| 859 | +/* For comparisons */ | ||
| 860 | +#define CIRCLEQ_ENDC(head) (__launder_type(head)) | ||
| 861 | +/* For assignments */ | ||
| 862 | +#define CIRCLEQ_END(head) ((void *)(head)) | ||
| 863 | +#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) | ||
| 864 | +#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) | ||
| 865 | +#define CIRCLEQ_EMPTY(head) \ | ||
| 866 | + (CIRCLEQ_FIRST(head) == CIRCLEQ_ENDC(head)) | ||
| 867 | + | ||
| 868 | +#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ | ||
| 869 | + (((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) \ | ||
| 870 | + ? ((head)->cqh_first) \ | ||
| 871 | + : (elm->field.cqe_next)) | ||
| 872 | +#define CIRCLEQ_LOOP_PREV(head, elm, field) \ | ||
| 873 | + (((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \ | ||
| 874 | + ? ((head)->cqh_last) \ | ||
| 875 | + : (elm->field.cqe_prev)) | ||
| 876 | +#endif /* !_KERNEL */ | ||
| 877 | + | ||
| 878 | +#endif /* !_SYS_QUEUE_H_ */ | ||
diff --git a/meta/recipes-extended/libtirpc/libtirpc/export_key_secretkey_is_set.patch b/meta/recipes-extended/libtirpc/libtirpc/export_key_secretkey_is_set.patch deleted file mode 100644 index d7f4968669..0000000000 --- a/meta/recipes-extended/libtirpc/libtirpc/export_key_secretkey_is_set.patch +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | Upstream-Status: Backport | ||
| 2 | Signed-off-by: Ross Burton <ross.burton@intel.com> | ||
| 3 | |||
| 4 | From e51d67549b516b2dac6c71d92c8499f6e67125ad Mon Sep 17 00:00:00 2001 | ||
| 5 | From: Thorsten Kukuk <kukuk@thkukuk.de> | ||
| 6 | Date: Tue, 14 Nov 2017 10:43:53 -0500 | ||
| 7 | Subject: [PATCH] Fix typo in src/libtirpc.map | ||
| 8 | |||
| 9 | Which prevents that key_secretkey_is_set will be exported. | ||
| 10 | |||
| 11 | Signed-off-by: Thorsten Kukuk <kukuk@suse.de> | ||
| 12 | Signed-off-by: Steve Dickson <steved@redhat.com> | ||
| 13 | --- | ||
| 14 | src/libtirpc.map | 2 +- | ||
| 15 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 16 | |||
| 17 | diff --git a/src/libtirpc.map b/src/libtirpc.map | ||
| 18 | index f385de5..21d6065 100644 | ||
| 19 | --- a/src/libtirpc.map | ||
| 20 | +++ b/src/libtirpc.map | ||
| 21 | @@ -298,7 +298,7 @@ TIRPC_0.3.2 { | ||
| 22 | key_gendes; | ||
| 23 | key_get_conv; | ||
| 24 | key_setsecret; | ||
| 25 | - key_secret_is_set; | ||
| 26 | + key_secretkey_is_set; | ||
| 27 | key_setnet; | ||
| 28 | netname2host; | ||
| 29 | netname2user; | ||
| 30 | -- | ||
| 31 | 1.8.3.1 | ||
diff --git a/meta/recipes-extended/libtirpc/libtirpc/libtirpc-1.0.4-rc1.patch b/meta/recipes-extended/libtirpc/libtirpc/libtirpc-1.0.4-rc1.patch new file mode 100644 index 0000000000..6d40d3cce8 --- /dev/null +++ b/meta/recipes-extended/libtirpc/libtirpc/libtirpc-1.0.4-rc1.patch | |||
| @@ -0,0 +1,103 @@ | |||
| 1 | Patch from Fedora https://src.fedoraproject.org/rpms/libtirpc/raw/master/f/libtirpc-1.0.4-rc1.patch | ||
| 2 | |||
| 3 | Upstream-Status: Backport | ||
| 4 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
| 5 | |||
| 6 | diff --git a/src/clnt_generic.c b/src/clnt_generic.c | ||
| 7 | index e5a314f..3f3dabf 100644 | ||
| 8 | --- a/src/clnt_generic.c | ||
| 9 | +++ b/src/clnt_generic.c | ||
| 10 | @@ -47,7 +47,6 @@ | ||
| 11 | |||
| 12 | extern bool_t __rpc_is_local_host(const char *); | ||
| 13 | int __rpc_raise_fd(int); | ||
| 14 | -extern int __binddynport(int fd); | ||
| 15 | |||
| 16 | #ifndef NETIDLEN | ||
| 17 | #define NETIDLEN 32 | ||
| 18 | @@ -341,8 +340,7 @@ clnt_tli_create(int fd, const struct netconfig *nconf, | ||
| 19 | servtype = nconf->nc_semantics; | ||
| 20 | if (!__rpc_fd2sockinfo(fd, &si)) | ||
| 21 | goto err; | ||
| 22 | - if (__binddynport(fd) == -1) | ||
| 23 | - goto err; | ||
| 24 | + bindresvport(fd, NULL); | ||
| 25 | } else { | ||
| 26 | if (!__rpc_fd2sockinfo(fd, &si)) | ||
| 27 | goto err; | ||
| 28 | diff --git a/src/rpc_soc.c b/src/rpc_soc.c | ||
| 29 | index af6c482..5a6eeb7 100644 | ||
| 30 | --- a/src/rpc_soc.c | ||
| 31 | +++ b/src/rpc_soc.c | ||
| 32 | @@ -67,8 +67,6 @@ | ||
| 33 | |||
| 34 | extern mutex_t rpcsoc_lock; | ||
| 35 | |||
| 36 | -extern int __binddynport(int fd); | ||
| 37 | - | ||
| 38 | static CLIENT *clnt_com_create(struct sockaddr_in *, rpcprog_t, rpcvers_t, | ||
| 39 | int *, u_int, u_int, char *, int); | ||
| 40 | static SVCXPRT *svc_com_create(int, u_int, u_int, char *); | ||
| 41 | @@ -147,8 +145,7 @@ clnt_com_create(raddr, prog, vers, sockp, sendsz, recvsz, tp, flags) | ||
| 42 | bindaddr.maxlen = bindaddr.len = sizeof (struct sockaddr_in); | ||
| 43 | bindaddr.buf = raddr; | ||
| 44 | |||
| 45 | - if (__binddynport(fd) == -1) | ||
| 46 | - goto err; | ||
| 47 | + bindresvport(fd, NULL); | ||
| 48 | cl = clnt_tli_create(fd, nconf, &bindaddr, prog, vers, | ||
| 49 | sendsz, recvsz); | ||
| 50 | if (cl) { | ||
| 51 | diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c | ||
| 52 | index a94fc73..4b44364 100644 | ||
| 53 | --- a/src/rpcb_clnt.c | ||
| 54 | +++ b/src/rpcb_clnt.c | ||
| 55 | @@ -752,7 +752,7 @@ __try_protocol_version_2(program, version, nconf, host, tp) | ||
| 56 | |||
| 57 | client = getpmaphandle(nconf, host, &parms.r_addr); | ||
| 58 | if (client == NULL) | ||
| 59 | - return (NULL); | ||
| 60 | + goto error; | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Set retry timeout. | ||
| 64 | @@ -771,11 +771,11 @@ __try_protocol_version_2(program, version, nconf, host, tp) | ||
| 65 | if (clnt_st != RPC_SUCCESS) { | ||
| 66 | rpc_createerr.cf_stat = RPC_PMAPFAILURE; | ||
| 67 | clnt_geterr(client, &rpc_createerr.cf_error); | ||
| 68 | - return (NULL); | ||
| 69 | + goto error; | ||
| 70 | } else if (port == 0) { | ||
| 71 | pmapaddress = NULL; | ||
| 72 | rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED; | ||
| 73 | - return (NULL); | ||
| 74 | + goto error; | ||
| 75 | } | ||
| 76 | port = htons(port); | ||
| 77 | CLNT_CONTROL(client, CLGET_SVC_ADDR, (char *)&remote); | ||
| 78 | @@ -789,14 +789,24 @@ __try_protocol_version_2(program, version, nconf, host, tp) | ||
| 79 | free(pmapaddress); | ||
| 80 | pmapaddress = NULL; | ||
| 81 | } | ||
| 82 | - return (NULL); | ||
| 83 | + goto error; | ||
| 84 | } | ||
| 85 | memcpy(pmapaddress->buf, remote.buf, remote.len); | ||
| 86 | memcpy(&((char *)pmapaddress->buf)[sizeof (short)], | ||
| 87 | (char *)(void *)&port, sizeof (short)); | ||
| 88 | pmapaddress->len = pmapaddress->maxlen = remote.len; | ||
| 89 | |||
| 90 | + CLNT_DESTROY(client); | ||
| 91 | return pmapaddress; | ||
| 92 | + | ||
| 93 | +error: | ||
| 94 | + if (client) { | ||
| 95 | + CLNT_DESTROY(client); | ||
| 96 | + client = NULL; | ||
| 97 | + | ||
| 98 | + } | ||
| 99 | + return (NULL); | ||
| 100 | + | ||
| 101 | } | ||
| 102 | #endif | ||
| 103 | |||
diff --git a/meta/recipes-extended/libtirpc/libtirpc/musl.patch b/meta/recipes-extended/libtirpc/libtirpc/musl.patch new file mode 100644 index 0000000000..0c3ce603ea --- /dev/null +++ b/meta/recipes-extended/libtirpc/libtirpc/musl.patch | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | Consider musl provided built-in defines | ||
| 2 | |||
| 3 | Helps compile libtirpc with musl | ||
| 4 | |||
| 5 | Upstream-Status: Pending | ||
| 6 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
| 7 | |||
| 8 | --- ./tirpc/rpc/types.h.orig 2018-03-17 10:23:10.022055255 +0100 | ||
| 9 | +++ ./tirpc/rpc/types.h 2018-03-17 10:23:30.877751656 +0100 | ||
| 10 | @@ -66,7 +66,7 @@ | ||
| 11 | #define mem_free(ptr, bsize) free(ptr) | ||
| 12 | |||
| 13 | |||
| 14 | -#if defined __APPLE_CC__ || defined __FreeBSD__ | ||
| 15 | +#if defined __APPLE_CC__ || defined __FreeBSD__ || !defined(__GLIBC__) | ||
| 16 | # define __u_char_defined | ||
| 17 | # define __daddr_t_defined | ||
| 18 | #endif | ||
diff --git a/meta/recipes-extended/libtirpc/libtirpc_1.0.2.bb b/meta/recipes-extended/libtirpc/libtirpc_1.0.3.bb index 99212600e0..17bc038d67 100644 --- a/meta/recipes-extended/libtirpc/libtirpc_1.0.2.bb +++ b/meta/recipes-extended/libtirpc/libtirpc_1.0.3.bb | |||
| @@ -10,17 +10,12 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f835cce8852481e4b2bbbdd23b5e47f3 \ | |||
| 10 | PROVIDES = "virtual/librpc" | 10 | PROVIDES = "virtual/librpc" |
| 11 | 11 | ||
| 12 | SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2 \ | 12 | SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2 \ |
| 13 | file://export_key_secretkey_is_set.patch \ | 13 | file://libtirpc-1.0.4-rc1.patch \ |
| 14 | file://0001-replace-__bzero-with-memset-API.patch \ | 14 | file://musl.patch \ |
| 15 | file://0001-include-stdint.h-for-uintptr_t.patch \ | ||
| 16 | " | 15 | " |
| 17 | 16 | ||
| 18 | SRC_URI_append_libc-musl = " \ | 17 | SRC_URI[md5sum] = "f8403a10695348854e71d525c4db5931" |
| 19 | file://Use-netbsd-queue.h.patch \ | 18 | SRC_URI[sha256sum] = "86c3a78fc1bddefa96111dd233124c703b22a78884203c55c3e06b3be6a0fd5e" |
| 20 | " | ||
| 21 | |||
| 22 | SRC_URI[md5sum] = "d5a37f1dccec484f9cabe2b97e54e9a6" | ||
| 23 | SRC_URI[sha256sum] = "723c5ce92706cbb601a8db09110df1b4b69391643158f20ff587e20e7c5f90f5" | ||
| 24 | 19 | ||
| 25 | inherit autotools pkgconfig | 20 | inherit autotools pkgconfig |
| 26 | 21 | ||
