19 #include <sys/types.h>
20 #include <sys/socket.h>
35 int forward_equals(
const struct Forward *,
const struct Forward *);
39 struct ForwardOptions {
41 mode_t streamlocal_bind_mask;
42 int streamlocal_bind_unlink;
49 void skip_space(
char **);
50 char *strdelim(
char **);
51 char *strdelimw(
char **);
52 int set_nonblock(
int);
53 int unset_nonblock(
int);
54 void set_nodelay(
int);
55 int set_reuseaddr(
int);
56 char *get_rdomain(
int);
57 int set_rdomain(
int,
const char *);
59 void set_sock_tos(
int,
int);
60 int waitrfd(
int,
int *);
61 int timeout_connect(
int,
const struct sockaddr *, socklen_t,
int *);
62 int a2port(
const char *);
63 int a2tun(
const char *,
int *);
64 char *put_host_port(
const char *, u_short);
65 char *hpdelim2(
char **,
char *);
66 char *hpdelim(
char **);
67 char *cleanhostname(
char *);
69 int parse_user_host_path(
const char *,
char **,
char **,
char **);
70 int parse_user_host_port(
const char *,
char **,
char **,
int *);
71 int parse_uri(
const char *,
const char *,
char **,
char **,
int *,
char **);
72 int convtime(
const char *);
73 const char *fmt_timeframe(time_t t);
74 int tilde_expand(
const char *, uid_t,
char **);
75 char *tilde_expand_filename(
const char *, uid_t);
77 char *dollar_expand(
int *,
const char *
string, ...);
78 char *percent_expand(
const char *, ...) __attribute__((__sentinel__));
79 char *percent_dollar_expand(const
char *, ...) __attribute__((__sentinel__));
80 char *tohex(const
void *,
size_t);
81 void xextendf(
char **s, const
char *sep, const
char *fmt, ...)
82 __attribute__((__format__ (printf, 3, 4))) __attribute__((__nonnull__ (3)));
83 void sanitise_stdfd(
void);
84 void ms_subtract_diff(struct timeval *,
int *);
85 void ms_to_timespec(struct timespec *,
int);
86 void monotime_ts(struct timespec *);
87 void monotime_tv(struct timeval *);
88 time_t monotime(
void);
89 double monotime_double(
void);
90 void lowercase(
char *s);
91 int unix_listener(const
char *,
int,
int);
92 int valid_domain(
char *,
int, const
char **);
93 int valid_env_name(const
char *);
94 const
char *atoi_err(const
char *,
int *);
95 int parse_absolute_time(const
char *, uint64_t *);
96 void format_absolute_time(uint64_t,
char *,
size_t);
97 int path_absolute(const
char *);
98 int stdfd_devnull(
int,
int,
int);
100 void sock_set_v6only(
int);
102 struct passwd *pwcopy(struct passwd *);
103 void pwfree(struct passwd *);
104 const
char *ssh_gai_strerror(
int);
106 typedef
void privdrop_fn(struct passwd *);
107 typedef
void privrestore_fn(
void);
108 #define SSH_SUBPROCESS_STDOUT_DISCARD (1)
109 #define SSH_SUBPROCESS_STDOUT_CAPTURE (1<<1)
110 #define SSH_SUBPROCESS_STDERR_DISCARD (1<<2)
111 #define SSH_SUBPROCESS_UNSAFE_PATH (1<<3)
112 #define SSH_SUBPROCESS_PRESERVE_ENV (1<<4)
113 pid_t subprocess(
const char *,
const char *,
int,
char **, FILE **, u_int,
114 struct passwd *, privdrop_fn *, privrestore_fn *,
int,
void *);
116 typedef struct arglist arglist;
122 void addargs(arglist *,
char *, ...)
123 __attribute__((format(printf, 2, 3)));
124 void replacearg(arglist *, u_int,
char *, ...)
125 __attribute__((format(printf, 3, 4)));
126 void freeargs(arglist *);
128 int tun_open(
int,
int,
char **);
131 #define SSH_TUNMODE_NO 0x00
132 #define SSH_TUNMODE_POINTOPOINT 0x01
133 #define SSH_TUNMODE_ETHERNET 0x02
134 #define SSH_TUNMODE_DEFAULT SSH_TUNMODE_POINTOPOINT
135 #define SSH_TUNMODE_YES (SSH_TUNMODE_POINTOPOINT|SSH_TUNMODE_ETHERNET)
137 #define SSH_TUNID_ANY 0x7fffffff
138 #define SSH_TUNID_ERR (SSH_TUNID_ANY - 1)
139 #define SSH_TUNID_MAX (SSH_TUNID_ANY - 2)
142 #define PORT_STREAMLOCAL -2
145 u_int64_t get_u64(
const void *)
146 __attribute__((__bounded__( __minbytes__, 1, 8)));
147 u_int32_t get_u32(const
void *)
148 __attribute__((__bounded__( __minbytes__, 1, 4)));
149 u_int16_t get_u16(const
void *)
150 __attribute__((__bounded__( __minbytes__, 1, 2)));
151 void put_u64(
void *, u_int64_t)
152 __attribute__((__bounded__( __minbytes__, 1, 8)));
153 void put_u32(
void *, u_int32_t)
154 __attribute__((__bounded__( __minbytes__, 1, 4)));
155 void put_u16(
void *, u_int16_t)
156 __attribute__((__bounded__( __minbytes__, 1, 2)));
159 u_int32_t get_u32_le(const
void *)
160 __attribute__((__bounded__(__minbytes__, 1, 4)));
161 void put_u32_le(
void *, u_int32_t)
162 __attribute__((__bounded__(__minbytes__, 1, 4)));
169 struct timeval bwstart, bwend;
172 void bandwidth_limit_init(
struct bwlimit *, u_int64_t,
size_t);
173 void bandwidth_limit(
struct bwlimit *,
size_t);
175 int parse_ipqos(
const char *);
176 const char *iptos2str(
int);
177 void mktemp_proto(
char *,
size_t);
179 void child_set_env(
char ***envp, u_int *envsizep,
const char *name,
181 const char *lookup_env_in_list(
const char *env,
182 char *
const *envs,
size_t nenvs);
183 const char *lookup_setenv_in_list(
const char *env,
184 char *
const *envs,
size_t nenvs);
186 int argv_split(
const char *,
int *,
char ***,
int);
187 char *argv_assemble(
int,
char **argv);
188 char *argv_next(
int *,
char ***);
189 void argv_consume(
int *);
190 void argv_free(
char **,
int);
192 int exited_cleanly(pid_t,
const char *,
const char *,
int);
195 int safe_path(
const char *,
struct stat *,
const char *, uid_t,
197 int safe_path_fd(
int,
const char *,
struct passwd *,
198 char *err,
size_t errlen);
201 int opt_flag(
const char *opt,
int allow_negate,
const char **optsp);
202 char *opt_dequote(
const char **sp,
const char **errstrp);
203 int opt_match(
const char **opts,
const char *term);
206 void opt_array_append(
const char *file,
const int line,
207 const char *directive,
char ***array, u_int *lp,
const char *s);
208 void opt_array_append2(
const char *file,
const int line,
209 const char *directive,
char ***array,
int **iarray, u_int *lp,
210 const char *s,
int i);
213 void ptimeout_init(
struct timespec *pt);
214 void ptimeout_deadline_sec(
struct timespec *pt,
long sec);
215 void ptimeout_deadline_ms(
struct timespec *pt,
long ms);
216 void ptimeout_deadline_monotime(
struct timespec *pt, time_t when);
217 int ptimeout_get_ms(
struct timespec *pt);
218 struct timespec *ptimeout_get_tsp(
struct timespec *pt);
219 int ptimeout_isset(
struct timespec *pt);
223 #define RP_ECHO 0x0001
224 #define RP_ALLOW_STDIN 0x0002
225 #define RP_ALLOW_EOF 0x0004
226 #define RP_USE_ASKPASS 0x0008
230 char *read_passphrase(
const char *,
int);
231 int ask_permission(
const char *, ...) __attribute__((format(printf, 1, 2)));
232 struct notifier_ctx *notify_start(
int, const
char *, ...)
233 __attribute__((format(printf, 2, 3)));
234 void notify_complete(struct notifier_ctx *, const
char *, ...)
235 __attribute__((format(printf, 2, 3)));
237 #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
238 #define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
239 #define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
241 typedef void (*sshsig_t)(int);
242 sshsig_t ssh_signal(
int, sshsig_t);