4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
24 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
25 /* All Rights Reserved */
38 * Structures and definitions supporting the pseudo terminal
39 * drivers. This structure is private and should not be used by any
43 queue_t
*ptm_rdq
; /* master's read queue pointer */
44 queue_t
*pts_rdq
; /* slave's read queue pointer */
45 mblk_t
*pt_nullmsg
; /* 0-bytes message block for pts close */
46 pid_t pt_pid
; /* process id (for debugging) */
47 minor_t pt_minor
; /* Minor number of this pty */
48 int pt_refcnt
; /* reference count for ptm_rdq/pts_rdq uses */
49 ushort_t pt_state
; /* state of master/slave pair */
50 kcondvar_t pt_cv
; /* condition variable for exclusive access */
51 kmutex_t pt_lock
; /* Per-element lock */
52 zoneid_t pt_zoneid
; /* Zone membership for this pty */
53 uid_t pt_ruid
; /* Real owner of pty */
54 gid_t pt_rgid
; /* Real group owner of pty */
60 #define PTLOCK 0x01 /* master/slave pair is locked */
61 #define PTMOPEN 0x02 /* master side is open */
62 #define PTSOPEN 0x04 /* slave side is open */
63 #define PTSTTY 0x08 /* slave side is tty */
66 * Multi-threading primitives.
67 * Values of pt_refcnt: -1 if a writer is accessing the struct
68 * 0 if no one is reading or writing
69 * > 0 equals to the number of readers accessing the struct
71 #define PT_ENTER_READ(p) { \
72 mutex_enter(&(p)->pt_lock); \
73 while ((p)->pt_refcnt < 0) \
74 cv_wait(&((p)->pt_cv), &(p)->pt_lock); \
76 mutex_exit(&(p)->pt_lock); \
79 #define PT_ENTER_WRITE(p) { \
80 mutex_enter(&(p)->pt_lock); \
81 while ((p)->pt_refcnt != 0) \
82 cv_wait(&((p)->pt_cv), &(p)->pt_lock); \
83 (p)->pt_refcnt = -1; \
84 mutex_exit(&(p)->pt_lock); \
87 #define PT_EXIT_READ(p) { \
88 mutex_enter(&(p)->pt_lock); \
89 ASSERT((p)->pt_refcnt > 0); \
90 if ((--((p)->pt_refcnt)) == 0) \
91 cv_broadcast(&(p)->pt_cv); \
92 mutex_exit(&(p)->pt_lock); \
95 #define PT_EXIT_WRITE(p) { \
96 mutex_enter(&(p)->pt_lock); \
97 ASSERT((p)->pt_refcnt == -1); \
99 cv_broadcast(&(p)->pt_cv); \
100 mutex_exit(&(p)->pt_lock); \
104 * ptms_lock and pt_cnt are defined in ptms_conf.c
106 extern kmutex_t ptms_lock
;
107 extern dev_info_t
*pts_dip
; /* private copy of devinfo ptr */
109 extern void ptms_init(void);
110 extern struct pt_ttys
*pt_ttys_alloc(void);
111 extern void ptms_close(struct pt_ttys
*, uint_t
);
112 extern struct pt_ttys
*ptms_minor2ptty(minor_t
);
113 extern int ptms_attach_slave(void);
114 extern int ptms_minor_valid(minor_t ptmin
, uid_t
*uid
, gid_t
*gid
);
115 extern int ptms_minor_exists(minor_t ptmin
);
116 extern void ptms_set_owner(minor_t ptmin
, uid_t uid
, gid_t gid
);
117 extern major_t
ptms_slave_attached(void);
120 extern void ptms_log(char *, uint_t
);
121 extern void ptms_logp(char *, uintptr_t);
122 #define DDBG(a, b) ptms_log(a, b)
123 #define DDBGP(a, b) ptms_logp(a, b)
131 typedef struct pt_own
{
139 * ISPTM: Determines whether the file descriptor is that of an open master
140 * device. Return code of zero indicates that the file descriptor
141 * represents master device.
143 * UNLKPT: Unlocks the master and slave devices. It returns 0 on success. On
144 * failure, the errno is set to EINVAL indicating that the master
145 * device is not open.
147 * ZONEPT: Sets the zoneid of the pair of master and slave devices. It
148 * returns 0 upon success. Used to force a pty 'into' a zone upon
151 * PT_OWNER: Sets uid and gid for slave device. It returns 0 on success.
154 #define ISPTM (('P'<<8)|1) /* query for master */
155 #define UNLKPT (('P'<<8)|2) /* unlock master/slave pair */
156 #define PTSSTTY (('P'<<8)|3) /* set tty flag */
157 #define ZONEPT (('P'<<8)|4) /* set zone of master/slave pair */
158 #define OWNERPT (('P'<<8)|5) /* set owner/group for slave device */
164 #endif /* _SYS_PTMS_H */