root/usr/src/cmd/svr4pkg/libinst/qreason.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 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

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


/*
 * System includes
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#include <libintl.h>

/*
 * local pkg command library includes
 */

#include "libinst.h"
#include "messages.h"

/*
 * forward declarations
 */

static char     *qreasonNoZonename(int caller, int retcode, int started);
static char     *qreasonWithZonename(int caller, int retcode, int started);

/*
 * *****************************************************************************
 * global external (public) functions
 * *****************************************************************************
 */

/*
 * Name:        qreason
 * Description: return message describing specified "quit reason"
 * Arguments:   caller - integer describing the "caller:
 *                      Caller identities:
 *                      0 - pkginstall - pkgask
 *                      1 - pkginstall - pkgadd
 *                      2 - pkginstall - mailmsg
 *                      3 - pkgremove - quitmsg
 *                      4 - pkgremove - mailmsg
 *              retcode - integer return code describing "reason"
 *              includeZonename - integer describing zone for reason
 *                      == 0 - do not include a zone name in the message
 *                      != 0 - include a zone name in the message
 * Returns:     char *
 * NOTE:        all messages are returned from static space that does not need
 *              to be free()ed when no longer needed
 * NOTE:        imbedded "%s"s in returned messages are consistent with the
 *              caller and zone name inclusion:
 *                      0 - no %s's
 *                      1 - one %s - package name
 *                      2 - three %s - package name, rootpath, package instance
 *                      3 - one %s - package name
 *                      4 - two %s - package name, rootpath
 *              If "includeZonename" is true, an extra "%s" is added at the
 *              end of each message for the zone name to be included.
 */

char *
qreason(int caller, int retcode, int started, int includeZonename)
{
        if (includeZonename == 0) {
                return (qreasonNoZonename(caller, retcode, started));
        }

        return (qreasonWithZonename(caller, retcode, started));
}

/*
 * *****************************************************************************
 * static internal (private) functions
 * *****************************************************************************
 */

static char *
qreasonNoZonename(int caller, int retcode, int started)
{
        switch (retcode) {
            case  0:
            case 10:
            case 20:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_SUC);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_SUC0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_SUC1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_SUC0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_SUC1);
                    default:
                        return (MSG_UNKREQ);
                }

            case  1:
            case 11:
            case 21:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_FAIL);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_FAIL0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_FAIL1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_FAIL0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_FAIL1);
                    default:
                        return (MSG_UNKREQ);
                }

            case  2:
            case 12:
            case 22:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_PARFAIL);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_PARFAIL0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_PARFAIL1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_PARFAIL0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_PARFAIL1);
                    default:
                        return (MSG_UNKREQ);
                }

            case  3:
            case 13:
            case 23:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_USER);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_USER0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_USER1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_USER0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_USER1);
                    default:
                        return (MSG_UNKREQ);
                }

            case  4:
            case 14:
            case 24:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_SUA);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_SUA0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_SUA1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_SUA0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_SUA1);
                    default:
                        return (MSG_UNKREQ);
                }

            case  5:
            case 15:
            case 25:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_SUI);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_SUI0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_SUI1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_SUI0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_SUI1);
                    default:
                        return (MSG_UNKREQ);
                }

            case 99:
                if (started) {
                        switch (caller) {
                            case 0: /* pkginstall - pkgask */
                                return (MSG_RE_IEPI);
                            case 1: /* pkginstall - pkgadd */
                                return (MSG_IN_IEPI0);
                            case 2: /* pkginstall - mailmsg */
                                return (MSG_IN_IEPI1);
                            case 3: /* pkgremove - quitmsg */
                                return (MSG_RM_IEPI0);
                            case 4: /* pkgremove - mailmsg */
                                return (MSG_RM_IEPI1);
                            default:
                                return (MSG_UNKREQ);
                        }
                }

                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_IE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_IE0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_IE1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_IE0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_IE1);
                    default:
                        return (MSG_UNKREQ);
                }

            default:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_UNK);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_UNK0);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_UNK1);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_UNK0);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_UNK1);
                    default:
                        return (MSG_UNKREQ);
                }
        }
}

static char *
qreasonWithZonename(int caller, int retcode, int started)
{
        switch (retcode) {
            case  0:
            case 10:
            case 20:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_SUC_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_SUC0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_SUC1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_SUC0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_SUC1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            case  1:
            case 11:
            case 21:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_FAIL_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_FAIL0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_FAIL1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_FAIL0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_FAIL1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            case  2:
            case 12:
            case 22:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_PARFAIL_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_PARFAIL0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_PARFAIL1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_PARFAIL0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_PARFAIL1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            case  3:
            case 13:
            case 23:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_USER_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_USER0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_USER1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_USER0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_USER1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            case  4:
            case 14:
            case 24:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_SUA_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_SUA0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_SUA1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_SUA0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_SUA1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            case  5:
            case 15:
            case 25:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_SUI_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_SUI0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_SUI1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_SUI0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_SUI1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            case 99:
                if (started) {
                        switch (caller) {
                            case 0: /* pkginstall - pkgask */
                                return (MSG_RE_IEPI_ZONE);
                            case 1: /* pkginstall - pkgadd */
                                return (MSG_IN_IEPI0_ZONE);
                            case 2: /* pkginstall - mailmsg */
                                return (MSG_IN_IEPI1_ZONE);
                            case 3: /* pkgremove - quitmsg */
                                return (MSG_RM_IEPI0_ZONE);
                            case 4: /* pkgremove - mailmsg */
                                return (MSG_RM_IEPI1_ZONE);
                            default:
                                return (MSG_UNKREQ_ZONE);
                        }
                }

                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_IE_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_IE0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_IE1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_IE0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_IE1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }

            default:
                switch (caller) {
                    case 0: /* pkginstall - pkgask */
                        return (MSG_RE_UNK_ZONE);
                    case 1: /* pkginstall - pkgadd */
                        return (MSG_IN_UNK0_ZONE);
                    case 2: /* pkginstall - mailmsg */
                        return (MSG_IN_UNK1_ZONE);
                    case 3: /* pkgremove - quitmsg */
                        return (MSG_RM_UNK0_ZONE);
                    case 4: /* pkgremove - mailmsg */
                        return (MSG_RM_UNK1_ZONE);
                    default:
                        return (MSG_UNKREQ_ZONE);
                }
        }
}