diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-07-03 20:31:23 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-07-03 20:57:28 +0200 |
commit | f30a54b21b83f254533c59ca72ad17af5249c6be (patch) | |
tree | 174c6e8b77d8fc1514f4108e3290b91d19d838a6 /resolv/resolv_conf.h | |
parent | 352f4ff9a268b81ef5d4b2413f582565806e4790 (diff) | |
download | glibc-f30a54b21b83f254533c59ca72ad17af5249c6be.tar.gz glibc-f30a54b21b83f254533c59ca72ad17af5249c6be.tar.xz glibc-f30a54b21b83f254533c59ca72ad17af5249c6be.zip |
resolv: Introduce struct resolv_conf with extended resolver state
This change provides additional resolver configuration state which is not exposed through the _res ABI. It reuses the existing initstamp field in the supposedly-private part of _res. Some effort is undertaken to avoid memory safety issues introduced by applications which directly patch the _res object. With this commit, only the initstamp field is moved into struct resolv_conf. Additional members will be added later, eventually migrating the entire resolver configuration.
Diffstat (limited to 'resolv/resolv_conf.h')
-rw-r--r-- | resolv/resolv_conf.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/resolv/resolv_conf.h b/resolv/resolv_conf.h new file mode 100644 index 0000000000..48f92d6d57 --- /dev/null +++ b/resolv/resolv_conf.h @@ -0,0 +1,69 @@ +/* Extended resolver state separate from struct __res_state. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef RESOLV_STATE_H +#define RESOLV_STATE_H + +#include <stdbool.h> +#include <stddef.h> + +/* Extended resolver state associated with res_state objects. Client + code can reach this state through a struct resolv_context + object. */ +struct resolv_conf +{ + /* Used to propagate the effect of res_init across threads. This + member is mutable and prevents sharing of the same struct + resolv_conf object among multiple struct __res_state objects. */ + unsigned long long int initstamp; + + /* Reference counter. The object is deallocated once it reaches + zero. For internal use within resolv_conf only. */ + size_t __refcount; +}; + +/* The functions below are for use by the res_init resolv.conf parser + and the struct resolv_context facility. */ + +struct __res_state; + +/* Return the extended resolver state for *RESP, or NULL if it cannot + be determined. A call to this function must be paired with a call + to __resolv_conf_put. */ +struct resolv_conf *__resolv_conf_get (struct __res_state *) attribute_hidden; + +/* Converse of __resolv_conf_get. */ +void __resolv_conf_put (struct resolv_conf *) attribute_hidden; + +/* Allocate a new struct resolv_conf object and copy the + pre-configured values from *INIT. Return NULL on allocation + failure. The object must be deallocated using + __resolv_conf_put. */ +struct resolv_conf *__resolv_conf_allocate (const struct resolv_conf *init) + attribute_hidden __attribute__ ((nonnull (1), warn_unused_result)); + +/* Associate an existing extended resolver state with *RESP. Return + false on allocation failure. In addition, update *RESP with the + overlapping non-extended resolver state. */ +bool __resolv_conf_attach (struct __res_state *, struct resolv_conf *) + attribute_hidden; + +/* Detach the extended resolver state from *RESP. */ +void __resolv_conf_detach (struct __res_state *resp) attribute_hidden; + +#endif /* RESOLV_STATE_H */ |