1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $OpenBSD: misc.h,v 1.54 2014/07/15 15:54:14 millert Exp $ */ 2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Author: Tatu Ylonen <ylo@cs.hut.fi> 5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * All rights reserved 7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * As far as I am concerned, the code I have written for this software 9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * can be used freely for any purpose. Any derived versions of this 10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * software must be clearly marked as such, and if the derived work is 11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * incompatible with the protocol description in the RFC file, it must be 12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * called by a name other than "ssh" or "Secure Shell". 13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifndef _MISC_H 16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define _MISC_H 17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 18d059297112922cabb0c674840589be8db821fd9aAdam Langley/* Data structure for representing a forwarding request. */ 19d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct Forward { 20d059297112922cabb0c674840589be8db821fd9aAdam Langley char *listen_host; /* Host (address) to listen on. */ 21d059297112922cabb0c674840589be8db821fd9aAdam Langley int listen_port; /* Port to forward. */ 22d059297112922cabb0c674840589be8db821fd9aAdam Langley char *listen_path; /* Path to bind domain socket. */ 23d059297112922cabb0c674840589be8db821fd9aAdam Langley char *connect_host; /* Host to connect. */ 24d059297112922cabb0c674840589be8db821fd9aAdam Langley int connect_port; /* Port to connect on connect_host. */ 25d059297112922cabb0c674840589be8db821fd9aAdam Langley char *connect_path; /* Path to connect domain socket. */ 26d059297112922cabb0c674840589be8db821fd9aAdam Langley int allocated_port; /* Dynamically allocated listen port */ 27d059297112922cabb0c674840589be8db821fd9aAdam Langley int handle; /* Handle for dynamic listen ports */ 28d059297112922cabb0c674840589be8db821fd9aAdam Langley}; 29d059297112922cabb0c674840589be8db821fd9aAdam Langley 30d059297112922cabb0c674840589be8db821fd9aAdam Langley/* Common server and client forwarding options. */ 31d059297112922cabb0c674840589be8db821fd9aAdam Langleystruct ForwardOptions { 32d059297112922cabb0c674840589be8db821fd9aAdam Langley int gateway_ports; /* Allow remote connects to forwarded ports. */ 33d059297112922cabb0c674840589be8db821fd9aAdam Langley mode_t streamlocal_bind_mask; /* umask for streamlocal binds */ 34d059297112922cabb0c674840589be8db821fd9aAdam Langley int streamlocal_bind_unlink; /* unlink socket before bind */ 35d059297112922cabb0c674840589be8db821fd9aAdam Langley}; 36d059297112922cabb0c674840589be8db821fd9aAdam Langley 37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* misc.c */ 38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *chop(char *); 40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *strdelim(char **); 41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint set_nonblock(int); 42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint unset_nonblock(int); 43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid set_nodelay(int); 44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint a2port(const char *); 45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint a2tun(const char *, int *); 46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *put_host_port(const char *, u_short); 47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *hpdelim(char **); 48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *cleanhostname(char *); 49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *colon(char *); 50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanlong convtime(const char *); 51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *tilde_expand_filename(const char *, uid_t); 52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *percent_expand(const char *, ...) __attribute__((__sentinel__)); 53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *tohex(const void *, size_t); 54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid sanitise_stdfd(void); 55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid ms_subtract_diff(struct timeval *, int *); 56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid ms_to_timeval(struct timeval *, int); 57d059297112922cabb0c674840589be8db821fd9aAdam Langleytime_t monotime(void); 58d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid lowercase(char *s); 59d059297112922cabb0c674840589be8db821fd9aAdam Langleyint unix_listener(const char *, int, int); 60d059297112922cabb0c674840589be8db821fd9aAdam Langley 61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid sock_set_v6only(int); 62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstruct passwd *pwcopy(struct passwd *); 64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanconst char *ssh_gai_strerror(int); 65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmantypedef struct arglist arglist; 67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstruct arglist { 68bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman char **list; 69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman u_int num; 70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman u_int nalloc; 71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}; 72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid addargs(arglist *, char *, ...) 73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((format(printf, 2, 3))); 74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid replacearg(arglist *, u_int, char *, ...) 75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((format(printf, 3, 4))); 76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid freeargs(arglist *); 77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint tun_open(int, int); 79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Common definitions for ssh tunnel device forwarding */ 81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNMODE_NO 0x00 82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNMODE_POINTOPOINT 0x01 83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNMODE_ETHERNET 0x02 84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNMODE_DEFAULT SSH_TUNMODE_POINTOPOINT 85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNMODE_YES (SSH_TUNMODE_POINTOPOINT|SSH_TUNMODE_ETHERNET) 86bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNID_ANY 0x7fffffff 88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNID_ERR (SSH_TUNID_ANY - 1) 89bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define SSH_TUNID_MAX (SSH_TUNID_ANY - 2) 90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 91d059297112922cabb0c674840589be8db821fd9aAdam Langley/* Fake port to indicate that host field is really a path. */ 92d059297112922cabb0c674840589be8db821fd9aAdam Langley#define PORT_STREAMLOCAL -2 93d059297112922cabb0c674840589be8db821fd9aAdam Langley 94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Functions to extract or store big-endian words of various sizes */ 95bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanu_int64_t get_u64(const void *) 96bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((__bounded__( __minbytes__, 1, 8))); 97bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanu_int32_t get_u32(const void *) 98bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((__bounded__( __minbytes__, 1, 4))); 99bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanu_int16_t get_u16(const void *) 100bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((__bounded__( __minbytes__, 1, 2))); 101bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid put_u64(void *, u_int64_t) 102bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((__bounded__( __minbytes__, 1, 8))); 103bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid put_u32(void *, u_int32_t) 104bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((__bounded__( __minbytes__, 1, 4))); 105bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid put_u16(void *, u_int16_t) 106bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman __attribute__((__bounded__( __minbytes__, 1, 2))); 107bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 108d059297112922cabb0c674840589be8db821fd9aAdam Langley/* Little-endian store/load, used by umac.c */ 109d059297112922cabb0c674840589be8db821fd9aAdam Langleyu_int32_t get_u32_le(const void *) 110d059297112922cabb0c674840589be8db821fd9aAdam Langley __attribute__((__bounded__(__minbytes__, 1, 4))); 111d059297112922cabb0c674840589be8db821fd9aAdam Langleyvoid put_u32_le(void *, u_int32_t) 112d059297112922cabb0c674840589be8db821fd9aAdam Langley __attribute__((__bounded__(__minbytes__, 1, 4))); 113d059297112922cabb0c674840589be8db821fd9aAdam Langley 114bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstruct bwlimit { 115bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman size_t buflen; 116bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman u_int64_t rate, thresh, lamt; 117bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman struct timeval bwstart, bwend; 118bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}; 119bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 120bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid bandwidth_limit_init(struct bwlimit *, u_int64_t, size_t); 121bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid bandwidth_limit(struct bwlimit *, size_t); 122bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 123bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint parse_ipqos(const char *); 124bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanconst char *iptos2str(int); 125bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid mktemp_proto(char *, size_t); 126bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 127bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* readpass.c */ 128bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 129bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define RP_ECHO 0x0001 130bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define RP_ALLOW_STDIN 0x0002 131bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define RP_ALLOW_EOF 0x0004 132bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define RP_USE_ASKPASS 0x0008 133bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 134bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar *read_passphrase(const char *, int); 135bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint ask_permission(const char *, ...) __attribute__((format(printf, 1, 2))); 136bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint read_keyfile_line(FILE *, const char *, char *, size_t, u_long *); 137bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 138bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif /* _MISC_H */ 139