320 lines
10 KiB
C
320 lines
10 KiB
C
/****************************************************************************
|
|
* scream::scream.h
|
|
* routines to connect to screen and or scream daemons.
|
|
* BSD Licence applies.
|
|
* 2002/04/19 Azundris incept
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include "screamcfg.h"
|
|
|
|
#ifdef NS_HAVE_TWIN
|
|
# include <Tw/Tw.h>
|
|
#endif
|
|
|
|
#define NS_TWIN_PROTO "twin://"
|
|
#define NS_SCREEN_PROTO "screen://"
|
|
#define NS_SCREAM_PROTO "scream://"
|
|
|
|
#define NS_DK 0
|
|
#define NS_SSH 1
|
|
#define NS_LCL 2
|
|
#define NS_SU 3
|
|
|
|
#define NS_MODE_NEGOTIATE -1
|
|
#define NS_MODE_NONE 0
|
|
#define NS_MODE_SCREEN 1
|
|
#define NS_MODE_SCREAM 2
|
|
#define NS_MODE_TWIN 3
|
|
|
|
#define NS_MAGIC_LINE(a) (((a)==NS_MODE_SCREEN)||((a)==NS_MODE_NEGOTIATE))
|
|
|
|
#define NS_SUCC (-1)
|
|
#define NS_FAIL 0
|
|
#define NS_OOM 1
|
|
#define NS_MALFORMED_URL 2
|
|
#define NS_UNKNOWN_USER 3
|
|
#define NS_INVALID_SESS 4
|
|
#define NS_UNKNOWN_PROTO 5
|
|
#define NS_CANT_RESOLVE 6
|
|
#define NS_CANT_CONNECT 7
|
|
#define NS_CANT_LOGIN 8
|
|
#define NS_CANT_ATTACH 9
|
|
#define NS_UNKNOWN_LOC 10
|
|
#define NS_SCREEN_STATUS 11
|
|
#define NS_SCREEN_ST_CLR 12
|
|
#define NS_EFUN_NOT_SET 13
|
|
#define NS_USER_CXL 14
|
|
#define NS_NOT_ALLOWED 15
|
|
|
|
#define NS_ERR_WEIRDSCREEN 1
|
|
|
|
#define NS_SCREAM_CURR 1
|
|
#define NS_SCREAM_PRVS 2
|
|
#define NS_SCREAM_UTMP 4
|
|
#define NS_SCREAM_BELL 8
|
|
#define NS_SCREAM_ACT 16
|
|
#define NS_SCREAM_FILE 32
|
|
#define NS_SCREAM_SHARED 64
|
|
#define NS_SCREAM_ZOMBIE 128
|
|
#define NS_SCREAM_BUTTON 0xf00
|
|
|
|
#define NS_SCREAM_MASK (~(NS_SCREAM_UTMP|NS_SCREAM_PRVS))
|
|
|
|
#define NS_HOP_DOWN 0
|
|
#define NS_HOP_UP 1
|
|
|
|
typedef enum {
|
|
NS_ESC_CMDLINE=1,
|
|
NS_ESC_SYSSCREENRC=2,
|
|
NS_ESC_SCREENRC=3,
|
|
NS_ESC_INTERACTIVE=4
|
|
} ns_esc_whence;
|
|
|
|
#define NS_SESS_NO_MON_MSG 1
|
|
|
|
#define NS_MON_TOGGLE_QUIET 0
|
|
#define NS_MON_TOGGLE_NOISY 1
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
typedef struct __ns_hop {
|
|
int localport;
|
|
char *fw;
|
|
int fwport;
|
|
int established;
|
|
int delay;
|
|
int refcount;
|
|
struct __ns_sess *sess; /* first only, others have same host/port */
|
|
struct __ns_hop *next;
|
|
} _ns_hop;
|
|
|
|
|
|
|
|
typedef struct __ns_sess { /* a whole screen-session with many clients */
|
|
char *name; /* session name */
|
|
int where; /* local/remote */
|
|
int backend; /* screen/scream/twin */
|
|
int nesting; /* 0=topLevel, 1=screen within a screen etc */
|
|
time_t timestamp; /* last updated when? */
|
|
int delay; /* initialization delay */
|
|
|
|
int flags; /* miracle flags, see NS_SESS_* */
|
|
int fd; /* fd for communication */
|
|
int dsbb; /* default length of scroll-back buffer */
|
|
|
|
char *proto; /* protocol. usually "screen" */
|
|
char *host; /* host. numeric or symbolic. ("localhost") */
|
|
int port; /* port. usually TCP22: SSH */
|
|
int disp; /* display (used by twin etc., not screen) */
|
|
char *user; /* user. often current local user */
|
|
char *pass; /* password. used for su. for remote sessions, a
|
|
ssh-key should be on the remote machine. */
|
|
char *rsrc; /* add'l parameter to screen/scream. URL-enc */
|
|
|
|
void *userdef; /* the term-app can store a pointer here */
|
|
|
|
struct __ns_efuns *efuns; /* callbacks into the terminal program. */
|
|
struct __ns_hop *hop; /* tunnel, if any */
|
|
struct __ns_disp *dsps; /* first display (that with the lowest index) */
|
|
struct __ns_disp *curr; /* current display (NULL for none) */
|
|
struct __ns_sess *prvs; /* previous session in session list */
|
|
struct __ns_sess *next; /* next session in session list */
|
|
|
|
char *home; /* user's home dir. so we can find .screenrc */
|
|
char *sysrc; /* global screen config */
|
|
char escape,literal; /* talking to screen: defaults to ^A, a */
|
|
ns_esc_whence escdef; /* where was the escape sequence defined? */
|
|
|
|
#ifdef NS_HAVE_TWIN
|
|
tdisplay twin; /* twin-display */
|
|
char *twin_str; /* twin-display (string specifier) */
|
|
#endif
|
|
} _ns_sess;
|
|
|
|
|
|
|
|
typedef struct __ns_disp { /* describing the window of a single client */
|
|
int index; /* index 0..n */
|
|
char *name; /* arbitrary \0-terminated string. humans only. */
|
|
int sbb; /* scroll-back buffer. 0 if parent to more screens */
|
|
int x; /* rsvd */
|
|
int y; /* rsvd */
|
|
int w; /* rsvd */
|
|
int h; /* rsvd */
|
|
int flags; /* current, activity, logging, ... */
|
|
struct __ns_sess *sess; /* is child of... (always) */
|
|
struct __ns_sess *child; /* if parent of... (rarely) */
|
|
struct __ns_efuns *efuns; /* NULL to use its parent's efuns */
|
|
struct __ns_disp *prvs; /* left neighbour (<index) of this session */
|
|
struct __ns_disp *next; /* right neighbour (>index) of this session */
|
|
} _ns_disp;
|
|
|
|
|
|
|
|
typedef struct __ns_efuns { /* callbacks into the terminal program */
|
|
int refcount; /* use calls below to set this up */
|
|
int (*set_scroll_x)(void *,int);
|
|
int (*set_scroll_y)(void *,int);
|
|
int (*set_scroll_w)(void *,int);
|
|
int (*set_scroll_h)(void *,int);
|
|
int (*redraw)(void *);
|
|
int (*redraw_xywh)(void *,int,int,int,int);
|
|
int (*expire_buttons)(void *,int);
|
|
int (*ins_disp)(void *,int,int,char *);
|
|
int (*del_disp)(void *,int);
|
|
int (*upd_disp)(void *,int,int,char *);
|
|
int (*err_msg)(void *,int,char *);
|
|
int (*execute)(void *,char **);
|
|
int (*inp_text)(void *,int,char *);
|
|
int (*inp_dial)(void *,char *,int,char **,int (*)(void *,char *,size_t,size_t));
|
|
int (*inp_tab)(void *,char *[],int,char *,size_t,size_t);
|
|
int (*waitstate)(void *,int);
|
|
} _ns_efuns;
|
|
|
|
|
|
|
|
typedef struct __ns_parse {
|
|
int screen;
|
|
int real;
|
|
int flags;
|
|
char *name;
|
|
} _ns_parse;
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
/* constructors/destructors */
|
|
_ns_efuns *ns_new_efuns(void);
|
|
_ns_efuns *ns_dst_efuns(_ns_efuns **);
|
|
_ns_efuns *ns_get_efuns(_ns_sess *,_ns_disp *);
|
|
|
|
/* get session anchor (for iterations) */
|
|
_ns_sess *ns_1st_sess(void);
|
|
|
|
/* transparent attach/detach */
|
|
_ns_sess *ns_attach_by_sess(_ns_sess **,int *);
|
|
_ns_sess *ns_attach_by_URL(char *,char *,_ns_efuns **,int *,void *);
|
|
int ns_detach(_ns_sess **);
|
|
|
|
/* debug */
|
|
void ns_desc_twin(_ns_sess *,char *);
|
|
|
|
/* convenience */
|
|
int ns_run(_ns_efuns *, char *);
|
|
int ns_get_ssh_port(void);
|
|
int ns_get_twin_port(void);
|
|
|
|
|
|
int disp_get_real_by_screen(_ns_sess *,int);
|
|
int disp_get_screen_by_real(_ns_sess *,int);
|
|
int ns_magic_disp(_ns_sess **,_ns_disp **);
|
|
|
|
/* send command to screen */
|
|
int ns_screen_command(_ns_sess *, char *);
|
|
|
|
/* send command to twin */
|
|
#ifdef NS_HAVE_TWIN
|
|
int ns_twin_command(_ns_sess *,udat,byte *,udat,byte *);
|
|
# define ns_twin_control(s,a,b) ns_twin_command(s,TW_MSG_USER_CONTROL,(a),(b),NULL)
|
|
# define ns_twin_message(s,a,b,c) ns_twin_command(s,TW_MSG_USER_CLIENTMSG,(a),(b),(c))
|
|
#endif
|
|
|
|
|
|
/* send statement to screen (prefixing it with the session's ^A: equiv) */
|
|
int ns_screen_xcommand(_ns_sess *,char , char *);
|
|
|
|
/* parse and forward a screen-statement (from ^A: input or screenrc) */
|
|
int ns_parse_screen_cmd(_ns_sess *,char *,ns_esc_whence);
|
|
|
|
/* parse and forward a screen-hotkey */
|
|
int ns_parse_screen_key(_ns_sess *,char);
|
|
|
|
/* parse and forward a string */
|
|
int ns_parse_screen_interactive(_ns_sess *, char *);
|
|
|
|
/* parse screen escape setup */
|
|
char ns_parse_esc(char **);
|
|
|
|
/* init session (read .screenrc, or whatnot) */
|
|
int ns_sess_init(_ns_sess *);
|
|
|
|
/* what the terminal should call the last line -- screen's "hardstatus"
|
|
changes. submit session, terminal-width, and a pointer to said line. */
|
|
int ns_parse_screen(_ns_sess *,int,int,char *);
|
|
|
|
|
|
|
|
/* backend abstraction */
|
|
/* things the term might ask screen/scream to do ***************************/
|
|
int ns_tog_disp(_ns_sess *);
|
|
int ns_go2_disp(_ns_sess *,int);
|
|
int ns_rel_disp(_ns_sess *,int);
|
|
int ns_add_disp(_ns_sess *,int,char *);
|
|
int ns_mov_disp(_ns_sess *,int,int);
|
|
int ns_rsz_disp(_ns_sess *,int,int,int);
|
|
int ns_rem_disp(_ns_sess *,int,int);
|
|
int ns_ren_disp(_ns_sess *,int,char *);
|
|
int ns_log_disp(_ns_sess *,int,char *);
|
|
int ns_mon_disp(_ns_sess *,int,int);
|
|
int ns_sbb_disp(_ns_sess *,int);
|
|
|
|
int ns_tog_region(_ns_sess *,_ns_disp *);
|
|
int ns_go2_region(_ns_sess *,_ns_disp *,int);
|
|
int ns_rel_region(_ns_sess *,_ns_disp *,int);
|
|
int ns_add_region(_ns_sess *,_ns_disp *,int,char *);
|
|
int ns_mov_region(_ns_sess *,_ns_disp *,int,int);
|
|
int ns_rsz_region(_ns_sess *,_ns_disp *,int,int,int);
|
|
int ns_rem_region(_ns_sess *,_ns_disp *,int,int);
|
|
int ns_ren_region(_ns_sess *,_ns_disp *,int,char *);
|
|
int ns_log_region(_ns_sess *,_ns_disp *,int,char *);
|
|
int ns_mon_region(_ns_sess *,_ns_disp *,int);
|
|
int ns_sbb_region(_ns_sess *,_ns_disp *,int);
|
|
int ns_one_region(_ns_sess *,_ns_disp *,int);
|
|
|
|
int ns_upd_stat(_ns_sess *);
|
|
int ns_scroll2x(_ns_sess *,int);
|
|
int ns_scroll2y(_ns_sess *,int);
|
|
int ns_inp_dial(_ns_sess *,char *,int,char **,int (*)(void *,char *,size_t,size_t));
|
|
int ns_statement(_ns_sess *,char *);
|
|
int ns_reset(_ns_sess *,int);
|
|
char *ns_get_url(_ns_sess *,int);
|
|
|
|
|
|
|
|
/* frontend abstraction */
|
|
/* things we might ask the terminal to do (register efuns (callbacks)) *****/
|
|
void ns_register_ssx(_ns_efuns *,int (*set_scroll_x)(void *,int));
|
|
void ns_register_ssy(_ns_efuns *,int (*set_scroll_y)(void *,int));
|
|
void ns_register_ssw(_ns_efuns *,int (*set_scroll_w)(void *,int));
|
|
void ns_register_ssh(_ns_efuns *,int (*set_scroll_h)(void *,int));
|
|
|
|
void ns_register_red(_ns_efuns *,int (*redraw)(void *));
|
|
void ns_register_rda(_ns_efuns *,int (*redraw_xywh)(void *,int,int,int,int));
|
|
void ns_register_exb(_ns_efuns *,int (*expire_buttons)(void *,int));
|
|
|
|
void ns_register_ins(_ns_efuns *,int (*ins_disp)(void *,int,int,char *));
|
|
void ns_register_del(_ns_efuns *,int (*del_disp)(void *,int));
|
|
void ns_register_upd(_ns_efuns *,int (*upd_disp)(void *,int,int,char *));
|
|
|
|
void ns_register_err(_ns_efuns *,int (*err_msg)(void *,int,char *));
|
|
|
|
void ns_register_exe(_ns_efuns *,int (*execute)(void *,char **));
|
|
void ns_register_txt(_ns_efuns *,int (*inp_text)(void *,int,char *));
|
|
|
|
void ns_register_inp(_ns_efuns *,int (*)(void *,char *,int,char **,int (*)(void *,char *,size_t,size_t)));
|
|
void ns_register_tab(_ns_efuns *,int (*)(void *,char *[],int,char *,size_t,size_t));
|
|
void ns_register_fun(_ns_efuns *,int (*)(void *,int));
|
|
|
|
|
|
|
|
/***************************************************************************/
|