fdbuf
struct stat fdbuf;
if (fstat(fd, &fdbuf)) {
if (!S_ISDIR(fdbuf.st_mode) && fdbuf.st_nlink != 1) {
if (fdbuf.st_ino != lbuf.st_ino || fdbuf.st_dev != lbuf.st_dev ||
fdbuf.st_mode != lbuf.st_mode) {
struct fdbuf *fdbuf;
fdbuf = (struct fdbuf *)_TPI_TOPT_DATA(tohp);
if (!fdbuf_verify(mp, fdbuf, fdbuflen))
struct fdbuf *fdbuf;
fdbuf = (struct fdbuf *)_TPI_TOPT_DATA(tohp);
if (!fdbuf_verify(mp, fdbuf, fdbuflen))
error = fdbuf_extract(fdbuf, control,
error = fdbuf_extract(fdbuf,
fdbuf_free(struct fdbuf *fdbuf)
dprint(1, ("fdbuf_free: %d fds\n", fdbuf->fd_numfd));
for (i = 0; i < fdbuf->fd_numfd; i++) {
bcopy((char *)&fdbuf->fd_fds[i], (char *)&fp, sizeof (fp));
if (fdbuf->fd_ebuf != NULL)
kmem_free(fdbuf->fd_ebuf, fdbuf->fd_ebuflen);
kmem_free(fdbuf, fdbuf->fd_size);
fdbuf_allocmsg(int size, struct fdbuf *fdbuf)
dprint(1, ("fdbuf_allocmsg: size %d, %d fds\n", size, fdbuf->fd_numfd));
fdbuf->fd_ebuf = (caddr_t)buf;
fdbuf->fd_ebuflen = size;
fdbuf->fd_frtn.free_func = fdbuf_free;
fdbuf->fd_frtn.free_arg = (caddr_t)fdbuf;
mp = esballoc_wait(buf, size, BPRI_MED, &fdbuf->fd_frtn);
fdbuf_extract(struct fdbuf *fdbuf, void *rights, int rightslen, int msg_flags)
fdbuf->fd_numfd, rightslen));
numfd = fdbuf->fd_numfd;
bcopy((char *)&fdbuf->fd_fds[i], (char *)&fp, sizeof (fp));
fdbuf_create(void *rights, int rightslen, struct fdbuf **fdbufp)
struct fdbuf *fdbuf;
fdbuf = kmem_alloc(fdbufsize, KM_SLEEP);
fdbuf->fd_size = fdbufsize;
fdbuf->fd_numfd = 0;
fdbuf->fd_ebuf = NULL;
fdbuf->fd_ebuflen = 0;
fdbuf_free(fdbuf);
fdbuf->fd_fds[i] = fp;
fdbuf->fd_numfd++;
*fdbufp = fdbuf;
fdbuf_verify(mblk_t *mp, struct fdbuf *fdbuf, int fdbuflen)
fdbuflen == fdbuf->fd_size) {
bcmp(frp->free_arg, fdbuf, fdbuflen) == 0) {
(void *)fdbuf, fdbuflen));
fdbuflen, fdbuf->fd_size);
close_fds(void *fdbuf, int fdbuflen, int startoff)
int *fds = (int *)fdbuf;
dprint(1, ("close_fds(%p, %d, %d)\n", fdbuf, fdbuflen, startoff));
struct fdbuf *fdbuf;
error = fdbuf_create(fds, fdlen, &fdbuf);
mp = fdbuf_allocmsg(size, fdbuf);
ASSERT(fdbuf != NULL);
toh.len = fdbuf->fd_size +
soappendmsg(mp, fdbuf, fdbuf->fd_size);
struct fdbuf *fdbuf;
error = fdbuf_create(fds, fdlen, &fdbuf);
mp = fdbuf_allocmsg(size, fdbuf);
ASSERT(fdbuf != NULL);
toh.len = fdbuf->fd_size +
soappendmsg(mp, fdbuf, fdbuf->fd_size);
extern void fdb_set_iofunc(fdbuffer_t *fdbuf, fdb_iodone_t iofunc, void *ioarg,
extern fdb_holes_t *fdb_get_holes(fdbuffer_t *fdbuf);
extern int fdb_get_error(fdbuffer_t *fdbuf);
extern void fdb_free(fdbuffer_t *fdbuf);
extern void fdb_add_hole(fdbuffer_t *fdbuf, u_offset_t off, size_t len);
extern buf_t *fdb_iosetup(fdbuffer_t *fdbuf, u_offset_t off, size_t len,
extern void fdb_ioerrdone(fdbuffer_t *fdbuf, int error);
typedef void (*fdb_iodone_t)(struct fdbuffer *fdbuf, void *kargp, buf_t *bp);
#define FDBUF_HDRSIZE (sizeof (struct fdbuf) - sizeof (struct file *))
extern void fdbuf_free(struct fdbuf *);
extern mblk_t *fdbuf_allocmsg(int, struct fdbuf *);
extern int fdbuf_create(void *, int, struct fdbuf **);