]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/telnet/telnet/main.c
zfs: merge openzfs/zfs@ad0a55461
[FreeBSD/FreeBSD.git] / contrib / telnet / telnet / main.c
1 /*
2  * Copyright (c) 1988, 1990, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #if 0
31 #ifndef lint
32 static const char sccsid[] = "@(#)main.c        8.3 (Berkeley) 5/30/95";
33 #endif
34 #endif
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 #include <sys/param.h>
39 #include <sys/socket.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <unistd.h>
43
44 #include "ring.h"
45 #include "externs.h"
46 #include "defines.h"
47
48 #ifdef  AUTHENTICATION
49 #include <libtelnet/auth.h>
50 #endif
51 #ifdef  ENCRYPTION
52 #include <libtelnet/encrypt.h>
53 #endif
54
55 /* These values need to be the same as defined in libtelnet/kerberos5.c */
56 /* Either define them in both places, or put in some common header file. */
57 #define OPTS_FORWARD_CREDS      0x00000002
58 #define OPTS_FORWARDABLE_CREDS  0x00000001
59
60 #if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
61 char *ipsec_policy_in = NULL;
62 char *ipsec_policy_out = NULL;
63 #endif
64
65 extern int tos;
66 extern int quiet_mode;
67
68 int family = AF_UNSPEC;
69
70 /*
71  * Initialize variables.
72  */
73 void
74 tninit(void)
75 {
76     init_terminal();
77
78     init_network();
79
80     init_telnet();
81
82     init_sys();
83 }
84
85 static void
86 usage(void)
87 {
88         fprintf(stderr, "usage: %s %s%s%s%s\n",
89             prompt,
90 #ifdef  AUTHENTICATION
91             "[-4] [-6] [-8] [-B baudrate] [-E] [-K] [-L] [-N] [-S tos] [-X atype]",
92             "\n\t[-c] [-d] [-e char] [-k realm] [-l user] [-f/-F] [-n tracefile] ",
93 #else
94             "[-4] [-6] [-8] [-B baudrate] [-E] [-L] [-N] [-S tos] [-c] [-d]",
95             "\n\t[-e char] [-l user] [-n tracefile] ",
96 #endif
97             "[-r] [-s src_addr] [-u] ",
98 #if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
99             "[-P policy] "
100 #endif
101 #ifdef  ENCRYPTION
102             "[-y] [host-name [port]]"
103 #else   /* ENCRYPTION */
104             "[host-name [port]]"
105 #endif  /* ENCRYPTION */
106         );
107         exit(1);
108 }
109
110 /*
111  * main.  Parse arguments, invoke the protocol or command parser.
112  */
113
114 int
115 main(int argc, char *argv[])
116 {
117         u_long ultmp;
118         int ch;
119         char *ep, *user;
120         char *src_addr = NULL;
121 #ifdef  FORWARD
122         extern int forward_flags;
123 #endif  /* FORWARD */
124
125         setbuf(stdout, NULL);
126         setbuf(stderr, NULL);
127         tninit();               /* Clear out things */
128
129         TerminalSaveState();
130
131         if ((prompt = strrchr(argv[0], '/')))
132                 ++prompt;
133         else
134                 prompt = argv[0];
135
136         user = NULL;
137
138         rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
139 #ifdef AUTHENTICATION
140         autologin = 1;
141 #else
142         autologin = -1;
143 #endif
144
145 #ifdef  ENCRYPTION
146         encrypt_auto(1);
147         decrypt_auto(1);
148 #endif
149
150 #if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
151 #define IPSECOPT        "P:"
152 #else
153 #define IPSECOPT
154 #endif
155         while ((ch = getopt(argc, argv,
156                             "468B:EKLNQS:X:acde:fFk:l:n:rs:uxy" IPSECOPT)) != -1)
157 #undef IPSECOPT
158         {
159                 switch(ch) {
160                 case '4':
161                         family = AF_INET;
162                         break;
163 #ifdef INET6
164                 case '6':
165                         family = AF_INET6;
166                         break;
167 #endif
168                 case '8':
169                         eight = 3;      /* binary output and input */
170                         break;
171                 case 'B':
172                         DoBaudRate(optarg);
173                         break;
174                 case 'E':
175                         rlogin = escape = _POSIX_VDISABLE;
176                         break;
177                 case 'K':
178 #ifdef  AUTHENTICATION
179                         autologin = 0;
180 #endif
181                         break;
182                 case 'L':
183                         eight |= 2;     /* binary output only */
184                         break;
185                 case 'N':
186                         doaddrlookup = 0;
187                         break;
188                 case 'Q':
189                         quiet_mode = 1;
190                         break;
191                 case 'S':
192 #ifdef  HAS_GETTOS
193
194                         if ((tos = parsetos(optarg, "tcp")) < 0)
195                                 fprintf(stderr, "%s%s%s%s\n",
196                                         prompt, ": Bad TOS argument '",
197                                         optarg,
198                                         "; will try to use default TOS");
199 #else
200 #define MAXTOS  255
201                         ultmp = strtoul(optarg, &ep, 0);
202                         if (*ep || ep == optarg || ultmp > MAXTOS)
203                                 fprintf(stderr, "%s%s%s%s\n",
204                                         prompt, ": Bad TOS argument '",
205                                         optarg,
206                                         "; will try to use default TOS");
207                         else
208                                 tos = ultmp;
209 #endif
210                         break;
211                 case 'X':
212 #ifdef  AUTHENTICATION
213                         auth_disable_name(optarg);
214 #endif
215                         break;
216                 case 'a':
217 #ifdef  AUTHENTICATION
218                         /* It's the default now, so ignore */
219 #else
220                         autologin = 1;
221 #endif
222                         break;
223                 case 'c':
224                         skiprc = 1;
225                         break;
226                 case 'd':
227                         telnet_debug = 1;
228                         break;
229                 case 'e':
230                         set_escape_char(optarg);
231                         break;
232                 case 'f':
233 #ifdef  AUTHENTICATION
234 #if defined(KRB5) && defined(FORWARD)
235                         if (forward_flags & OPTS_FORWARD_CREDS) {
236                             fprintf(stderr,
237                                     "%s: Only one of -f and -F allowed.\n",
238                                     prompt);
239                             usage();
240                         }
241                         forward_flags |= OPTS_FORWARD_CREDS;
242 #else
243                         fprintf(stderr,
244                          "%s: Warning: -f ignored, no Kerberos V5 support.\n",
245                                 prompt);
246 #endif
247 #else
248                         fprintf(stderr,
249                          "%s: Warning: -f ignored, no Kerberos V5 support.\n",
250                                 prompt);
251 #endif
252                         break;
253                 case 'F':
254 #ifdef  AUTHENTICATION
255 #if defined(KRB5) && defined(FORWARD)
256                         if (forward_flags & OPTS_FORWARD_CREDS) {
257                             fprintf(stderr,
258                                     "%s: Only one of -f and -F allowed.\n",
259                                     prompt);
260                             usage();
261                         }
262                         forward_flags |= OPTS_FORWARD_CREDS;
263                         forward_flags |= OPTS_FORWARDABLE_CREDS;
264 #else
265                         fprintf(stderr,
266                          "%s: Warning: -F ignored, no Kerberos V5 support.\n",
267                                 prompt);
268 #endif
269 #else
270                         fprintf(stderr,
271                          "%s: Warning: -F ignored, no Kerberos V5 support.\n",
272                                 prompt);
273 #endif
274                         break;
275                 case 'k':
276 #ifdef  AUTHENTICATION
277 #if defined(KRB4)
278                     {
279                         extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
280                         dest_realm = dst_realm_buf;
281                         (void)strncpy(dest_realm, optarg, dst_realm_sz);
282                     }
283 #else
284                         fprintf(stderr,
285                            "%s: Warning: -k ignored, no Kerberos V4 support.\n",
286                                                                 prompt);
287 #endif
288 #else
289                         fprintf(stderr,
290                            "%s: Warning: -k ignored, no Kerberos V4 support.\n",
291                                                                 prompt);
292 #endif
293                         break;
294                 case 'l':
295 #ifdef  AUTHENTICATION
296                         /* This is the default now, so ignore it */
297 #else
298                         autologin = 1;
299 #endif
300                         user = optarg;
301                         break;
302                 case 'n':
303                                 SetNetTrace(optarg);
304                         break;
305                 case 'r':
306                         rlogin = '~';
307                         break;
308                 case 's':
309                         src_addr = optarg;
310                         break;
311                 case 'u':
312                         family = AF_UNIX;
313                         break;
314                 case 'x':
315 #ifndef ENCRYPTION
316                         fprintf(stderr,
317                             "%s: Warning: -x ignored, no ENCRYPT support.\n",
318                                                                 prompt);
319 #endif  /* ENCRYPTION */
320                         break;
321                 case 'y':
322 #ifdef  ENCRYPTION
323                         encrypt_auto(0);
324                         decrypt_auto(0);
325 #else
326                         fprintf(stderr,
327                             "%s: Warning: -y ignored, no ENCRYPT support.\n",
328                                                                 prompt);
329 #endif  /* ENCRYPTION */
330                         break;
331 #if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
332                 case 'P':
333                         if (!strncmp("in", optarg, 2))
334                                 ipsec_policy_in = strdup(optarg);
335                         else if (!strncmp("out", optarg, 3))
336                                 ipsec_policy_out = strdup(optarg);
337                         else
338                                 usage();
339                         break;
340 #endif
341                 case '?':
342                 default:
343                         usage();
344                         /* NOTREACHED */
345                 }
346         }
347         if (autologin == -1)
348                 autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
349
350         argc -= optind;
351         argv += optind;
352
353         if (argc) {
354                 char *args[9], **argp = args;
355
356                 if (argc > 2)
357                         usage();
358                 *argp++ = prompt;
359                 if (user) {
360                         *argp++ = strdup("-l");
361                         *argp++ = user;
362                 }
363                 if (src_addr) {
364                         *argp++ = strdup("-s");
365                         *argp++ = src_addr;
366                 }
367                 *argp++ = argv[0];              /* host */
368                 if (argc > 1)
369                         *argp++ = argv[1];      /* port */
370                 *argp = 0;
371
372                 if (setjmp(toplevel) != 0)
373                         Exit(0);
374                 if (tn(argp - args, args) == 1)
375                         return (0);
376                 else
377                         return (1);
378         }
379         (void)setjmp(toplevel);
380         for (;;) {
381                         command(1, 0, 0);
382         }
383         return 0;
384 }