Annotation of embedaddon/bird2/client/birdcl.c, revision 1.1.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>