1 /* $OpenBSD: cu.c,v 1.19 2006/05/25 08:41:52 jmc Exp $ */
2 /* $NetBSD: cu.c,v 1.5 1997/02/11 09:24:05 mrg Exp $ */
3
4 /*-
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 * Copyright (c) 1983, 1993
8 * The Regents of the University of California. All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35 #include "tip.h"
36
37 static void cuusage(void);
38
39 /*
40 * Botch the interface to look like cu's
41 */
42 void
cumain(int argc,char * argv[])43 cumain(int argc, char *argv[])
44 {
45 int ch, i, parity;
46 long l;
47 char *cp;
48 static char sbuf[12];
49
50 if (argc < 2)
51 cuusage();
52 CU = DV = NOSTR;
53 BR = DEFBR;
54 parity = 0; /* none */
55
56 /*
57 * We want to accept -# as a speed. It's easiest to look through
58 * the arguments, replace -# with -s#, and let getopt() handle it.
59 */
60 for (i = 1; i < argc; i++) {
61 if (argv[i][0] == '-' &&
62 argv[i][1] >= '0' && argv[i][1] <= '9') {
63 asprintf(&cp, "-s%s", argv[i] + 1);
64 if (cp == NULL) {
65 fprintf(stderr,
66 "%s: cannot convert -# to -s#\n",
67 __progname);
68 exit(3);
69 }
70 argv[i] = cp;
71 }
72 }
73
74 while ((ch = getopt(argc, argv, "a:l:s:htoe")) != -1) {
75 switch (ch) {
76 case 'a':
77 CU = optarg;
78 break;
79 case 'l':
80 if (DV != NULL) {
81 fprintf(stderr,
82 "%s: cannot specificy multiple -l options\n",
83 __progname);
84 exit(3);
85 }
86 if (strchr(optarg, '/'))
87 DV = optarg;
88 else
89 asprintf(&DV, "/dev/%s", optarg);
90 break;
91 case 's':
92 l = strtol(optarg, &cp, 10);
93 if (*cp != '\0' || l < 0 || l >= INT_MAX) {
94 fprintf(stderr, "%s: unsupported speed %s\n",
95 __progname, optarg);
96 exit(3);
97 }
98 BR = (int)l;
99 break;
100 case 'h':
101 setboolean(value(LECHO), TRUE);
102 HD = TRUE;
103 break;
104 case 't':
105 HW = 1, DU = -1;
106 break;
107 case 'o':
108 if (parity != 0)
109 parity = 0; /* -e -o */
110 else
111 parity = 1; /* odd */
112 break;
113 case 'e':
114 if (parity != 0)
115 parity = 0; /* -o -e */
116 else
117 parity = -1; /* even */
118 break;
119 default:
120 cuusage();
121 break;
122 }
123 }
124 argc -= optind;
125 argv += optind;
126
127 switch (argc) {
128 case 1:
129 PN = argv[0];
130 break;
131 case 0:
132 break;
133 default:
134 cuusage();
135 break;
136 }
137
138 signal(SIGINT, cleanup);
139 signal(SIGQUIT, cleanup);
140 signal(SIGHUP, cleanup);
141 signal(SIGTERM, cleanup);
142 signal(SIGCHLD, SIG_DFL);
143
144 /*
145 * The "cu" host name is used to define the
146 * attributes of the generic dialer.
147 */
148 (void)snprintf(sbuf, sizeof(sbuf), "cu%ld", BR);
149 if ((i = hunt(sbuf)) == 0) {
150 printf("all ports busy\n");
151 exit(3);
152 }
153 if (i == -1) {
154 printf("link down\n");
155 (void)uu_unlock(uucplock);
156 exit(3);
157 }
158 setbuf(stdout, NULL);
159 loginit();
160 user_uid();
161 vinit();
162 switch (parity) {
163 case -1:
164 setparity("even");
165 break;
166 case 1:
167 setparity("odd");
168 break;
169 default:
170 setparity("none");
171 break;
172 }
173 setboolean(value(VERBOSE), FALSE);
174 if (HW && ttysetup(BR)) {
175 fprintf(stderr, "%s: unsupported speed %ld\n",
176 __progname, BR);
177 daemon_uid();
178 (void)uu_unlock(uucplock);
179 exit(3);
180 }
181 if (con()) {
182 printf("Connect failed\n");
183 daemon_uid();
184 (void)uu_unlock(uucplock);
185 exit(1);
186 }
187 if (!HW && ttysetup(BR)) {
188 fprintf(stderr, "%s: unsupported speed %ld\n",
189 __progname, BR);
190 daemon_uid();
191 (void)uu_unlock(uucplock);
192 exit(3);
193 }
194 }
195
196 static void
cuusage(void)197 cuusage(void)
198 {
199 fprintf(stderr, "usage: cu [-ehot] [-a acu] [-l line] "
200 "[-s speed | -speed] [phone-number]\n");
201 exit(8);
202 }
203