Annotation of embedaddon/quagga/lib/vty.h, revision 1.1
1.1 ! misho 1: /* Virtual terminal [aka TeletYpe] interface routine
! 2: Copyright (C) 1997 Kunihiro Ishiguro
! 3:
! 4: This file is part of GNU Zebra.
! 5:
! 6: GNU Zebra is free software; you can redistribute it and/or modify it
! 7: under the terms of the GNU General Public License as published by the
! 8: Free Software Foundation; either version 2, or (at your option) any
! 9: later version.
! 10:
! 11: GNU Zebra is distributed in the hope that it will be useful, but
! 12: WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: General Public License for more details.
! 15:
! 16: You should have received a copy of the GNU General Public License
! 17: along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: 02111-1307, USA. */
! 20:
! 21: #ifndef _ZEBRA_VTY_H
! 22: #define _ZEBRA_VTY_H
! 23:
! 24: #include "thread.h"
! 25: #include "log.h"
! 26:
! 27: #define VTY_BUFSIZ 512
! 28: #define VTY_MAXHIST 20
! 29:
! 30: /* VTY struct. */
! 31: struct vty
! 32: {
! 33: /* File descripter of this vty. */
! 34: int fd;
! 35:
! 36: /* Is this vty connect to file or not */
! 37: enum {VTY_TERM, VTY_FILE, VTY_SHELL, VTY_SHELL_SERV} type;
! 38:
! 39: /* Node status of this vty */
! 40: int node;
! 41:
! 42: /* What address is this vty comming from. */
! 43: char *address;
! 44:
! 45: /* Failure count */
! 46: int fail;
! 47:
! 48: /* Output buffer. */
! 49: struct buffer *obuf;
! 50:
! 51: /* Command input buffer */
! 52: char *buf;
! 53:
! 54: /* Command cursor point */
! 55: int cp;
! 56:
! 57: /* Command length */
! 58: int length;
! 59:
! 60: /* Command max length. */
! 61: int max;
! 62:
! 63: /* Histry of command */
! 64: char *hist[VTY_MAXHIST];
! 65:
! 66: /* History lookup current point */
! 67: int hp;
! 68:
! 69: /* History insert end point */
! 70: int hindex;
! 71:
! 72: /* For current referencing point of interface, route-map,
! 73: access-list etc... */
! 74: void *index;
! 75:
! 76: /* For multiple level index treatment such as key chain and key. */
! 77: void *index_sub;
! 78:
! 79: /* For escape character. */
! 80: unsigned char escape;
! 81:
! 82: /* Current vty status. */
! 83: enum {VTY_NORMAL, VTY_CLOSE, VTY_MORE, VTY_MORELINE} status;
! 84:
! 85: /* IAC handling: was the last character received the
! 86: IAC (interpret-as-command) escape character (and therefore the next
! 87: character will be the command code)? Refer to Telnet RFC 854. */
! 88: unsigned char iac;
! 89:
! 90: /* IAC SB (option subnegotiation) handling */
! 91: unsigned char iac_sb_in_progress;
! 92: /* At the moment, we care only about the NAWS (window size) negotiation,
! 93: and that requires just a 5-character buffer (RFC 1073):
! 94: <NAWS char> <16-bit width> <16-bit height> */
! 95: #define TELNET_NAWS_SB_LEN 5
! 96: unsigned char sb_buf[TELNET_NAWS_SB_LEN];
! 97: /* How many subnegotiation characters have we received? We just drop
! 98: those that do not fit in the buffer. */
! 99: size_t sb_len;
! 100:
! 101: /* Window width/height. */
! 102: int width;
! 103: int height;
! 104:
! 105: /* Configure lines. */
! 106: int lines;
! 107:
! 108: /* Terminal monitor. */
! 109: int monitor;
! 110:
! 111: /* In configure mode. */
! 112: int config;
! 113:
! 114: /* Read and write thread. */
! 115: struct thread *t_read;
! 116: struct thread *t_write;
! 117:
! 118: /* Timeout seconds and thread. */
! 119: unsigned long v_timeout;
! 120: struct thread *t_timeout;
! 121: };
! 122:
! 123: /* Integrated configuration file. */
! 124: #define INTEGRATE_DEFAULT_CONFIG "Quagga.conf"
! 125:
! 126: /* Small macro to determine newline is newline only or linefeed needed. */
! 127: #define VTY_NEWLINE ((vty->type == VTY_TERM) ? "\r\n" : "\n")
! 128:
! 129: /* Default time out value */
! 130: #define VTY_TIMEOUT_DEFAULT 600
! 131:
! 132: /* Vty read buffer size. */
! 133: #define VTY_READ_BUFSIZ 512
! 134:
! 135: /* Directory separator. */
! 136: #ifndef DIRECTORY_SEP
! 137: #define DIRECTORY_SEP '/'
! 138: #endif /* DIRECTORY_SEP */
! 139:
! 140: #ifndef IS_DIRECTORY_SEP
! 141: #define IS_DIRECTORY_SEP(c) ((c) == DIRECTORY_SEP)
! 142: #endif
! 143:
! 144: /* GCC have printf type attribute check. */
! 145: #ifdef __GNUC__
! 146: #define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
! 147: #else
! 148: #define PRINTF_ATTRIBUTE(a,b)
! 149: #endif /* __GNUC__ */
! 150:
! 151: /* Utility macros to convert VTY argument to unsigned long or integer. */
! 152: #define VTY_GET_LONG(NAME,V,STR) \
! 153: do { \
! 154: char *endptr = NULL; \
! 155: (V) = strtoul ((STR), &endptr, 10); \
! 156: if (*endptr != '\0' || (V) == ULONG_MAX) \
! 157: { \
! 158: vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
! 159: return CMD_WARNING; \
! 160: } \
! 161: } while (0)
! 162:
! 163: #define VTY_GET_INTEGER_RANGE(NAME,V,STR,MIN,MAX) \
! 164: do { \
! 165: unsigned long tmpl; \
! 166: VTY_GET_LONG(NAME, tmpl, STR); \
! 167: if ( (tmpl < (MIN)) || (tmpl > (MAX))) \
! 168: { \
! 169: vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
! 170: return CMD_WARNING; \
! 171: } \
! 172: (V) = tmpl; \
! 173: } while (0)
! 174:
! 175: #define VTY_GET_INTEGER(NAME,V,STR) \
! 176: VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
! 177:
! 178: #define VTY_GET_IPV4_ADDRESS(NAME,V,STR) \
! 179: do { \
! 180: int retv; \
! 181: retv = inet_aton ((STR), &(V)); \
! 182: if (!retv) \
! 183: { \
! 184: vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
! 185: return CMD_WARNING; \
! 186: } \
! 187: } while (0)
! 188:
! 189: #define VTY_GET_IPV4_PREFIX(NAME,V,STR) \
! 190: do { \
! 191: int retv; \
! 192: retv = str2prefix_ipv4 ((STR), &(V)); \
! 193: if (retv <= 0) \
! 194: { \
! 195: vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
! 196: return CMD_WARNING; \
! 197: } \
! 198: } while (0)
! 199:
! 200: /* Exported variables */
! 201: extern char integrate_default[];
! 202:
! 203: /* Prototypes. */
! 204: extern void vty_init (struct thread_master *);
! 205: extern void vty_init_vtysh (void);
! 206: extern void vty_terminate (void);
! 207: extern void vty_reset (void);
! 208: extern struct vty *vty_new (void);
! 209: extern int vty_out (struct vty *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
! 210: extern void vty_read_config (char *, char *);
! 211: extern void vty_time_print (struct vty *, int);
! 212: extern void vty_serv_sock (const char *, unsigned short, const char *);
! 213: extern void vty_close (struct vty *);
! 214: extern char *vty_get_cwd (void);
! 215: extern void vty_log (const char *level, const char *proto,
! 216: const char *fmt, struct timestamp_control *, va_list);
! 217: extern int vty_config_lock (struct vty *);
! 218: extern int vty_config_unlock (struct vty *);
! 219: extern int vty_shell (struct vty *);
! 220: extern int vty_shell_serv (struct vty *);
! 221: extern void vty_hello (struct vty *);
! 222:
! 223: /* Send a fixed-size message to all vty terminal monitors; this should be
! 224: an async-signal-safe function. */
! 225: extern void vty_log_fixed (const char *buf, size_t len);
! 226:
! 227: #endif /* _ZEBRA_VTY_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>