root/usr/src/cmd/lp/cmd/lpadmin/lpadmin.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */


/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#include "stdio.h"
#include "ctype.h"
#include "errno.h"
#include "sys/types.h"
#include "sys/utsname.h"
#include "string.h"

#include "lp.h"
#include "msgs.h"
#include "access.h"
#include "class.h"
#include "printers.h"

#define WHO_AM_I        I_AM_LPADMIN
#include "oam.h"

#include "lpadmin.h"

#include <locale.h>

extern void             chkopts(),
                        chkopts2(),
                        chkopts3(),
                        exit();

int                     system_labeled = 0;

int                     scheduler_active = 0;

char                    *label = 0;

PRINTER                 *printer_pointer = 0;

static CLASS            *class_pointer = 0;

PWHEEL                  *pwheel_pointer = 0;
char                    *Local_System = 0;

/**
 ** main()
 **/

int
main(int argc, char *argv[])
{
        struct utsname  un;

        (void) setlocale (LC_ALL, "");

#if !defined(TEXT_DOMAIN)
#define TEXT_DOMAIN "SYS_TEST"
#endif
        (void) textdomain(TEXT_DOMAIN);

        if (!is_user_admin()) {
                LP_ERRMSG (ERROR, E_LP_NOTADM);
                done (1);
                /*NOTREACHED*/
        }

        system_labeled = is_system_labeled();

        uname(&un);
        Local_System = strdup(un.nodename);

        options (argc, argv);   /* process command line options */

        chkopts ();             /* check for legality of options */

        startup ();             /* open path to Spooler */

        if (d)
                newdflt (d);    /* -d */

        else if (x) {

                /* allow "any" or "all" to do all destinations */
                if (STREQU(NAME_ALL, x) || STREQU(NAME_ANY, x)) {

                        /*
                         * Just deleting all the printers should get
                         * rid of all the classes, too, but removing
                         * the classes first should make things go a bit
                         * faster.
                         */

                        while ((class_pointer = getclass(NAME_ALL)))
                                rmdest (1, class_pointer->name);

                        if (errno != ENOENT) {
                                LP_ERRMSG1 (
                                        ERROR,
                                        E_ADM_GETCLASSES,
                                        PERROR
                                );
                                done (1);
                                /*NOTREACHED*/
                        }

                        while ((printer_pointer = getprinter(NAME_ALL)))
                                rmdest (0, printer_pointer->name);

                        if (errno != ENOENT) {
                                LP_ERRMSG1 (
                                        ERROR,
                                        E_ADM_GETPRINTERS,
                                        PERROR
                                );
                                done (1);
                                /*NOTREACHED*/
                        }

                } else
                        rmdest (isclass(x), x);

        } else if (!p && S) {
                if (STREQU(*S, NAME_ALL) || STREQU(*S, NAME_ANY)) {
                        while ((pwheel_pointer = getpwheel(NAME_ALL))) {
                                *S = pwheel_pointer->name;
                                chkopts3 (0);
                                label = *S;
                                do_pwheel ();
                        }
                } else {
                        label = 0;
                        do_pwheel ();
                }

#if     defined(J_OPTION)
        } else if (j) {
                do_fault ();    /* -j */
#endif

        } else {
                /* allow "any" or "all" to do all printers */
                if (STREQU(NAME_ALL, p) || STREQU(NAME_ANY, p)) {
                        int called=0;
                        while ((printer_pointer = getprinter(NAME_ALL)) != NULL) {
                                /*
                                 * "chkopts2()" will clobber "s".
                                 */
                                char *          save_s = s;

                                called++;
                                p = printer_pointer->name;
                                chkopts2 (0);

                                if (s)
                                        if (
                                                A || a || e || F || H
                                             || h || i || l || m || M
                                             || o || U || v
                                             || Q != -1 || W != -1
                                        )
                                                LP_ERRMSG1 (
                                                        WARNING,
                                                        E_ADM_SIGNORE,
                                                        p
                                                );
                                label = p;
                                do_printer ();

                                s = save_s;
                        }
                        if (called == 0 )
                                LP_ERRMSG (ERROR, E_ADM_PLONELY);

                        if (errno != ENOENT) {
                                LP_ERRMSG2 (
                                        ERROR,
                                        E_LP_GETPRINTER,
                                        NAME_ALL,
                                        PERROR
                                );
                                done (1);
                                /*NOTREACHED*/
                        }
                } else {
                        label = 0;
                        do_printer ();  /* -p etc. */
                }
        }
        done (0);
        /*NOTREACHED*/
        return (0);
}

/**
 ** putp() - FAKE ROUTINES TO AVOID REAL ONES
 **/

int                     putp ()
{
        return (0);
}