forked from crigler/dtach
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdtachez.hpp
158 lines (122 loc) · 3.92 KB
/
dtachez.hpp
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
/*
This file is part of dtachez.
Copyright (C) 2023 SudoMaker, Ltd.
Author: Reimu NotMoe <[email protected]>
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 of the License, 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. If not, see <https://www.gnu.org/licenses/>.
*/
/*
This program is based on dtach, which was originally released under
the GPLv2 license by Ned T. Crigler.
Below is the previous license header.
*/
/*
dtach - A simple program that emulates the detach feature of screen.
Copyright (C) 2001, 2004-2016 Ned T. Crigler
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 2 of the License, 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. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <cerrno>
#include <csignal>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cinttypes>
#include <climits>
#include <ctime>
#include "config.h"
#include <pty.h>
#include <fcntl.h>
#define THROW_ERROR(s) {puts(s); exit(2);}
#ifdef HAVE_UTIL_H
#include <util.h>
#endif
#ifdef HAVE_LIBUTIL_H
#include <libutil.h>
#endif
#ifdef HAVE_STROPTS_H
#include <stropts.h>
#endif
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/resource.h>
#include <termios.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#ifndef S_ISREG
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#ifndef S_ISSOCK
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
#endif
extern char *progname, *sockname;
extern int detach_char, no_suspend, redraw_method;
extern struct termios orig_term;
extern int dont_have_tty;
enum {
MSG_PUSH = 0,
MSG_ATTACH = 1,
MSG_DETACH = 2,
MSG_WINCH = 3,
MSG_REDRAW = 4,
};
enum {
REDRAW_UNSPEC = 0,
REDRAW_NONE = 1,
REDRAW_CTRL_L = 2,
REDRAW_WINCH = 3,
};
/* The client to master protocol. */
struct packet {
unsigned char type;
unsigned char len;
union {
unsigned char buf[sizeof(struct winsize)];
struct winsize ws;
} u;
};
struct conn_pipes {
int fd_miso, fd_mosi;
};
/*
** The master sends a simple stream of text to the attaching clients, without
** any protocol. This might change back to the packet based protocol in the
** future. In the meantime, however, we minimize the amount of data sent back
** and forth between the client and the master. BUFSIZE is the size of the
** buffer used for the text stream.
*/
#define BUFSIZE 4096
/* This hopefully moves to the bottom of the screen */
#define EOS "\033[999H"
int attach_main(int noerror);
int master_main(char **argv, int waitattach, int dontfork);
int push_main(void);
extern int setnonblocking(int fd);
extern void write_all(int fd, const void *buf, size_t count);
extern void read_all(int fd, void *buf, size_t count);
extern int ensure_open(const char *s, int m);
extern void ensure_mkfifo(const char *s);
extern char *_str_fmt(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
#define str_fmt(...) strdupa(_str_fmt(__VA_ARGS__))
#ifdef sun
#define BROKEN_MASTER
#endif