1 /* $NetBSD: perfuse_if.h,v 1.17 2011/10/30 05:11:37 manu Exp $ */ 2 3 /*- 4 * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef _PERFUSE_IF_H 29 #define _PERFUSE_IF_H 30 31 #ifndef _PATH_PERFUSED 32 #define _PATH_PERFUSED "/usr/sbin/perfused" 33 #endif /* _PATH_PERFUSED */ 34 #define _PATH_FUSE "/dev/fuse" 35 #define FUSE_COMMFD_ENV "_FUSE_COMMFD" 36 #define PERFUSE_MOUNT_MAGIC "noFuseRq" 37 #define PERFUSE_UNKNOWN_INO 0xffffffff 38 #define PERFUSE_UNKNOWN_NODEID 0xffffffff 39 40 /* 41 * Diagnostic flags. This global is used only for DPRINTF/DERR/DWARN 42 */ 43 extern int perfuse_diagflags; 44 #define PDF_FOREGROUND 0x0001 /* we run in foreground */ 45 #define PDF_FUSE 0x0002 /* Display FUSE reqeusts and reply */ 46 #define PDF_DUMP 0x0004 /* Dump FUSE frames */ 47 #define PDF_PUFFS 0x0008 /* Display PUFFS requets and reply */ 48 #define PDF_FH 0x0010 /* File handles */ 49 #define PDF_RECLAIM 0x0020 /* Reclaimed files */ 50 #define PDF_READDIR 0x0040 /* readdir operations */ 51 #define PDF_REQUEUE 0x0080 /* reueued messages */ 52 #define PDF_SYNC 0x0100 /* fsync and dirty flags */ 53 #define PDF_MISC 0x0200 /* Miscelaneous messages */ 54 #define PDF_SYSLOG 0x0400 /* use syslog */ 55 #define PDF_FILENAME 0x0800 /* File names */ 56 #define PDF_RESIZE 0x1000 /* Resize operations */ 57 58 /* 59 * Diagnostic functions 60 */ 61 #define DPRINTF(fmt, ...) do { \ 62 if (perfuse_diagflags & PDF_SYSLOG) \ 63 syslog(LOG_INFO, fmt, ## __VA_ARGS__); \ 64 \ 65 if (perfuse_diagflags & PDF_FOREGROUND) \ 66 (void)printf(fmt, ## __VA_ARGS__); \ 67 } while (0 /* CONSTCOND */) 68 69 #define DERRX(status, fmt, ...) do { \ 70 if (perfuse_diagflags & PDF_SYSLOG) \ 71 syslog(LOG_ERR, fmt, ## __VA_ARGS__); \ 72 \ 73 if (perfuse_diagflags & PDF_FOREGROUND) { \ 74 (void)fprintf(stderr, fmt, ## __VA_ARGS__); \ 75 abort(); \ 76 } else { \ 77 errx(status, fmt, ## __VA_ARGS__); \ 78 } \ 79 } while (0 /* CONSTCOND */) 80 81 #define DERR(status, fmt, ...) do { \ 82 if (perfuse_diagflags & PDF_SYSLOG) \ 83 syslog(LOG_ERR, fmt ": %m", ## __VA_ARGS__); \ 84 \ 85 if (perfuse_diagflags & PDF_FOREGROUND) { \ 86 char strerrbuf[BUFSIZ]; \ 87 \ 88 (void)strerror_r(errno, strerrbuf, sizeof(strerrbuf)); \ 89 (void)fprintf(stderr, fmt ": %s", ## __VA_ARGS__, \ 90 strerrbuf); \ 91 abort(); \ 92 } else { \ 93 err(status, fmt, ## __VA_ARGS__); \ 94 } \ 95 } while (0 /* CONSTCOND */) 96 97 #define DWARNX(fmt, ...) do { \ 98 if (perfuse_diagflags & PDF_SYSLOG) \ 99 syslog(LOG_WARNING, fmt, ## __VA_ARGS__); \ 100 \ 101 warnx(fmt, ## __VA_ARGS__); \ 102 } while (0 /* CONSTCOND */) 103 104 #define DWARN(fmt, ...) do { \ 105 \ 106 if (perfuse_diagflags & PDF_SYSLOG) \ 107 syslog(LOG_WARNING, fmt ": %m", ## __VA_ARGS__); \ 108 \ 109 warn(fmt, ## __VA_ARGS__); \ 110 } while (0 /* CONSTCOND */) 111 112 /* 113 * frame handling callbacks 114 */ 115 #ifndef PEFUSE_MSG_T 116 #define PEFUSE_MSG_T struct perfuse_framebuf 117 #endif 118 typedef PEFUSE_MSG_T perfuse_msg_t; 119 120 #define PERFUSE_UNSPEC_REPLY_LEN (size_t)-1 121 122 enum perfuse_xchg_pb_reply { wait_reply, no_reply }; 123 typedef perfuse_msg_t *(*perfuse_new_msg_fn)(struct puffs_usermount *, 124 puffs_cookie_t, int, size_t, const struct puffs_cred *); 125 typedef int (*perfuse_xchg_msg_fn)(struct puffs_usermount *, 126 perfuse_msg_t *, size_t, enum perfuse_xchg_pb_reply); 127 typedef void (*perfuse_destroy_msg_fn)(perfuse_msg_t *); 128 typedef struct fuse_out_header *(*perfuse_get_outhdr_fn)(perfuse_msg_t *); 129 typedef struct fuse_in_header *(*perfuse_get_inhdr_fn)(perfuse_msg_t *); 130 typedef char *(*perfuse_get_inpayload_fn)(perfuse_msg_t *); 131 typedef char *(*perfuse_get_outpayload_fn)(perfuse_msg_t *); 132 typedef void (*perfuse_umount_fn)(struct puffs_usermount *); 133 134 struct perfuse_callbacks { 135 perfuse_new_msg_fn pc_new_msg; 136 perfuse_xchg_msg_fn pc_xchg_msg; 137 perfuse_destroy_msg_fn pc_destroy_msg; 138 perfuse_get_inhdr_fn pc_get_inhdr; 139 perfuse_get_inpayload_fn pc_get_inpayload; 140 perfuse_get_outhdr_fn pc_get_outhdr; 141 perfuse_get_outpayload_fn pc_get_outpayload; 142 perfuse_umount_fn pc_umount; 143 }; 144 145 /* 146 * mount request 147 */ 148 struct perfuse_mount_out { 149 uint32_t pmo_len; 150 int32_t pmo_error; 151 uint64_t pmo_unique; 152 char pmo_magic[sizeof(PERFUSE_MOUNT_MAGIC)]; 153 uint32_t pmo_source_len; 154 uint32_t pmo_target_len; 155 uint32_t pmo_filesystemtype_len; 156 uint32_t pmo_mountflags; 157 uint32_t pmo_data_len; 158 uint32_t pmo_sock_len; 159 }; 160 161 struct perfuse_mount_info { 162 const char *pmi_source; 163 const char *pmi_target; 164 const char *pmi_filesystemtype; 165 int pmi_mountflags; 166 void *pmi_data; 167 uid_t pmi_uid; 168 }; 169 170 /* 171 * Duplicated from fuse.h to avoid making it public 172 */ 173 #ifndef FUSE_BUFSIZE 174 #define FUSE_MIN_BUFSIZE 0x21000 175 #define FUSE_PREF_BUFSIZE (sysconf(_SC_PAGESIZE) + 0x1000) 176 #define FUSE_BUFSIZE MAX(FUSE_PREF_BUFSIZE /* CONSTCOND */, FUSE_MIN_BUFSIZE) 177 #endif /* FUSE_BUFSIZE */ 178 179 struct fuse_in_header { 180 uint32_t len; 181 uint32_t opcode; 182 uint64_t unique; 183 uint64_t nodeid; 184 uint32_t uid; 185 uint32_t gid; 186 uint32_t pid; 187 uint32_t padding; 188 }; 189 190 struct fuse_out_header { 191 uint32_t len; 192 int32_t error; 193 uint64_t unique; 194 }; 195 196 __BEGIN_DECLS 197 198 struct puffs_usermount *perfuse_init(struct perfuse_callbacks *, 199 struct perfuse_mount_info *); 200 void perfuse_setspecific(struct puffs_usermount *, void *); 201 void *perfuse_getspecific(struct puffs_usermount *); 202 uint64_t perfuse_next_unique(struct puffs_usermount *); 203 uint64_t perfuse_get_nodeid(struct puffs_usermount *, puffs_cookie_t); 204 int perfuse_inloop(struct puffs_usermount *); 205 const char *perfuse_opname(int); 206 void perfuse_fs_init(struct puffs_usermount *); 207 int perfuse_mainloop(struct puffs_usermount *); 208 int perfuse_unmount(struct puffs_usermount *); 209 210 #endif /* _PERFUSE_IF_H */ 211