Annotation of embedaddon/quagga/lib/vty.h, revision 1.1.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>