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