1161754Sru/*	$OpenBSD: cu.c,v 1.19 2006/05/25 08:41:52 jmc Exp $	*/
288276Smarkm/*	$NetBSD: cu.c,v 1.5 1997/02/11 09:24:05 mrg Exp $	*/
388276Smarkm
4331722Seadler/*
57527Sjkh * Copyright (c) 1983, 1993
67527Sjkh *	The Regents of the University of California.  All rights reserved.
77527Sjkh *
87527Sjkh * Redistribution and use in source and binary forms, with or without
97527Sjkh * modification, are permitted provided that the following conditions
107527Sjkh * are met:
117527Sjkh * 1. Redistributions of source code must retain the above copyright
127527Sjkh *    notice, this list of conditions and the following disclaimer.
137527Sjkh * 2. Redistributions in binary form must reproduce the above copyright
147527Sjkh *    notice, this list of conditions and the following disclaimer in the
157527Sjkh *    documentation and/or other materials provided with the distribution.
16161754Sru * 3. Neither the name of the University nor the names of its contributors
177527Sjkh *    may be used to endorse or promote products derived from this software
187527Sjkh *    without specific prior written permission.
197527Sjkh *
207527Sjkh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
217527Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
227527Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
237527Sjkh * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
247527Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
257527Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
267527Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
277527Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
287527Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
297527Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
307527Sjkh * SUCH DAMAGE.
317527Sjkh */
327527Sjkh
3388276Smarkm#include <sys/cdefs.h>
3488276Smarkm__FBSDID("$FreeBSD$");
3588276Smarkm
367527Sjkh#ifndef lint
3728365Scharnier#if 0
387527Sjkhstatic char sccsid[] = "@(#)cu.c	8.1 (Berkeley) 6/6/93";
39161754Srustatic const char rcsid[] = "$OpenBSD: cu.c,v 1.19 2006/05/25 08:41:52 jmc Exp $";
4028365Scharnier#endif
417527Sjkh#endif /* not lint */
427527Sjkh
437527Sjkh#include "tip.h"
447527Sjkh
45161754Srustatic void	cuusage(void);
467527Sjkh
477527Sjkh/*
487527Sjkh * Botch the interface to look like cu's
497527Sjkh */
5088276Smarkmvoid
51161754Srucumain(int argc, char *argv[])
527527Sjkh{
53161754Sru	int ch, i, parity;
5488276Smarkm	long l;
5588276Smarkm	char *cp;
567527Sjkh	static char sbuf[12];
577527Sjkh
5888276Smarkm	if (argc < 2)
5988276Smarkm		cuusage();
607527Sjkh	CU = DV = NOSTR;
617527Sjkh	BR = DEFBR;
62161754Sru	parity = 0;	/* none */
63162124Sru
64162124Sru	/*
65162124Sru	 * We want to accept -# as a speed.  It's easiest to look through
66162124Sru	 * the arguments, replace -# with -s#, and let getopt() handle it.
67162124Sru	 */
68162124Sru	for (i = 1; i < argc; i++) {
69162124Sru		if (argv[i][0] == '-' &&
70162124Sru		    argv[i][1] >= '0' && argv[i][1] <= '9') {
71162124Sru			asprintf(&cp, "-s%s", argv[i] + 1);
72162124Sru			if (cp == NULL) {
73162124Sru				fprintf(stderr,
74162124Sru				    "%s: cannot convert -# to -s#\n",
75162124Sru				    __progname);
76162124Sru				exit(3);
77162124Sru			}
78162124Sru			argv[i] = cp;
79162124Sru		}
80162124Sru	}
81162124Sru
82162124Sru	while ((ch = getopt(argc, argv, "a:l:s:htoe")) != -1) {
83161754Sru		switch (ch) {
847527Sjkh		case 'a':
8588276Smarkm			CU = optarg;
867527Sjkh			break;
8788276Smarkm		case 'l':
8888276Smarkm			if (DV != NULL) {
8988276Smarkm				fprintf(stderr,
9088276Smarkm				    "%s: cannot specificy multiple -l options\n",
9188276Smarkm				    __progname);
9288276Smarkm				exit(3);
9388276Smarkm			}
9488276Smarkm			if (strchr(optarg, '/'))
9588276Smarkm				DV = optarg;
9688276Smarkm			else
9788276Smarkm				asprintf(&DV, "/dev/%s", optarg);
9888276Smarkm			break;
997527Sjkh		case 's':
10088276Smarkm			l = strtol(optarg, &cp, 10);
101161754Sru			if (*cp != '\0' || l < 0 || l >= INT_MAX) {
10288276Smarkm				fprintf(stderr, "%s: unsupported speed %s\n",
10388276Smarkm				    __progname, optarg);
1047527Sjkh				exit(3);
1057527Sjkh			}
10688276Smarkm			BR = (int)l;
1077527Sjkh			break;
10888276Smarkm		case 'h':
10988276Smarkm			setboolean(value(LECHO), TRUE);
11088276Smarkm			HD = TRUE;
1117527Sjkh			break;
11288276Smarkm		case 't':
11388276Smarkm			HW = 1, DU = -1;
11488276Smarkm			break;
11588276Smarkm		case 'o':
116161754Sru			if (parity != 0)
117161754Sru				parity = 0;	/* -e -o */
118161754Sru			else
119161754Sru				parity = 1;	/* odd */
12088276Smarkm			break;
12188276Smarkm		case 'e':
122161754Sru			if (parity != 0)
123161754Sru				parity = 0;	/* -o -e */
124161754Sru			else
125161754Sru				parity = -1;	/* even */
12688276Smarkm			break;
1277527Sjkh		default:
12888276Smarkm			cuusage();
1297527Sjkh			break;
1307527Sjkh		}
1317527Sjkh	}
13288276Smarkm	argc -= optind;
13388276Smarkm	argv += optind;
13488276Smarkm
13588276Smarkm	switch (argc) {
13688276Smarkm	case 1:
13788276Smarkm		PN = argv[0];
13888276Smarkm		break;
13988276Smarkm	case 0:
14088276Smarkm		break;
14188276Smarkm	default:
14288276Smarkm		cuusage();
14388276Smarkm		break;
14488276Smarkm	}
14588276Smarkm
1467527Sjkh	signal(SIGINT, cleanup);
1477527Sjkh	signal(SIGQUIT, cleanup);
1487527Sjkh	signal(SIGHUP, cleanup);
1497527Sjkh	signal(SIGTERM, cleanup);
150161754Sru	signal(SIGCHLD, SIG_DFL);
1517527Sjkh
1527527Sjkh	/*
1537527Sjkh	 * The "cu" host name is used to define the
1547527Sjkh	 * attributes of the generic dialer.
1557527Sjkh	 */
15688276Smarkm	(void)snprintf(sbuf, sizeof(sbuf), "cu%ld", BR);
1577527Sjkh	if ((i = hunt(sbuf)) == 0) {
1587527Sjkh		printf("all ports busy\n");
1597527Sjkh		exit(3);
1607527Sjkh	}
1617527Sjkh	if (i == -1) {
1627527Sjkh		printf("link down\n");
1637527Sjkh		(void)uu_unlock(uucplock);
1647527Sjkh		exit(3);
1657527Sjkh	}
1667527Sjkh	setbuf(stdout, NULL);
1677527Sjkh	loginit();
1687527Sjkh	user_uid();
1697527Sjkh	vinit();
170161754Sru	switch (parity) {
171161754Sru	case -1:
172161754Sru		setparity("even");
173161754Sru		break;
174161754Sru	case 1:
175161754Sru		setparity("odd");
176161754Sru		break;
177161754Sru	default:
178161754Sru		setparity("none");
179161754Sru		break;
180161754Sru	}
18188276Smarkm	setboolean(value(VERBOSE), FALSE);
182161754Sru	if (HW && ttysetup(BR)) {
183161754Sru		fprintf(stderr, "%s: unsupported speed %ld\n",
184161754Sru		    __progname, BR);
185161754Sru		daemon_uid();
186161754Sru		(void)uu_unlock(uucplock);
187161754Sru		exit(3);
188161754Sru	}
189161754Sru	if (con()) {
1907527Sjkh		printf("Connect failed\n");
1917527Sjkh		daemon_uid();
1927527Sjkh		(void)uu_unlock(uucplock);
1937527Sjkh		exit(1);
1947527Sjkh	}
195161754Sru	if (!HW && ttysetup(BR)) {
196161754Sru		fprintf(stderr, "%s: unsupported speed %ld\n",
197161754Sru		    __progname, BR);
198161754Sru		daemon_uid();
199161754Sru		(void)uu_unlock(uucplock);
200161754Sru		exit(3);
201161754Sru	}
2027527Sjkh}
20388276Smarkm
204161754Srustatic void
205161754Srucuusage(void)
20688276Smarkm{
207161754Sru	fprintf(stderr, "usage: cu [-ehot] [-a acu] [-l line] "
208161754Sru	    "[-s speed | -speed] [phone-number]\n");
20988276Smarkm	exit(8);
21088276Smarkm}
211