Annotation of embedaddon/bird2/client/birdcl.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     BIRD Client - Light variant I/O
        !             3:  *
        !             4:  *     (c) 1999--2004 Martin Mares <mj@ucw.cz>
        !             5:  *      (c) 2013 Tomas Hlavacek <tomas.hlavacek@nic.cz>
        !             6:  *
        !             7:  *     Can be freely distributed and used under the terms of the GNU GPL.
        !             8:  */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #include <stdlib.h>
        !            12: #include <unistd.h>
        !            13: #include <termios.h>
        !            14: #include <errno.h>
        !            15: 
        !            16: #include <sys/ioctl.h>
        !            17: #include <signal.h>
        !            18: 
        !            19: #include "nest/bird.h"
        !            20: #include "lib/resource.h"
        !            21: #include "lib/string.h"
        !            22: #include "client/client.h"
        !            23: #include "sysdep/unix/unix.h"
        !            24: 
        !            25: #define INPUT_BUF_LEN 2048
        !            26: 
        !            27: struct termios tty_save;
        !            28: 
        !            29: void
        !            30: input_start_list(void)
        !            31: {
        !            32:   /* Empty in non-ncurses version. */
        !            33: }
        !            34: 
        !            35: void
        !            36: input_stop_list(void)
        !            37: {
        !            38:   /* Empty in non-ncurses version. */
        !            39: }
        !            40: 
        !            41: void
        !            42: input_notify(int prompt)
        !            43: {
        !            44:   /* No ncurses -> no status to reveal/hide, print prompt manually. */
        !            45:   if (!prompt)
        !            46:     return;
        !            47: 
        !            48:   printf("bird> ");
        !            49:   fflush(stdout);
        !            50: }
        !            51: 
        !            52: 
        !            53: static int
        !            54: lastnb(char *str, int i)
        !            55: {
        !            56:   while (i--)
        !            57:     if ((str[i] != ' ') && (str[i] != '\t'))
        !            58:       return str[i];
        !            59: 
        !            60:   return 0;
        !            61: }
        !            62: 
        !            63: void
        !            64: input_read(void)
        !            65: {
        !            66:   char buf[INPUT_BUF_LEN];
        !            67: 
        !            68:   if ((fgets(buf, INPUT_BUF_LEN, stdin) == NULL) || (buf[0] == 0))
        !            69:   {
        !            70:     putchar('\n');
        !            71:     cleanup();
        !            72:     exit(0);
        !            73:   }
        !            74: 
        !            75:   int l = strlen(buf);
        !            76:   if ((l+1) == INPUT_BUF_LEN)
        !            77:     {
        !            78:       printf("Input too long.\n");
        !            79:       return;
        !            80:     }
        !            81: 
        !            82:   if (buf[l-1] == '\n')
        !            83:     buf[--l] = '\0';
        !            84: 
        !            85:   if (!interactive)
        !            86:     printf("%s\n", buf);
        !            87: 
        !            88:   if (l == 0)
        !            89:     return;
        !            90: 
        !            91:   if (lastnb(buf, l) == '?')
        !            92:     {
        !            93:       cmd_help(buf, strlen(buf));
        !            94:       return;
        !            95:     }
        !            96: 
        !            97:   submit_command(buf);
        !            98: }
        !            99: 
        !           100: static struct termios stored_tty;
        !           101: static int more_active = 0;
        !           102: 
        !           103: void
        !           104: more_begin(void)
        !           105: {
        !           106:   static struct termios tty;
        !           107: 
        !           108:   tty = stored_tty;
        !           109:   tty.c_lflag &= (~ECHO);
        !           110:   tty.c_lflag &= (~ICANON);
        !           111: 
        !           112:   if (tcsetattr (0, TCSANOW, &tty) < 0)
        !           113:     DIE("tcsetattr");
        !           114: 
        !           115:   more_active = 1;
        !           116: }
        !           117: 
        !           118: void
        !           119: more_end(void)
        !           120: {
        !           121:   more_active = 0;
        !           122: 
        !           123:   if (tcsetattr (0, TCSANOW, &stored_tty) < 0)
        !           124:     DIE("tcsetattr");
        !           125: }
        !           126: 
        !           127: static void
        !           128: sig_handler(int signal UNUSED)
        !           129: {
        !           130:   cleanup();
        !           131:   exit(0);
        !           132: }
        !           133: 
        !           134: void
        !           135: input_init(void)
        !           136: {
        !           137:   if (!interactive)
        !           138:     return;
        !           139: 
        !           140:   if (tcgetattr(0, &stored_tty) < 0)
        !           141:     DIE("tcgetattr");
        !           142: 
        !           143:   if (signal(SIGINT, sig_handler) == SIG_IGN)
        !           144:     signal(SIGINT, SIG_IGN);
        !           145:   if (signal(SIGTERM, sig_handler) == SIG_IGN)
        !           146:     signal(SIGTERM, SIG_IGN);
        !           147: 
        !           148:   struct winsize tws;
        !           149:   if (ioctl(0, TIOCGWINSZ, &tws) == 0)
        !           150:     {
        !           151:       term_lns = tws.ws_row;
        !           152:       term_cls = tws.ws_col;
        !           153:     }
        !           154: }
        !           155: 
        !           156: void
        !           157: cleanup(void)
        !           158: {
        !           159:   if (more_active)
        !           160:     more_end();
        !           161: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>