blob: c3221e2ac1f5e5419c8f9854d2a7e13db96c16d0 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* Virtual terminal [aka TeletYpe] interface routine
2 Copyright (C) 1997 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING. If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA. */
20
21#ifndef _ZEBRA_VTY_H
22#define _ZEBRA_VTY_H
23
paulb21b19c2003-06-15 01:28:29 +000024#include "thread.h"
25
paul718e3742002-12-13 20:15:29 +000026#define VTY_BUFSIZ 512
27#define VTY_MAXHIST 20
28
29/* VTY struct. */
30struct vty
31{
32 /* File descripter of this vty. */
33 int fd;
34
35 /* Is this vty connect to file or not */
36 enum {VTY_TERM, VTY_FILE, VTY_SHELL, VTY_SHELL_SERV} type;
37
38 /* Node status of this vty */
39 int node;
40
41 /* What address is this vty comming from. */
42 char *address;
43
paul718e3742002-12-13 20:15:29 +000044 /* Failure count */
45 int fail;
46
47 /* Output buffer. */
48 struct buffer *obuf;
49
50 /* Command input buffer */
51 char *buf;
52
53 /* Command cursor point */
54 int cp;
55
56 /* Command length */
57 int length;
58
59 /* Command max length. */
60 int max;
61
62 /* Histry of command */
63 char *hist[VTY_MAXHIST];
64
65 /* History lookup current point */
66 int hp;
67
68 /* History insert end point */
69 int hindex;
70
71 /* For current referencing point of interface, route-map,
72 access-list etc... */
73 void *index;
74
75 /* For multiple level index treatment such as key chain and key. */
76 void *index_sub;
77
78 /* For escape character. */
79 unsigned char escape;
80
81 /* Current vty status. */
ajs5a646652004-11-05 01:25:55 +000082 enum {VTY_NORMAL, VTY_CLOSE, VTY_MORE, VTY_MORELINE} status;
paul718e3742002-12-13 20:15:29 +000083
84 /* IAC handling */
85 unsigned char iac;
86
87 /* IAC SB handling */
88 unsigned char iac_sb_in_progress;
89 struct buffer *sb_buffer;
90
91 /* Window width/height. */
92 int width;
93 int height;
94
paul718e3742002-12-13 20:15:29 +000095 /* Configure lines. */
96 int lines;
97
paul718e3742002-12-13 20:15:29 +000098 /* Terminal monitor. */
99 int monitor;
100
101 /* In configure mode. */
102 int config;
103
104 /* Read and write thread. */
105 struct thread *t_read;
106 struct thread *t_write;
107
108 /* Timeout seconds and thread. */
109 unsigned long v_timeout;
110 struct thread *t_timeout;
paul718e3742002-12-13 20:15:29 +0000111};
112
113/* Integrated configuration file. */
paule8f29842003-08-12 13:08:31 +0000114#define INTEGRATE_DEFAULT_CONFIG "Quagga.conf"
paul718e3742002-12-13 20:15:29 +0000115
116/* Small macro to determine newline is newline only or linefeed needed. */
117#define VTY_NEWLINE ((vty->type == VTY_TERM) ? "\r\n" : "\n")
118
119/* Default time out value */
120#define VTY_TIMEOUT_DEFAULT 600
121
122/* Vty read buffer size. */
123#define VTY_READ_BUFSIZ 512
124
125/* Directory separator. */
126#ifndef DIRECTORY_SEP
127#define DIRECTORY_SEP '/'
128#endif /* DIRECTORY_SEP */
129
130#ifndef IS_DIRECTORY_SEP
131#define IS_DIRECTORY_SEP(c) ((c) == DIRECTORY_SEP)
132#endif
133
134/* GCC have printf type attribute check. */
135#ifdef __GNUC__
136#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
137#else
138#define PRINTF_ATTRIBUTE(a,b)
139#endif /* __GNUC__ */
140
paul42d49862004-10-13 05:22:18 +0000141/* Utility macros to convert VTY argument to unsigned long or integer. */
142#define VTY_GET_LONG(NAME,V,STR) \
143{ \
144 char *endptr = NULL; \
145 (V) = strtoul ((STR), &endptr, 10); \
146 if (*endptr != '\0' || (V) == ULONG_MAX) \
147 { \
paul718e3742002-12-13 20:15:29 +0000148 vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
paul42d49862004-10-13 05:22:18 +0000149 return CMD_WARNING; \
150 } \
paul718e3742002-12-13 20:15:29 +0000151}
152
paul42d49862004-10-13 05:22:18 +0000153#define VTY_GET_INTEGER_RANGE(NAME,V,STR,MIN,MAX) \
154{ \
155 unsigned long tmpl; \
156 VTY_GET_LONG(NAME, tmpl, STR) \
157 if ( tmpl < (MIN) || tmpl > (MAX)) \
158 { \
paul718e3742002-12-13 20:15:29 +0000159 vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
paul42d49862004-10-13 05:22:18 +0000160 return CMD_WARNING; \
161 } \
162 (V) = tmpl; \
paul718e3742002-12-13 20:15:29 +0000163}
164
paul42d49862004-10-13 05:22:18 +0000165#define VTY_GET_INTEGER(NAME,V,STR) \
166 VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
167
paul718e3742002-12-13 20:15:29 +0000168/* Exported variables */
169extern char integrate_default[];
170
171/* Prototypes. */
paulb21b19c2003-06-15 01:28:29 +0000172void vty_init (struct thread_master *);
paul718e3742002-12-13 20:15:29 +0000173void vty_init_vtysh (void);
174void vty_reset (void);
175void vty_finish (void);
176struct vty *vty_new (void);
177int vty_out (struct vty *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
hasso320ec102004-06-20 19:54:37 +0000178void vty_read_config (char *, char *);
paul718e3742002-12-13 20:15:29 +0000179void vty_time_print (struct vty *, int);
hasso6ad96ea2004-10-07 19:33:46 +0000180void vty_serv_sock (const char *, unsigned short, const char *);
paul718e3742002-12-13 20:15:29 +0000181void vty_close (struct vty *);
182char *vty_get_cwd (void);
183void vty_log (const char *, const char *, va_list);
184int vty_config_lock (struct vty *);
185int vty_config_unlock (struct vty *);
186int vty_shell (struct vty *);
187int vty_shell_serv (struct vty *);
188void vty_hello (struct vty *);
189
190#endif /* _ZEBRA_VTY_H */