1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
/*
* Copyright (c) 2000-2001 Silicon Graphics, Inc.
* All Rights Reserved.
*
* 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.
*
* This program is distributed in the hope that it would 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, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef UTIL_H
#define UTIL_H
/* util.[hc] - generally useful functions
*/
/* write_buf - converts the normal manager write method into something simpler
*
* the managers present a somewhat complicated write interface, for performance
* reasons, which eliminates buffer copying. however, there are times when
* the data to be written is already buffered, such as when writing out
* header structures. This function takes care of the details of writing
* the contents of such a buffer using the manager operators.
*
* if bufp is null, writes bufsz zeros.
*/
typedef char *(*gwbfp_t)(void *contextp, size_t wantedsz, size_t *szp);
typedef int (*wfp_t)(void *contextp, char *bufp, size_t bufsz);
extern int write_buf(char *bufp,
size_t bufsz,
void *contextp,
gwbfp_t get_write_buf_funcp,
wfp_t write_funcp);
/* read_buf - converts the normal manager read method into something simpler
*
* the managers present a somewhat complicated read interface, for performance
* reasons, which eliminates buffer copying. however, there are times when
* the caller wants his buffer to be filled completely, such as when reading
* header structures. This function takes care of the details of filling
* such a buffer using the manager operators.
*
* if bufp is null, discards read data.
*
* returns number of bytes successfully read. returns by reference the
* status of the first failure of the read funcp. if no read failures occur,
* *statp will be zero.
*/
typedef char * (*rfp_t)(void *contextp, size_t wantedsz, size_t *szp, int *statp);
typedef void (*rrbfp_t)(void *contextp, char *bufp, size_t bufsz);
extern int read_buf(char *bufp,
size_t bufsz,
void *contextp,
rfp_t read_funcp,
rrbfp_t return_read_buf_funcp,
int *statp);
/* strncpyterm - like strncpy, but guarantees the destination is null-terminated
*/
extern char *strncpyterm(char *s1, char *s2, size_t n);
/* bigstat - efficient file status gatherer. presents an iterative
* callback interface, invoking the caller's callback for each in-use
* inode. the caller can specify the first ino, and can limit the callbacks
* to just dirs, just non-dirs, or both. if the callback returns non-zero,
* aborts the iteration and sets stat to the callback's return; otherwise,
* stat is set to zero. return value set to errno if the system call fails,
* or EINTR if optional pre-emption func returns TRUE.
*/
#define BIGSTAT_ITER_DIR (1 << 0)
#define BIGSTAT_ITER_NONDIR (1 << 1)
#define BIGSTAT_ITER_ALL (~0)
typedef int (*bstat_cbfp_t)(void *arg1,
jdm_fshandle_t *fshandlep,
int fsfd,
struct xfs_bstat *statp);
typedef xfs_ino_t (*bstat_seekfp_t)(void *arg1,
xfs_ino_t lastino);
extern int bigstat_iter(jdm_fshandle_t *fshandlep,
int fsfd,
int selector,
xfs_ino_t start_ino,
bstat_cbfp_t fp,
void * cb_arg1,
bstat_seekfp_t seekfp,
void * seek_arg1,
int *statp,
bool_t (pfp)(int), /* preemption chk func */
struct xfs_bstat *buf,
size_t buflen);
extern int bigstat_one(int fsfd,
xfs_ino_t ino,
struct xfs_bstat *statp);
extern int inogrp_iter(int fsfd,
int (*fp)(void *arg1,
int fsfd,
struct xfs_inogrp *inogrp),
void * arg1,
int *statp);
/* calls the callback for every entry in the directory specified
* by the stat buffer. supplies the callback with a file system
* handler and a stat buffer, and the name from the dirent.
*
* NOTE: does NOT invoke callback for "." or ".."!
*
* caller may supply getdents buffer. size must be >= sizeof(dirent_t)
* + MAXPATHLEN. if not supplied (usrgdp NULL), one will be malloc()ed.
*
* if the callback returns non-zero, returns 1 with cbrval set to the
* callback's return value. if syscall fails, returns -1 with errno set.
* otherwise returns 0.
*/
extern int diriter(jdm_fshandle_t *fshandlep,
int fsfd,
struct xfs_bstat *statp,
int (*cbfp)(void *arg1,
jdm_fshandle_t *fshandlep,
int fsfd,
struct xfs_bstat *statp,
char *namep),
void *arg1,
int *cbrvalp,
char *usrgdp,
size_t usrgdsz);
/* macro to copy uuid structures
*/
#define COPY_LABEL(lab1, lab2) (bcopy(lab1, lab2, GLOBAL_HDR_STRING_SZ))
/*
* Align pointer up to alignment
*/
#define ALIGN_PTR(p, a) \
(((intptr_t)(p) & ((a)-1)) ? \
((void *)(((intptr_t)(p) + ((a)-1)) & ~((a)-1))) : \
((void *)(p)))
#endif /* UTIL_H */
|