1*076ad2f8SDag-Erling Smørgrav /* $OpenBSD: misc.h,v 1.57 2016/07/15 00:24:30 djm Exp $ */ 21e8db6e2SBrian Feldman 31e8db6e2SBrian Feldman /* 41e8db6e2SBrian Feldman * Author: Tatu Ylonen <ylo@cs.hut.fi> 51e8db6e2SBrian Feldman * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 61e8db6e2SBrian Feldman * All rights reserved 71e8db6e2SBrian Feldman * 81e8db6e2SBrian Feldman * As far as I am concerned, the code I have written for this software 91e8db6e2SBrian Feldman * can be used freely for any purpose. Any derived versions of this 101e8db6e2SBrian Feldman * software must be clearly marked as such, and if the derived work is 111e8db6e2SBrian Feldman * incompatible with the protocol description in the RFC file, it must be 121e8db6e2SBrian Feldman * called by a name other than "ssh" or "Secure Shell". 131e8db6e2SBrian Feldman */ 141e8db6e2SBrian Feldman 15761efaa7SDag-Erling Smørgrav #ifndef _MISC_H 16761efaa7SDag-Erling Smørgrav #define _MISC_H 17761efaa7SDag-Erling Smørgrav 18a0ee8cc6SDag-Erling Smørgrav /* Data structure for representing a forwarding request. */ 19a0ee8cc6SDag-Erling Smørgrav struct Forward { 20a0ee8cc6SDag-Erling Smørgrav char *listen_host; /* Host (address) to listen on. */ 21a0ee8cc6SDag-Erling Smørgrav int listen_port; /* Port to forward. */ 22a0ee8cc6SDag-Erling Smørgrav char *listen_path; /* Path to bind domain socket. */ 23a0ee8cc6SDag-Erling Smørgrav char *connect_host; /* Host to connect. */ 24a0ee8cc6SDag-Erling Smørgrav int connect_port; /* Port to connect on connect_host. */ 25a0ee8cc6SDag-Erling Smørgrav char *connect_path; /* Path to connect domain socket. */ 26a0ee8cc6SDag-Erling Smørgrav int allocated_port; /* Dynamically allocated listen port */ 27a0ee8cc6SDag-Erling Smørgrav int handle; /* Handle for dynamic listen ports */ 28a0ee8cc6SDag-Erling Smørgrav }; 29a0ee8cc6SDag-Erling Smørgrav 30*076ad2f8SDag-Erling Smørgrav int forward_equals(const struct Forward *, const struct Forward *); 31*076ad2f8SDag-Erling Smørgrav 32a0ee8cc6SDag-Erling Smørgrav /* Common server and client forwarding options. */ 33a0ee8cc6SDag-Erling Smørgrav struct ForwardOptions { 34a0ee8cc6SDag-Erling Smørgrav int gateway_ports; /* Allow remote connects to forwarded ports. */ 35a0ee8cc6SDag-Erling Smørgrav mode_t streamlocal_bind_mask; /* umask for streamlocal binds */ 36a0ee8cc6SDag-Erling Smørgrav int streamlocal_bind_unlink; /* unlink socket before bind */ 37a0ee8cc6SDag-Erling Smørgrav }; 38a0ee8cc6SDag-Erling Smørgrav 39d74d50a8SDag-Erling Smørgrav /* misc.c */ 40d74d50a8SDag-Erling Smørgrav 41ae1f160dSDag-Erling Smørgrav char *chop(char *); 42ae1f160dSDag-Erling Smørgrav char *strdelim(char **); 43d74d50a8SDag-Erling Smørgrav int set_nonblock(int); 44d74d50a8SDag-Erling Smørgrav int unset_nonblock(int); 45ae1f160dSDag-Erling Smørgrav void set_nodelay(int); 46ae1f160dSDag-Erling Smørgrav int a2port(const char *); 47021d409fSDag-Erling Smørgrav int a2tun(const char *, int *); 48761efaa7SDag-Erling Smørgrav char *put_host_port(const char *, u_short); 495e8dbd04SDag-Erling Smørgrav char *hpdelim(char **); 50ae1f160dSDag-Erling Smørgrav char *cleanhostname(char *); 51ae1f160dSDag-Erling Smørgrav char *colon(char *); 52*076ad2f8SDag-Erling Smørgrav int parse_user_host_port(const char *, char **, char **, int *); 53ae1f160dSDag-Erling Smørgrav long convtime(const char *); 54043840dfSDag-Erling Smørgrav char *tilde_expand_filename(const char *, uid_t); 55043840dfSDag-Erling Smørgrav char *percent_expand(const char *, ...) __attribute__((__sentinel__)); 56761efaa7SDag-Erling Smørgrav char *tohex(const void *, size_t); 57021d409fSDag-Erling Smørgrav void sanitise_stdfd(void); 58d4af9e69SDag-Erling Smørgrav void ms_subtract_diff(struct timeval *, int *); 59d4af9e69SDag-Erling Smørgrav void ms_to_timeval(struct timeval *, int); 60e4a9863fSDag-Erling Smørgrav time_t monotime(void); 61*076ad2f8SDag-Erling Smørgrav double monotime_double(void); 62f7167e0eSDag-Erling Smørgrav void lowercase(char *s); 63a0ee8cc6SDag-Erling Smørgrav int unix_listener(const char *, int, int); 64f7167e0eSDag-Erling Smørgrav 65b15c8340SDag-Erling Smørgrav void sock_set_v6only(int); 661e8db6e2SBrian Feldman 67ae1f160dSDag-Erling Smørgrav struct passwd *pwcopy(struct passwd *); 68d4af9e69SDag-Erling Smørgrav const char *ssh_gai_strerror(int); 691e8db6e2SBrian Feldman 70ae1f160dSDag-Erling Smørgrav typedef struct arglist arglist; 71ae1f160dSDag-Erling Smørgrav struct arglist { 72ae1f160dSDag-Erling Smørgrav char **list; 73d74d50a8SDag-Erling Smørgrav u_int num; 74d74d50a8SDag-Erling Smørgrav u_int nalloc; 75ae1f160dSDag-Erling Smørgrav }; 76021d409fSDag-Erling Smørgrav void addargs(arglist *, char *, ...) 77021d409fSDag-Erling Smørgrav __attribute__((format(printf, 2, 3))); 78021d409fSDag-Erling Smørgrav void replacearg(arglist *, u_int, char *, ...) 79021d409fSDag-Erling Smørgrav __attribute__((format(printf, 3, 4))); 80021d409fSDag-Erling Smørgrav void freeargs(arglist *); 81d74d50a8SDag-Erling Smørgrav 82021d409fSDag-Erling Smørgrav int tun_open(int, int); 83021d409fSDag-Erling Smørgrav 84021d409fSDag-Erling Smørgrav /* Common definitions for ssh tunnel device forwarding */ 85021d409fSDag-Erling Smørgrav #define SSH_TUNMODE_NO 0x00 86021d409fSDag-Erling Smørgrav #define SSH_TUNMODE_POINTOPOINT 0x01 87021d409fSDag-Erling Smørgrav #define SSH_TUNMODE_ETHERNET 0x02 88021d409fSDag-Erling Smørgrav #define SSH_TUNMODE_DEFAULT SSH_TUNMODE_POINTOPOINT 89021d409fSDag-Erling Smørgrav #define SSH_TUNMODE_YES (SSH_TUNMODE_POINTOPOINT|SSH_TUNMODE_ETHERNET) 90021d409fSDag-Erling Smørgrav 91021d409fSDag-Erling Smørgrav #define SSH_TUNID_ANY 0x7fffffff 92021d409fSDag-Erling Smørgrav #define SSH_TUNID_ERR (SSH_TUNID_ANY - 1) 93021d409fSDag-Erling Smørgrav #define SSH_TUNID_MAX (SSH_TUNID_ANY - 2) 94761efaa7SDag-Erling Smørgrav 95a0ee8cc6SDag-Erling Smørgrav /* Fake port to indicate that host field is really a path. */ 96a0ee8cc6SDag-Erling Smørgrav #define PORT_STREAMLOCAL -2 97a0ee8cc6SDag-Erling Smørgrav 98761efaa7SDag-Erling Smørgrav /* Functions to extract or store big-endian words of various sizes */ 99761efaa7SDag-Erling Smørgrav u_int64_t get_u64(const void *) 100761efaa7SDag-Erling Smørgrav __attribute__((__bounded__( __minbytes__, 1, 8))); 101761efaa7SDag-Erling Smørgrav u_int32_t get_u32(const void *) 102761efaa7SDag-Erling Smørgrav __attribute__((__bounded__( __minbytes__, 1, 4))); 103761efaa7SDag-Erling Smørgrav u_int16_t get_u16(const void *) 104761efaa7SDag-Erling Smørgrav __attribute__((__bounded__( __minbytes__, 1, 2))); 105761efaa7SDag-Erling Smørgrav void put_u64(void *, u_int64_t) 106761efaa7SDag-Erling Smørgrav __attribute__((__bounded__( __minbytes__, 1, 8))); 107761efaa7SDag-Erling Smørgrav void put_u32(void *, u_int32_t) 108761efaa7SDag-Erling Smørgrav __attribute__((__bounded__( __minbytes__, 1, 4))); 109761efaa7SDag-Erling Smørgrav void put_u16(void *, u_int16_t) 110761efaa7SDag-Erling Smørgrav __attribute__((__bounded__( __minbytes__, 1, 2))); 111761efaa7SDag-Erling Smørgrav 112a0ee8cc6SDag-Erling Smørgrav /* Little-endian store/load, used by umac.c */ 113a0ee8cc6SDag-Erling Smørgrav u_int32_t get_u32_le(const void *) 114a0ee8cc6SDag-Erling Smørgrav __attribute__((__bounded__(__minbytes__, 1, 4))); 115a0ee8cc6SDag-Erling Smørgrav void put_u32_le(void *, u_int32_t) 116a0ee8cc6SDag-Erling Smørgrav __attribute__((__bounded__(__minbytes__, 1, 4))); 117a0ee8cc6SDag-Erling Smørgrav 1184a421b63SDag-Erling Smørgrav struct bwlimit { 1194a421b63SDag-Erling Smørgrav size_t buflen; 1204a421b63SDag-Erling Smørgrav u_int64_t rate, thresh, lamt; 1214a421b63SDag-Erling Smørgrav struct timeval bwstart, bwend; 1224a421b63SDag-Erling Smørgrav }; 1234a421b63SDag-Erling Smørgrav 1244a421b63SDag-Erling Smørgrav void bandwidth_limit_init(struct bwlimit *, u_int64_t, size_t); 1254a421b63SDag-Erling Smørgrav void bandwidth_limit(struct bwlimit *, size_t); 1264a421b63SDag-Erling Smørgrav 1274a421b63SDag-Erling Smørgrav int parse_ipqos(const char *); 128e146993eSDag-Erling Smørgrav const char *iptos2str(int); 1294a421b63SDag-Erling Smørgrav void mktemp_proto(char *, size_t); 130761efaa7SDag-Erling Smørgrav 131761efaa7SDag-Erling Smørgrav /* readpass.c */ 132761efaa7SDag-Erling Smørgrav 133761efaa7SDag-Erling Smørgrav #define RP_ECHO 0x0001 134761efaa7SDag-Erling Smørgrav #define RP_ALLOW_STDIN 0x0002 135761efaa7SDag-Erling Smørgrav #define RP_ALLOW_EOF 0x0004 136761efaa7SDag-Erling Smørgrav #define RP_USE_ASKPASS 0x0008 137761efaa7SDag-Erling Smørgrav 138761efaa7SDag-Erling Smørgrav char *read_passphrase(const char *, int); 139761efaa7SDag-Erling Smørgrav int ask_permission(const char *, ...) __attribute__((format(printf, 1, 2))); 140761efaa7SDag-Erling Smørgrav int read_keyfile_line(FILE *, const char *, char *, size_t, u_long *); 141761efaa7SDag-Erling Smørgrav 142761efaa7SDag-Erling Smørgrav #endif /* _MISC_H */ 143