summaryrefslogtreecommitdiff
path: root/src/screen.h
blob: 5f6f3736a31600117178d1d691caa3d8e49fdd58 (plain)
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
/* Copyright (c) 2008, 2009
 *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
 *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
 *      Micah Cowan (micah@cowan.name)
 *      Sadrul Habib Chowdhury (sadrul@users.sourceforge.net)
 * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007
 *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
 *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
 * Copyright (c) 1987 Oliver Laumann
 *
 * 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; either version 3, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will 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 (see the file COPYING); if not, see
 * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
 *
 ****************************************************************
 * $Id$ GNU
 */

#ifndef SCREEN_SCREEN_H
#define SCREEN_SCREEN_H

#include "config.h"

#include <stdbool.h>

#include "os.h"

/* here comes my own Free: jw. */
#define Free(a) {if ((a) == NULL) abort(); else free((void *)(a)); (a)=NULL;}

#define Ctrl(c) ((c)&037)

#define MAXSTR		768
#define MAXARGS 	64
#define MSGWAIT 	5
#define MSGMINWAIT 	1
#define SILENCEWAIT	30

/*
 * if a nasty user really wants to try a history of 3000 lines on all 10
 * windows, he will allocate 8 MegaBytes of memory, which is quite enough.
 */
#define MAXHISTHEIGHT		3000
#define DEFAULTHISTHEIGHT	100
#define DEFAULT_BUFFERFILE	"/tmp/screen-exchange"

struct mode {
	struct termios tio;
#if defined(TIOCKSET)
	struct jtchars m_jtchars;
	int m_knjmode;
#endif
};


#include "ansi.h"
#include "image.h"
#include "layer.h"
#include "sched.h"
#include "term.h"
#include "window.h"

/*
 * Parameters for the Detach() routine
 */
#define D_DETACH	0
#define D_STOP		1
#define D_REMOTE	2
#define D_POWER 	3
#define D_REMOTE_POWER	4
#define D_LOCK		5
#define D_HANGUP	6

/*
 * Here are the messages the attacher sends to the backend
 */
#define MSG_CREATE	0
#define MSG_ERROR	1
#define MSG_ATTACH	2
#define MSG_CONT	3
#define MSG_DETACH	4
#define MSG_POW_DETACH	5
#define MSG_WINCH	6
#define MSG_HANGUP	7
#define MSG_COMMAND	8
#define MSG_QUERY       9

/*
 * versions of struct Message:
 * 0:	screen version 3.6.6 (version count introduced)
 * 1:	screen version 4.1.0devel	(revisions e3fc19a upto 8147d08)
 * 					 A few revisions after 8147d08 incorrectly
 * 					 carried version 1, but should have carried 2.
 * 2:	screen version 4.1.0devel	(revisions 8b46d8a upto YYYYYYY)
 * 3:	screen version 4.2.0		(was incorrectly originally. Patched here)
 * 4:	screen version 4.2.1		(bumped once again due to changed terminal and login length)
 */
#define MSG_VERSION	4

#define MSG_REVISION	(('m'<<24) | ('s'<<16) | ('g'<<8) | MSG_VERSION)
typedef struct Message Message;
struct Message {
	int protocol_revision;	/* reduce harm done by incompatible messages */
	int type;
	char m_tty[MAXPATHLEN];	/* ttyname */
	union {
		struct {
			int lflag;
			int Lflag;
			bool aflag;
			int flowflag;
			int hheight;			/* size of scrollback buffer */
			int nargs;
			char line[MAXPATHLEN];
			char dir[MAXPATHLEN];
			char screenterm[MAXTERMLEN + 1];/* is screen really "screen" ? */
		} create;
		struct {
			char auser[MAXLOGINLEN + 1];	/* username */
			pid_t apid;			/* pid of frontend */
			int adaptflag;			/* adapt window size? */
			int lines, columns;		/* display size */
			char preselect[20];
			int esc;			/* his new escape character unless -1 */
			int meta_esc;			/* his new meta esc character unless -1 */
			char envterm[MAXTERMLEN + 1];	/* terminal type */
			int encoding;			/* encoding of display */
			int detachfirst;		/* whether to detach remote sessions first */
		} attach;
		struct {
			char duser[MAXLOGINLEN + 1];	/* username */
			pid_t dpid;			/* pid of frontend */
		} detach;
		struct {
			char auser[MAXLOGINLEN + 1];	/* username */
			int nargs;
			char cmd[MAXPATHLEN + 1];	/* command */
			pid_t apid;		/* pid of frontend */
			char preselect[20];
			char writeback[MAXPATHLEN];	/* The socket to write the result.
							   Only used for MSG_QUERY */
			} command;
		char message[MAXPATHLEN * 2];
	} m;
};

/*
 * And the signals the attacher receives from the backend
 */
#define SIG_BYE		SIGHUP
#define SIG_POWER_BYE	SIGUSR1
#define SIG_LOCK	SIGUSR2
#define SIG_STOP	SIGTSTP

#define BELL		(Ctrl('g'))
#define VBELLWAIT	1 /* No. of seconds a vbell will be displayed */

#define BELL_ON		0 /* No bell has occurred in the window */
#define BELL_FOUND	1 /* A bell has occurred, but user not yet notified */
#define BELL_DONE	2 /* A bell has occured, user has been notified */

#define BELL_VISUAL	3 /* A bell has occured in fore win, notify him visually */

#define MON_OFF 	0 /* Monitoring is off in the window */
#define MON_ON		1 /* No activity has occurred in the window */
#define MON_FOUND	2 /* Activity has occured, but user not yet notified */
#define MON_DONE	3 /* Activity has occured, user has been notified */

#define DUMP_TERMCAP	0 /* WriteFile() options */
#define DUMP_HARDCOPY	1
#define DUMP_EXCHANGE	2
#define DUMP_SCROLLBACK 3

#define SILENCE_OFF	0 /* Not checking for silence */
#define SILENCE_ON	1 /* Window being monitored for silence */
#define SILENCE_FOUND   2 /* Window is silent */
#define SILENCE_DONE    3 /* Window is silent and user is notified */

/*
 * line modes used by Input()
 */
#define INP_COOKED	0
#define INP_NOECHO	1
#define INP_RAW		2
#define INP_EVERY	4


struct acl
{
  struct acl *next;
  char *name;
};

/* register list */
#define MAX_PLOP_DEFS 256

struct baud_values {
	int bps;	/* bits per seconds */
	int sym;	/* symbol defined in bits/termios.h */
};

/*
 * windowlist orders
 */
#define WLIST_NUM 0
#define WLIST_MRU 1
#define WLIST_NESTED 2

void  SigHup (int);
void  eexit (int) __attribute__((__noreturn__));
void  Detach (int);
void  Hangup (void);
void  Kill (pid_t, int);
void  Msg (int, const char *, ...) __attribute__((format(printf, 2, 3)));
void  Panic (int, const char *, ...) __attribute__((format(printf, 2, 3))) __attribute__((__noreturn__));
void  QueryMsg (int, const char *, ...) __attribute__((format(printf, 2, 3)));
void  Dummy (int, const char *, ...) __attribute__((format(printf, 2, 3)));
void  Finit (int) __attribute__((__noreturn__));
void  MakeNewEnv (void);
void  PutWinMsg (char *, int, int);
void  setbacktick (int, int, int, char **);

/* global variables */

/* Content of the tty symlink when attach_tty_is_in_new_ns == true. */
extern char attach_tty_name_in_ns[];
extern char strnomem[];
extern char HostName[];
extern char SocketPath[MAXPATHLEN];
extern char *attach_tty;
extern char *attach_term;
extern char *captionstring;
extern char *hardcopydir;
extern char *home;
extern char *hstatusstring;
extern char *logtstamp_string;
extern char *multi;
extern char *preselect;
extern char *screenencodings;
extern char *screenlogfile;
extern char *wliststr;
extern char *wlisttit;
extern char *ActivityString;
extern char *BellString;
extern char *BufferFile;
extern char *LoginName;
extern char *PowDetachString;
extern char *RcFileName;
extern char *ShellArgs[];
extern char *ShellProg;
extern char *SocketMatch;
extern char *SocketName;
extern char *VisualBellString;
extern char **NewEnv;

extern bool adaptflag;
extern bool auto_detach;
extern bool cjkwidth;
extern bool default_startup;
extern bool hastruecolor;
extern bool iflag;
extern bool logtstamp_on;
extern bool lsflag;
extern bool quietflag;
extern bool wipeflag;
extern bool xflag;
/* Indicator whether the current tty exists in another namespace. */
extern bool attach_tty_is_in_new_ns;

extern int af;
extern int attach_fd;
extern int dflag;
extern int force_vt;
extern int log_flush;
extern int logtstamp_after;
extern uid_t multi_uid;
extern int multiattach;
extern int nversion;
extern uid_t own_uid;
extern int queryflag;
extern int rflag;
extern int tty_mode;
extern int tty_oldmode;
extern pid_t MasterPid;
extern int MsgMinWait;
extern int MsgWait;
extern int ServerSocket;
extern int SilenceWait;
extern int VBellWait;
extern int ZombieKey_destroy;
extern int ZombieKey_onerror;
extern int ZombieKey_resurrect;

extern Window *console_window;
extern Window *fore;
extern Window *mru_window;
extern Window *first_window;
extern Window *last_window;

extern Layer *flayer;

extern Event logflushev;
extern Event serv_read;

extern struct mode attach_Mode;

extern gid_t eff_gid;
extern gid_t real_gid;

extern uid_t eff_uid;
extern uid_t real_uid;

extern struct passwd *ppp;

#endif /* SCREEN_SCREEN_H */