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>