root/usr/src/cmd/tip/cu.c
/*
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright (c) 1983 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

#include "tip.h"

int     gid, egid;
int     uid, euid;
void    cleanup(void);
void    timeout(void);

/*
 * Botch the interface to look like cu's
 */
void
cumain(int argc, char *argv[])
{
        int i;
        static char sbuf[14];

        if (argc < 2) {
usage:
                (void) fprintf(stderr,
        "usage: cu telno [-t] [-s speed] [-a acu] [-l line] [-#]\n");
                exit(8);
        }
        CU = DV = NOSTR;
        for (; argc > 1; argv++, argc--) {
                if (argv[1][0] != '-')
                        PN = argv[1];
                else if (argv[1][1] != '\0' && argv[1][2] != '\0') {
                        (void) fprintf(stderr,
                            "cu: extra characters after flag: %s\n",
                            argv[1]);
                        goto usage;
                } else switch (argv[1][1]) {

                case 't':
                        HW = 1, DU = -1;
                        --argc;
                        continue;

                case 'a':
                        CU = argv[2]; ++argv; --argc;
                        break;

                case 's':
                        if (argc < 3)
                                goto usage;
                        if (speed(atoi(argv[2])) == 0) {
                                (void) fprintf(stderr,
                                    "cu: unsupported speed %s\n",
                                    argv[2]);
                                exit(3);
                        }
                        BR = atoi(argv[2]); ++argv; --argc;
                        break;

                case 'l':
                        DV = argv[2]; ++argv; --argc;
                        break;

                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
                        if (CU)
                                CU[strlen(CU)-1] = argv[1][1];
                        if (DV)
                                DV[strlen(DV)-1] = argv[1][1];
                        break;

                default:
                        (void) fprintf(stderr, "cu: bad flag %s\n", argv[1]);
                        goto usage;
                }
        }
        (void) signal(SIGINT, (sig_handler_t)cleanup);
        (void) signal(SIGQUIT, (sig_handler_t)cleanup);
        (void) signal(SIGHUP, (sig_handler_t)cleanup);
        (void) signal(SIGTERM, (sig_handler_t)cleanup);

        /*
         * The "cu" host name is used to define the
         * attributes of the generic dialer.
         */
        (void) snprintf(sbuf, sizeof (sbuf), "cu%d", BR);
        if ((i = hunt(sbuf)) == 0) {
                (void) printf("all ports busy\n");
                exit(3);
        }
        if (i == -1) {
                (void) printf("link down\n");
                delock(uucplock);
                exit(3);
        }
        setbuf(stdout, NULL);
        loginit();
        gid = getgid();
        egid = getegid();
        uid = getuid();
        euid = geteuid();
        userperm();
        vinit();
        setparity("none");
        boolean(value(VERBOSE)) = 0;
        if (HW)
                ttysetup(speed(BR));
        if (connect()) {
                (void) printf("Connect failed\n");
                myperm();
                delock(uucplock);
                exit(1);
        }
        if (!HW)
                ttysetup(speed(BR));
}