1 /* 2 Common routines between Xen store user library and daemon. 3 Copyright (C) 2005 Rusty Russell IBM Corporation 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef XENSTORE_LIB_H 20 #define XENSTORE_LIB_H 21 22 #include <stddef.h> 23 #include <stdbool.h> 24 #include <limits.h> 25 #include <errno.h> 26 #include <stdint.h> 27 #include <xen/io/xs_wire.h> 28 29 /* Bitmask of permissions. */ 30 enum xs_perm_type { 31 XS_PERM_NONE = 0, 32 XS_PERM_READ = 1, 33 XS_PERM_WRITE = 2, 34 /* Internal use. */ 35 XS_PERM_ENOENT_OK = 4, 36 XS_PERM_OWNER = 8, 37 }; 38 39 struct xs_permissions 40 { 41 unsigned int id; 42 enum xs_perm_type perms; 43 }; 44 45 /* Header of the node record in tdb. */ 46 struct xs_tdb_record_hdr { 47 uint64_t generation; 48 uint32_t num_perms; 49 uint32_t datalen; 50 uint32_t childlen; 51 struct xs_permissions perms[0]; 52 }; 53 54 /* Each 10 bits takes ~ 3 digits, plus one, plus one for nul terminator. */ 55 #define MAX_STRLEN(x) ((sizeof(x) * CHAR_BIT + CHAR_BIT-1) / 10 * 3 + 2) 56 57 /* Path for various daemon things: env vars can override. */ 58 const char *xs_daemon_rootdir(void); 59 const char *xs_daemon_rundir(void); 60 const char *xs_daemon_socket(void); 61 const char *xs_daemon_socket_ro(void); 62 const char *xs_domain_dev(void); 63 const char *xs_daemon_tdb(void); 64 65 /* Simple write function: loops for you. */ 66 bool xs_write_all(int fd, const void *data, unsigned int len); 67 68 /* Convert strings to permissions. False if a problem. */ 69 bool xs_strings_to_perms(struct xs_permissions *perms, unsigned int num, 70 const char *strings); 71 72 /* Convert permissions to a string (up to len MAX_STRLEN(unsigned int)+1). */ 73 bool xs_perm_to_string(const struct xs_permissions *perm, 74 char *buffer, size_t buf_len); 75 76 /* Given a string and a length, count how many strings (nul terms). */ 77 unsigned int xs_count_strings(const char *strings, unsigned int len); 78 79 /* Sanitising (quoting) possibly-binary strings. */ 80 struct expanding_buffer { 81 char *buf; 82 int avail; 83 }; 84 85 /* Ensure that given expanding buffer has at least min_avail characters. */ 86 char *expanding_buffer_ensure(struct expanding_buffer *, int min_avail); 87 88 /* sanitise_value() may return NULL if malloc fails. */ 89 char *sanitise_value(struct expanding_buffer *, const char *val, unsigned len); 90 91 /* *out_len_r on entry is ignored; out must be at least strlen(in)+1 bytes. */ 92 void unsanitise_value(char *out, unsigned *out_len_r, const char *in); 93 94 #endif /* XENSTORE_LIB_H */ 95