huangcm
2024-12-18 9d29be7f7249789d6ffd0440067187a9f040c2cd
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
/* $OpenBSD: misc.h,v 1.61 2016/11/30 00:28:31 dtucker Exp $ */
 
/*
 * Author: Tatu Ylonen <ylo@cs.hut.fi>
 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
 *                    All rights reserved
 *
 * As far as I am concerned, the code I have written for this software
 * can be used freely for any purpose.  Any derived versions of this
 * software must be clearly marked as such, and if the derived work is
 * incompatible with the protocol description in the RFC file, it must be
 * called by a name other than "ssh" or "Secure Shell".
 */
 
#ifndef _MISC_H
#define _MISC_H
 
#include <sys/time.h>
 
/* Data structure for representing a forwarding request. */
struct Forward {
   char     *listen_host;        /* Host (address) to listen on. */
   int      listen_port;        /* Port to forward. */
   char     *listen_path;        /* Path to bind domain socket. */
   char     *connect_host;        /* Host to connect. */
   int      connect_port;        /* Port to connect on connect_host. */
   char     *connect_path;        /* Path to connect domain socket. */
   int      allocated_port;    /* Dynamically allocated listen port */
   int      handle;        /* Handle for dynamic listen ports */
};
 
int forward_equals(const struct Forward *, const struct Forward *);
int bind_permitted(int, uid_t);
int daemonized(void);
 
/* Common server and client forwarding options. */
struct ForwardOptions {
   int     gateway_ports; /* Allow remote connects to forwarded ports. */
   mode_t     streamlocal_bind_mask; /* umask for streamlocal binds */
   int     streamlocal_bind_unlink; /* unlink socket before bind */
};
 
/* misc.c */
 
char    *chop(char *);
char    *strdelim(char **);
int     set_nonblock(int);
int     unset_nonblock(int);
void     set_nodelay(int);
int     a2port(const char *);
int     a2tun(const char *, int *);
char    *put_host_port(const char *, u_short);
char    *hpdelim(char **);
char    *cleanhostname(char *);
char    *colon(char *);
int     parse_user_host_port(const char *, char **, char **, int *);
long     convtime(const char *);
char    *tilde_expand_filename(const char *, uid_t);
char    *percent_expand(const char *, ...) __attribute__((__sentinel__));
char    *tohex(const void *, size_t);
void     sanitise_stdfd(void);
void     ms_subtract_diff(struct timeval *, int *);
void     ms_to_timeval(struct timeval *, int);
time_t     monotime(void);
double     monotime_double(void);
void     lowercase(char *s);
int     unix_listener(const char *, int, int);
 
void     sock_set_v6only(int);
 
struct passwd *pwcopy(struct passwd *);
const char *ssh_gai_strerror(int);
 
typedef struct arglist arglist;
struct arglist {
   char    **list;
   u_int   num;
   u_int   nalloc;
};
void     addargs(arglist *, char *, ...)
        __attribute__((format(printf, 2, 3)));
void     replacearg(arglist *, u_int, char *, ...)
        __attribute__((format(printf, 3, 4)));
void     freeargs(arglist *);
 
int     tun_open(int, int);
 
/* Common definitions for ssh tunnel device forwarding */
#define SSH_TUNMODE_NO        0x00
#define SSH_TUNMODE_POINTOPOINT    0x01
#define SSH_TUNMODE_ETHERNET    0x02
#define SSH_TUNMODE_DEFAULT    SSH_TUNMODE_POINTOPOINT
#define SSH_TUNMODE_YES        (SSH_TUNMODE_POINTOPOINT|SSH_TUNMODE_ETHERNET)
 
#define SSH_TUNID_ANY        0x7fffffff
#define SSH_TUNID_ERR        (SSH_TUNID_ANY - 1)
#define SSH_TUNID_MAX        (SSH_TUNID_ANY - 2)
 
/* Fake port to indicate that host field is really a path. */
#define PORT_STREAMLOCAL    -2
 
/* Functions to extract or store big-endian words of various sizes */
u_int64_t    get_u64(const void *)
    __attribute__((__bounded__( __minbytes__, 1, 8)));
u_int32_t    get_u32(const void *)
    __attribute__((__bounded__( __minbytes__, 1, 4)));
u_int16_t    get_u16(const void *)
    __attribute__((__bounded__( __minbytes__, 1, 2)));
void        put_u64(void *, u_int64_t)
    __attribute__((__bounded__( __minbytes__, 1, 8)));
void        put_u32(void *, u_int32_t)
    __attribute__((__bounded__( __minbytes__, 1, 4)));
void        put_u16(void *, u_int16_t)
    __attribute__((__bounded__( __minbytes__, 1, 2)));
 
/* Little-endian store/load, used by umac.c */
u_int32_t    get_u32_le(const void *)
    __attribute__((__bounded__(__minbytes__, 1, 4)));
void        put_u32_le(void *, u_int32_t)
    __attribute__((__bounded__(__minbytes__, 1, 4)));
 
struct bwlimit {
   size_t buflen;
   u_int64_t rate, thresh, lamt;
   struct timeval bwstart, bwend;
};
 
void bandwidth_limit_init(struct bwlimit *, u_int64_t, size_t);
void bandwidth_limit(struct bwlimit *, size_t);
 
int parse_ipqos(const char *);
const char *iptos2str(int);
void mktemp_proto(char *, size_t);
 
/* readpass.c */
 
#define RP_ECHO            0x0001
#define RP_ALLOW_STDIN        0x0002
#define RP_ALLOW_EOF        0x0004
#define RP_USE_ASKPASS        0x0008
 
char    *read_passphrase(const char *, int);
int     ask_permission(const char *, ...) __attribute__((format(printf, 1, 2)));
int     read_keyfile_line(FILE *, const char *, char *, size_t, u_long *);
 
#define MINIMUM(a, b)    (((a) < (b)) ? (a) : (b))
#define MAXIMUM(a, b)    (((a) > (b)) ? (a) : (b))
#define ROUNDUP(x, y)   ((((x)+((y)-1))/(y))*(y))
 
#endif /* _MISC_H */