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
|
/*
* Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved.
*
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE
* SANTA CRUZ OPERATION INC.
*
* The copyright notice above does not evidence any actual or intended
* publication of such source code.
*/
#ifndef _FS_FIFOFS_FIFONODE_H /* wrapper symbol for kernel use */
#define _FS_FIFOFS_FIFONODE_H /* subject to change without notice */
#ident "@(#)kern:fs/fifofs/fifonode.h 1.14"
#ident "$Header: $"
#if defined(__cplusplus)
extern "C" {
#endif
#ifdef _KERNEL_HEADERS
#include <util/types.h> /* REQUIRED */
#include <util/ksynch.h> /* REQUIRED */
#include <fs/vnode.h> /* REQUIRED */
#elif defined(_KERNEL) || defined(_KMEMUSER)
#include <sys/types.h> /* REQUIRED */
#include <sys/ksynch.h> /* REQUIRED */
#include <sys/vnode.h> /* REQUIRED */
#endif /* _KERNEL_HEADERS */
#if defined(_KERNEL) || defined(_KMEMUSER)
struct nodelock {
lock_t n_lock;
int n_count;
};
/*
* Each FIFOFS object is identified by a struct fifonode/vnode pair.
*/
struct fifonode {
struct vnode fn_vnode; /* represents the fifo/pipe */
struct vnode *fn_mate; /* the other end of a pipe */
struct vnode *fn_realvp; /* node being shadowed by fifo */
sleep_t fn_iolock; /* fifonode iolock */
sv_t fn_rwait; /* wait for first reader */
sv_t fn_wwait; /* wait for first writer */
sv_t fn_fdwait; /* to synchronize fd passing */
sv_t fn_openwait; /* to serialize fifo_open */
ino_t fn_ino; /* node id for pipes */
short fn_wcnt; /* number of writers */
short fn_rcnt; /* number of readers */
short fn_open; /* open count of node*/
ushort fn_flag; /* flags as defined below */
struct vnode *fn_unique; /* new vnode created by CONNLD */
time_t fn_atime; /* creation times for pipe */
time_t fn_mtime;
time_t fn_ctime;
struct fifonode *fn_nextp; /* next link in the linked list */
struct fifonode *fn_backp; /* back link in linked list */
struct nodelock *fn_nodelp; /* lock shared by both ends of a pipe */
};
#endif /* _KERNEL || _KMEMUSER */
#ifdef _KERNEL
/*
* Valid flags for fifonodes.
*/
#define ISPIPE 01 /* fifonode is that of a pipe */
#define FIFOWOPEN 02 /* open in progress */
#define FIFOWCLOSE 04 /* close in progress */
#define FIFOSEND 010 /* file descriptor at stream head of pipe */
#define FIFOPASS 020 /* CONNLD passed a new vnode in fn_unique */
#define FIFOMACPRIV 040 /* bypass MAC checks for privilege process */
#define CONNLDPUSHED 0100 /* CONNLD is pushed */
#define FIFOMODTIME 0200 /* access/modification/change time modified */
#define FIFOBSIZE 1024 /* FIFOFS block size */
/* #ifdef MERGE */
extern int fifo_rdchk(vnode_t *);
/* #endif MERGE */
/*
* Macros to convert a vnode to a fifonode, and vice versa.
*/
#define VTOF(vp) ((struct fifonode *)((vp)->v_data))
#define FTOV(fp) (&(fp)->fn_vnode)
/*
* Functions used in multiple places.
*/
extern int fifo_rdchk(vnode_t *);
extern int fifo_mkpipe(vnode_t **, vnode_t **, cred_t *);
extern void fifo_rmpipe(vnode_t *, vnode_t *, cred_t *);
/*
* Macros for manipulating locks and synchronization variables
*/
/*
* Macros called by fifovp() and fifo_inactive()
* to avoid a race on the vnode.
*/
#define FIFO_LOCK(fp, lockp) \
SLEEP_LOCK_RELLOCK(&(fp)->fn_iolock, PRIPIPE, lockp)
#define FIFO_TRYLOCK(fp) SLEEP_TRYLOCK(&(fp)->fn_iolock)
#define FIFO_LOCKBLKD(fp) SLEEP_LOCKBLKD(&(fp)->fn_iolock)
#define FIFO_UNLOCK(fp) SLEEP_UNLOCK(&(fp)->fn_iolock)
/*
* Macro to manipulate fn_nodelp->n_lock.
*/
#define PIPE_LOCK(fp) LOCK(&(fp)->fn_nodelp->n_lock, PLFIFO)
#define PIPE_UNLOCK(fp, pl) UNLOCK(&(fp)->fn_nodelp->n_lock, pl)
/*
* Macro to manipulate fn_fdwait.
* While waiting on fn_fdwait, fn_nodelp->n_lock is dropped.
*/
#define FIFO_FDWAIT(fp) \
SV_WAIT_SIG(&(fp)->fn_fdwait, PRIPIPE, &(fp)->fn_nodelp->n_lock)
#define FIFO_FDWAKEUP(fp) SV_SIGNAL(&(fp)->fn_fdwait, 0)
/*
* Macro to obtain and release the stream head mutex, sd_mutex
*/
#define STREAM_LOCK(stp) LOCK((stp)->sd_mutex, PLSTR);
#define STREAM_UNLOCK(stp, pl) UNLOCK((stp)->sd_mutex, pl);
#endif /* _KERNEL */
#if defined(__cplusplus)
}
#endif
#endif /* _FS_FIFOFS_FIFONODE_H */
|