]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/vty.h
lib: Add LIB_ERR_ZMQ
[mirror_frr.git] / lib / vty.h
index dcb8da225d2fadede770f699831dc5bbd64a3147..b55abf22043f4956617b05ce4aab9084e3807b47 100644 (file)
--- a/lib/vty.h
+++ b/lib/vty.h
 #ifndef _ZEBRA_VTY_H
 #define _ZEBRA_VTY_H
 
+#include <sys/types.h>
+#include <regex.h>
+
 #include "thread.h"
 #include "log.h"
 #include "sockunion.h"
 #include "qobj.h"
+#include "compiler.h"
 
 #define VTY_BUFSIZ 4096
 #define VTY_MAXHIST 20
@@ -37,6 +41,13 @@ struct vty {
        /* output FD, to support stdin/stdout combination */
        int wfd;
 
+       /* File output, used for VTYSH only */
+       FILE *of;
+       FILE *of_saved;
+
+       /* whether we are using pager or not */
+       bool is_paged;
+
        /* Is this vty connect to file or not */
        enum { VTY_TERM, VTY_FILE, VTY_SHELL, VTY_SHELL_SERV } type;
 
@@ -46,6 +57,13 @@ struct vty {
        /* Failure count */
        int fail;
 
+       /* Output filer regex */
+       bool filter;
+       regex_t include;
+
+       /* Line buffer */
+       struct buffer *lbuf;
+
        /* Output buffer. */
        struct buffer *obuf;
 
@@ -124,6 +142,12 @@ struct vty {
 
        /* What address is this vty comming from. */
        char address[SU_ADDRSTRLEN];
+
+       /* "frame" output.  This is buffered and will be printed if some
+        * actual output follows, or will be discarded if the frame ends
+        * without any output. */
+       size_t frame_pos;
+       char frame[1024];
 };
 
 static inline void vty_push_context(struct vty *vty, int node, uint64_t id)
@@ -167,8 +191,8 @@ static inline void vty_push_context(struct vty *vty, int node, uint64_t id)
        struct structname *ptr = VTY_GET_CONTEXT_SUB(structname);              \
        VTY_CHECK_CONTEXT(ptr);
 #define VTY_DECLVAR_INSTANCE_CONTEXT(structname, ptr)                          \
-       if (vty->qobj_index == 0)                                              \
-               return CMD_NOT_MY_INSTANCE;                                    \
+       if (vty->qobj_index == 0)                                              \
+               return CMD_NOT_MY_INSTANCE;                                    \
        struct structname *ptr = VTY_GET_CONTEXT(structname);                  \
        VTY_CHECK_CONTEXT(ptr);
 
@@ -182,57 +206,6 @@ struct vty_arg {
 /* Integrated configuration file. */
 #define INTEGRATE_DEFAULT_CONFIG "frr.conf"
 
-/* for compatibility */
-#if defined(__ICC)
-#define CPP_WARN_STR(X) #X
-#define CPP_WARN(text) _Pragma(CPP_WARN_STR(message __FILE__ ": " text))
-
-#elif (defined(__GNUC__)                                                       \
-       && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))           \
-       || (defined(__clang__)                                                 \
-           && (__clang_major__ >= 4                                           \
-               || (__clang_major__ == 3 && __clang_minor__ >= 5)))
-#define CPP_WARN_STR(X) #X
-#define CPP_WARN(text) _Pragma(CPP_WARN_STR(GCC warning text))
-
-#else
-#define CPP_WARN(text)
-#endif
-
-#define VNL "\n" CPP_WARN("VNL has been replaced with \\n.")
-#define VTYNL "\n" CPP_WARN("VTYNL has been replaced with \\n.")
-#define VTY_NEWLINE "\n" CPP_WARN("VTY_NEWLINE has been replaced with \\n.")
-#define VTY_GET_INTEGER(desc, v, str)                                          \
-       {                                                                      \
-               (v) = strtoul((str), NULL, 10);                                \
-       }                                                                      \
-       CPP_WARN("VTY_GET_INTEGER is no longer useful, use strtoul() or DEFPY.")
-#define VTY_GET_INTEGER_RANGE(desc, v, str, min, max)                          \
-       {                                                                      \
-               (v) = strtoul((str), NULL, 10);                                \
-       }                                                                      \
-       CPP_WARN(                                                              \
-               "VTY_GET_INTEGER_RANGE is no longer useful, use strtoul() or DEFPY.")
-#define VTY_GET_ULONG(desc, v, str)                                            \
-       {                                                                      \
-               (v) = strtoul((str), NULL, 10);                                \
-       }                                                                      \
-       CPP_WARN("VTY_GET_ULONG is no longer useful, use strtoul() or DEFPY.")
-#define VTY_GET_ULL(desc, v, str)                                              \
-       {                                                                      \
-               (v) = strtoull((str), NULL, 10);                               \
-       }                                                                      \
-       CPP_WARN("VTY_GET_ULL is no longer useful, use strtoull() or DEFPY.")
-#define VTY_GET_IPV4_ADDRESS(desc, v, str)                                     \
-       inet_aton((str), &(v)) CPP_WARN(                                       \
-               "VTY_GET_IPV4_ADDRESS is no longer useful, use inet_aton() or DEFPY.")
-#define VTY_GET_IPV4_PREFIX(desc, v, str)                                      \
-       str2prefix_ipv4((str), &(v)) CPP_WARN(                                 \
-               "VTY_GET_IPV4_PREFIX is no longer useful, use str2prefix_ipv4() or DEFPY.")
-#define vty_outln(vty, str, ...)                                               \
-       vty_out(vty, str "\n", ##__VA_ARGS__) CPP_WARN(                        \
-               "vty_outln is no longer useful, use vty_out(...\\n...)")
-
 /* Default time out value */
 #define VTY_TIMEOUT_DEFAULT 600
 
@@ -258,8 +231,18 @@ extern void vty_terminate(void);
 extern void vty_reset(void);
 extern struct vty *vty_new(void);
 extern struct vty *vty_stdio(void (*atclose)(int isexit));
+
+/* - vty_frame() output goes to a buffer (for context-begin markers)
+ * - vty_out() will first print this buffer, and clear it
+ * - vty_endframe() clears the buffer without printing it, and prints an
+ *   extra string if the buffer was empty before (for context-end markers)
+ */
 extern int vty_out(struct vty *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
-extern void vty_read_config(const char *, char *);
+extern void vty_frame(struct vty *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
+extern void vty_endframe(struct vty *, const char *);
+bool vty_set_include(struct vty *vty, const char *regexp);
+
+extern bool vty_read_config(const char *, char *);
 extern void vty_time_print(struct vty *, int);
 extern void vty_serv_sock(const char *, unsigned short, const char *);
 extern void vty_close(struct vty *);