1*9781SMoriah.Waterland@Sun.COM /* 2*9781SMoriah.Waterland@Sun.COM * CDDL HEADER START 3*9781SMoriah.Waterland@Sun.COM * 4*9781SMoriah.Waterland@Sun.COM * The contents of this file are subject to the terms of the 5*9781SMoriah.Waterland@Sun.COM * Common Development and Distribution License (the "License"). 6*9781SMoriah.Waterland@Sun.COM * You may not use this file except in compliance with the License. 7*9781SMoriah.Waterland@Sun.COM * 8*9781SMoriah.Waterland@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*9781SMoriah.Waterland@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*9781SMoriah.Waterland@Sun.COM * See the License for the specific language governing permissions 11*9781SMoriah.Waterland@Sun.COM * and limitations under the License. 12*9781SMoriah.Waterland@Sun.COM * 13*9781SMoriah.Waterland@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*9781SMoriah.Waterland@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*9781SMoriah.Waterland@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*9781SMoriah.Waterland@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*9781SMoriah.Waterland@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*9781SMoriah.Waterland@Sun.COM * 19*9781SMoriah.Waterland@Sun.COM * CDDL HEADER END 20*9781SMoriah.Waterland@Sun.COM */ 21*9781SMoriah.Waterland@Sun.COM 22*9781SMoriah.Waterland@Sun.COM /* 23*9781SMoriah.Waterland@Sun.COM * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*9781SMoriah.Waterland@Sun.COM * Use is subject to license terms. 25*9781SMoriah.Waterland@Sun.COM */ 26*9781SMoriah.Waterland@Sun.COM 27*9781SMoriah.Waterland@Sun.COM /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28*9781SMoriah.Waterland@Sun.COM /* All Rights Reserved */ 29*9781SMoriah.Waterland@Sun.COM 30*9781SMoriah.Waterland@Sun.COM 31*9781SMoriah.Waterland@Sun.COM #include <stdio.h> 32*9781SMoriah.Waterland@Sun.COM #include <limits.h> 33*9781SMoriah.Waterland@Sun.COM #include <string.h> 34*9781SMoriah.Waterland@Sun.COM #include <stdlib.h> 35*9781SMoriah.Waterland@Sun.COM #include <sys/stat.h> /* mkdir declaration is here? */ 36*9781SMoriah.Waterland@Sun.COM #include <unistd.h> 37*9781SMoriah.Waterland@Sun.COM #include <errno.h> 38*9781SMoriah.Waterland@Sun.COM #include <utmpx.h> 39*9781SMoriah.Waterland@Sun.COM #include <dirent.h> 40*9781SMoriah.Waterland@Sun.COM #include <sys/types.h> 41*9781SMoriah.Waterland@Sun.COM #include <locale.h> 42*9781SMoriah.Waterland@Sun.COM #include <libintl.h> 43*9781SMoriah.Waterland@Sun.COM #include <pkgstrct.h> 44*9781SMoriah.Waterland@Sun.COM #include <pkglocs.h> 45*9781SMoriah.Waterland@Sun.COM #include "install.h" 46*9781SMoriah.Waterland@Sun.COM #include <pkglib.h> 47*9781SMoriah.Waterland@Sun.COM #include "libadm.h" 48*9781SMoriah.Waterland@Sun.COM #include "libinst.h" 49*9781SMoriah.Waterland@Sun.COM #include "pkginstall.h" 50*9781SMoriah.Waterland@Sun.COM 51*9781SMoriah.Waterland@Sun.COM extern struct admin adm; 52*9781SMoriah.Waterland@Sun.COM extern struct cfextra **extlist; 53*9781SMoriah.Waterland@Sun.COM extern int ckquit, nocnflct, nosetuid, rprcflag; 54*9781SMoriah.Waterland@Sun.COM extern char ilockfile[], rlockfile[], instdir[], savlog[], 55*9781SMoriah.Waterland@Sun.COM tmpdir[], pkgloc[], pkgloc_sav[], pkgbin[], pkgsav[], 56*9781SMoriah.Waterland@Sun.COM *pkginst, *msgtext; 57*9781SMoriah.Waterland@Sun.COM extern char saveSpoolInstallDir[]; 58*9781SMoriah.Waterland@Sun.COM 59*9781SMoriah.Waterland@Sun.COM static boolean_t preinstallCheck = B_FALSE; 60*9781SMoriah.Waterland@Sun.COM static char *zoneName = (char *)NULL; 61*9781SMoriah.Waterland@Sun.COM 62*9781SMoriah.Waterland@Sun.COM static char ask_cont[100]; 63*9781SMoriah.Waterland@Sun.COM 64*9781SMoriah.Waterland@Sun.COM #define DISPSIZ 20 /* number of items to display on one page */ 65*9781SMoriah.Waterland@Sun.COM 66*9781SMoriah.Waterland@Sun.COM #define MSG_RUNLEVEL "\\nThe current run-level of this machine is <%s>, " \ 67*9781SMoriah.Waterland@Sun.COM "which is not a run-level suggested for installation " \ 68*9781SMoriah.Waterland@Sun.COM "of this package. Suggested run-levels (in order of " \ 69*9781SMoriah.Waterland@Sun.COM "preference) include:" 70*9781SMoriah.Waterland@Sun.COM #define HLP_RUNLEVEL "If this package is not installed in a run-level " \ 71*9781SMoriah.Waterland@Sun.COM "which has been suggested, it is possible that the " \ 72*9781SMoriah.Waterland@Sun.COM "package may not install or operate properly. If " \ 73*9781SMoriah.Waterland@Sun.COM "you wish to follow the run-level suggestions, " \ 74*9781SMoriah.Waterland@Sun.COM "answer 'n' to stop installation of the package." 75*9781SMoriah.Waterland@Sun.COM #define MSG_STATECHG "\\nTo change states, execute\\n\\tshutdown -y " \ 76*9781SMoriah.Waterland@Sun.COM "-i%s -g0\\nafter exiting the installation process. " \ 77*9781SMoriah.Waterland@Sun.COM "Please note that after changing states you " \ 78*9781SMoriah.Waterland@Sun.COM "may have to mount appropriate filesystem(s) " \ 79*9781SMoriah.Waterland@Sun.COM "in order to install this package." 80*9781SMoriah.Waterland@Sun.COM 81*9781SMoriah.Waterland@Sun.COM #define ASK_CONFLICT "Do you want to install these conflicting files" 82*9781SMoriah.Waterland@Sun.COM #define MSG_CONFLICT "\\nThe following files are already installed on the " \ 83*9781SMoriah.Waterland@Sun.COM "system and are being used by another package:" 84*9781SMoriah.Waterland@Sun.COM #define MSG_ROGUE "\\n* - conflict with a file which does not " \ 85*9781SMoriah.Waterland@Sun.COM "belong to any package." 86*9781SMoriah.Waterland@Sun.COM #define HLP_CONFLICT "If you choose to install conflicting files, the " \ 87*9781SMoriah.Waterland@Sun.COM "files listed above will be overwritten and/or have " \ 88*9781SMoriah.Waterland@Sun.COM "their access permissions changed. If you choose " \ 89*9781SMoriah.Waterland@Sun.COM "not to install these files, installation will " \ 90*9781SMoriah.Waterland@Sun.COM "proceed but these specific files will not be " \ 91*9781SMoriah.Waterland@Sun.COM "installed. Note that sane operation of the " \ 92*9781SMoriah.Waterland@Sun.COM "software being installed may require these files " \ 93*9781SMoriah.Waterland@Sun.COM "be installed; thus choosing to not to do so may " \ 94*9781SMoriah.Waterland@Sun.COM "cause inapropriate operation. If you wish to stop " \ 95*9781SMoriah.Waterland@Sun.COM "installation of this package, enter 'q' to quit." 96*9781SMoriah.Waterland@Sun.COM 97*9781SMoriah.Waterland@Sun.COM #define ASK_SETUID "Do you want to install these as setuid/setgid files" 98*9781SMoriah.Waterland@Sun.COM #define MSG_SETUID "\\nThe following files are being installed with " \ 99*9781SMoriah.Waterland@Sun.COM "setuid and/or setgid permissions:" 100*9781SMoriah.Waterland@Sun.COM #define MSG_OVERWR "\\n* - overwriting a file which is also " \ 101*9781SMoriah.Waterland@Sun.COM "setuid/setgid." 102*9781SMoriah.Waterland@Sun.COM #define HLP_SETUID "The package being installed appears to contain " \ 103*9781SMoriah.Waterland@Sun.COM "processes which will have their effective user or " \ 104*9781SMoriah.Waterland@Sun.COM "group ids set upon execution. History has shown " \ 105*9781SMoriah.Waterland@Sun.COM "that these types of processes can be a source of " \ 106*9781SMoriah.Waterland@Sun.COM "security problems on your system. If you choose " \ 107*9781SMoriah.Waterland@Sun.COM "not to install these as setuid files, installation " \ 108*9781SMoriah.Waterland@Sun.COM "will proceed but these specific files will be " \ 109*9781SMoriah.Waterland@Sun.COM "installed as regular files with setuid and/or " \ 110*9781SMoriah.Waterland@Sun.COM "setgid permissions reset. Note that sane " \ 111*9781SMoriah.Waterland@Sun.COM "operation of the software being installed may " \ 112*9781SMoriah.Waterland@Sun.COM "require that these files be installed with setuid " \ 113*9781SMoriah.Waterland@Sun.COM "or setgid permissions as delivered; thus choosing " \ 114*9781SMoriah.Waterland@Sun.COM "to install them as regular files may cause " \ 115*9781SMoriah.Waterland@Sun.COM "inapropriate operation. If you wish to stop " \ 116*9781SMoriah.Waterland@Sun.COM "installation of this package, enter 'q' to quit." 117*9781SMoriah.Waterland@Sun.COM #define MSG_PARTINST "\\nThe installation of this package was previously " \ 118*9781SMoriah.Waterland@Sun.COM "terminated and installation was never successfully " \ 119*9781SMoriah.Waterland@Sun.COM "completed." 120*9781SMoriah.Waterland@Sun.COM #define MSG_PARTREM "\\nThe removal of this package was terminated at " \ 121*9781SMoriah.Waterland@Sun.COM "some point in time, and package removal was only " \ 122*9781SMoriah.Waterland@Sun.COM "partially completed." 123*9781SMoriah.Waterland@Sun.COM #define HLP_PARTIAL "Installation of partially installed packages is " \ 124*9781SMoriah.Waterland@Sun.COM "normally allowable, but some packages providers " \ 125*9781SMoriah.Waterland@Sun.COM "may suggest that a partially installed package be " \ 126*9781SMoriah.Waterland@Sun.COM "completely removed before re-attempting " \ 127*9781SMoriah.Waterland@Sun.COM "installation. Check the documentation provided " \ 128*9781SMoriah.Waterland@Sun.COM "with this package, and then answer 'y' if you feel " \ 129*9781SMoriah.Waterland@Sun.COM "it is advisable to continue the installation process." 130*9781SMoriah.Waterland@Sun.COM 131*9781SMoriah.Waterland@Sun.COM #define HLP_SPACE "It appears that there is not enough free space on " \ 132*9781SMoriah.Waterland@Sun.COM "your system in which to install this package. It " \ 133*9781SMoriah.Waterland@Sun.COM "is possible that one or more filesystems are not " \ 134*9781SMoriah.Waterland@Sun.COM "properly mounted. Neither installation of the " \ 135*9781SMoriah.Waterland@Sun.COM "package nor its operation can be guaranteed under " \ 136*9781SMoriah.Waterland@Sun.COM "these conditions. If you choose to disregard this " \ 137*9781SMoriah.Waterland@Sun.COM "warning, enter 'y' to continue the installation " \ 138*9781SMoriah.Waterland@Sun.COM "process." 139*9781SMoriah.Waterland@Sun.COM #define HLP_DEPEND "The package being installed has indicated a " \ 140*9781SMoriah.Waterland@Sun.COM "dependency on the existence (or non-existence) " \ 141*9781SMoriah.Waterland@Sun.COM "of another software package. If this dependency is " \ 142*9781SMoriah.Waterland@Sun.COM "not met before continuing, the package may not " \ 143*9781SMoriah.Waterland@Sun.COM "install or operate properly. If you wish to " \ 144*9781SMoriah.Waterland@Sun.COM "disregard this dependency, answer 'y' to continue " \ 145*9781SMoriah.Waterland@Sun.COM "the installation process." 146*9781SMoriah.Waterland@Sun.COM 147*9781SMoriah.Waterland@Sun.COM #define MSG_PRIV "\\nThis package contains scripts which will be " \ 148*9781SMoriah.Waterland@Sun.COM "executed with super-user permission during the " \ 149*9781SMoriah.Waterland@Sun.COM "process of installing this package." 150*9781SMoriah.Waterland@Sun.COM #define HLP_PRIV "During the installation of this package, certain " \ 151*9781SMoriah.Waterland@Sun.COM "scripts provided with the package will execute with " \ 152*9781SMoriah.Waterland@Sun.COM "super-user permission. These scripts may modify or " \ 153*9781SMoriah.Waterland@Sun.COM "otherwise change your system without your " \ 154*9781SMoriah.Waterland@Sun.COM "knowledge. If you are certain of the origin and " \ 155*9781SMoriah.Waterland@Sun.COM "trustworthiness of the package being installed, " \ 156*9781SMoriah.Waterland@Sun.COM "answer 'y' to continue the installation process." 157*9781SMoriah.Waterland@Sun.COM 158*9781SMoriah.Waterland@Sun.COM #define ASK_CONT "Do you want to continue with the installation of <%s>" 159*9781SMoriah.Waterland@Sun.COM #define HLP_CONT "If you choose 'y', installation of this package " \ 160*9781SMoriah.Waterland@Sun.COM "will continue. If you want to stop installation " \ 161*9781SMoriah.Waterland@Sun.COM "of this package, choose 'n'." 162*9781SMoriah.Waterland@Sun.COM 163*9781SMoriah.Waterland@Sun.COM #define MSG_MKPKGDIR "unable to make packaging directory <%s>" 164*9781SMoriah.Waterland@Sun.COM 165*9781SMoriah.Waterland@Sun.COM #define MSG_CKCONFL_GZ "## Checking for conflicts with packages already " \ 166*9781SMoriah.Waterland@Sun.COM "installed." 167*9781SMoriah.Waterland@Sun.COM #define MSG_CKCONFL_LZ "## Checking for conflicts with packages already " \ 168*9781SMoriah.Waterland@Sun.COM "installed in zone <%s>." 169*9781SMoriah.Waterland@Sun.COM #define MSG_CKDEPEND_GZ "## Verifying package dependencies." 170*9781SMoriah.Waterland@Sun.COM #define MSG_CKDEPEND_LZ "## Verifying package dependencies in zone <%s>." 171*9781SMoriah.Waterland@Sun.COM #define MSG_CKSPACE_GZ "## Verifying disk space requirements." 172*9781SMoriah.Waterland@Sun.COM #define MSG_CKSPACE_LZ "## Verifying disk space requirements in zone <%s>." 173*9781SMoriah.Waterland@Sun.COM #define MSG_CKUID_GZ "## Checking for setuid/setgid programs." 174*9781SMoriah.Waterland@Sun.COM #define MSG_CKUID_LZ "## Checking for setuid/setgid programs in zone <%s>." 175*9781SMoriah.Waterland@Sun.COM 176*9781SMoriah.Waterland@Sun.COM #define MSG_SCRFND "Package scripts were found." 177*9781SMoriah.Waterland@Sun.COM #define MSG_UIDFND "Setuid/setgid processes detected." 178*9781SMoriah.Waterland@Sun.COM #define MSG_ATTRONLY "!%s %s <attribute change only>" 179*9781SMoriah.Waterland@Sun.COM 180*9781SMoriah.Waterland@Sun.COM #define MSG_CONTDISP "[Hit <RETURN> to continue display]" 181*9781SMoriah.Waterland@Sun.COM 182*9781SMoriah.Waterland@Sun.COM #define ERR_NO_RUNST "unable to determine current run-state" 183*9781SMoriah.Waterland@Sun.COM #define ERR_DEPFAILED "Dependency checking failed." 184*9781SMoriah.Waterland@Sun.COM #define ERR_SPCFAILED "Space checking failed." 185*9781SMoriah.Waterland@Sun.COM #define ERR_CNFFAILED "Conflict checking failed." 186*9781SMoriah.Waterland@Sun.COM #define ERR_BADFILE "packaging file <%s> is corrupt" 187*9781SMoriah.Waterland@Sun.COM 188*9781SMoriah.Waterland@Sun.COM /* 189*9781SMoriah.Waterland@Sun.COM * Return value: int 190*9781SMoriah.Waterland@Sun.COM * 0 - success 191*9781SMoriah.Waterland@Sun.COM * 1 - end of file 192*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 193*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 194*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 195*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 196*9781SMoriah.Waterland@Sun.COM * If "preinstallcheck" is set to B_TRUE: 197*9781SMoriah.Waterland@Sun.COM * 8 - partial install detected 198*9781SMoriah.Waterland@Sun.COM * 9 - partial removal detected 199*9781SMoriah.Waterland@Sun.COM */ 200*9781SMoriah.Waterland@Sun.COM 201*9781SMoriah.Waterland@Sun.COM int 202*9781SMoriah.Waterland@Sun.COM ckpartial(void) 203*9781SMoriah.Waterland@Sun.COM { 204*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT]; 205*9781SMoriah.Waterland@Sun.COM int n; 206*9781SMoriah.Waterland@Sun.COM 207*9781SMoriah.Waterland@Sun.COM if (ADM(partial, "nocheck")) { 208*9781SMoriah.Waterland@Sun.COM return (0); 209*9781SMoriah.Waterland@Sun.COM } 210*9781SMoriah.Waterland@Sun.COM 211*9781SMoriah.Waterland@Sun.COM if (access(ilockfile, F_OK) == 0) { 212*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 213*9781SMoriah.Waterland@Sun.COM return (8); /* partial install detected */ 214*9781SMoriah.Waterland@Sun.COM } 215*9781SMoriah.Waterland@Sun.COM 216*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 217*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 218*9781SMoriah.Waterland@Sun.COM 219*9781SMoriah.Waterland@Sun.COM msgtext = gettext(MSG_PARTINST); 220*9781SMoriah.Waterland@Sun.COM ptext(stderr, msgtext); 221*9781SMoriah.Waterland@Sun.COM 222*9781SMoriah.Waterland@Sun.COM if (ADM(partial, "quit")) { 223*9781SMoriah.Waterland@Sun.COM return (4); 224*9781SMoriah.Waterland@Sun.COM } 225*9781SMoriah.Waterland@Sun.COM 226*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 227*9781SMoriah.Waterland@Sun.COM return (5); 228*9781SMoriah.Waterland@Sun.COM } 229*9781SMoriah.Waterland@Sun.COM 230*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 231*9781SMoriah.Waterland@Sun.COM 232*9781SMoriah.Waterland@Sun.COM ckquit = 0; 233*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_PARTIAL), 234*9781SMoriah.Waterland@Sun.COM ask_cont)) { 235*9781SMoriah.Waterland@Sun.COM return (n); 236*9781SMoriah.Waterland@Sun.COM } 237*9781SMoriah.Waterland@Sun.COM 238*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 239*9781SMoriah.Waterland@Sun.COM return (3); 240*9781SMoriah.Waterland@Sun.COM } 241*9781SMoriah.Waterland@Sun.COM ckquit = 1; 242*9781SMoriah.Waterland@Sun.COM } 243*9781SMoriah.Waterland@Sun.COM 244*9781SMoriah.Waterland@Sun.COM if (access(rlockfile, F_OK) == 0) { 245*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 246*9781SMoriah.Waterland@Sun.COM return (9); /* partial removal detected */ 247*9781SMoriah.Waterland@Sun.COM } 248*9781SMoriah.Waterland@Sun.COM 249*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 250*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 251*9781SMoriah.Waterland@Sun.COM 252*9781SMoriah.Waterland@Sun.COM 253*9781SMoriah.Waterland@Sun.COM msgtext = gettext(MSG_PARTREM); 254*9781SMoriah.Waterland@Sun.COM ptext(stderr, msgtext); 255*9781SMoriah.Waterland@Sun.COM 256*9781SMoriah.Waterland@Sun.COM if (ADM(partial, "quit")) { 257*9781SMoriah.Waterland@Sun.COM return (4); 258*9781SMoriah.Waterland@Sun.COM } 259*9781SMoriah.Waterland@Sun.COM 260*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 261*9781SMoriah.Waterland@Sun.COM return (5); 262*9781SMoriah.Waterland@Sun.COM } 263*9781SMoriah.Waterland@Sun.COM 264*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 265*9781SMoriah.Waterland@Sun.COM 266*9781SMoriah.Waterland@Sun.COM ckquit = 0; 267*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_PARTIAL), 268*9781SMoriah.Waterland@Sun.COM ask_cont)) { 269*9781SMoriah.Waterland@Sun.COM return (n); 270*9781SMoriah.Waterland@Sun.COM } 271*9781SMoriah.Waterland@Sun.COM 272*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 273*9781SMoriah.Waterland@Sun.COM return (3); 274*9781SMoriah.Waterland@Sun.COM } 275*9781SMoriah.Waterland@Sun.COM ckquit = 1; 276*9781SMoriah.Waterland@Sun.COM } 277*9781SMoriah.Waterland@Sun.COM 278*9781SMoriah.Waterland@Sun.COM return (0); 279*9781SMoriah.Waterland@Sun.COM } 280*9781SMoriah.Waterland@Sun.COM 281*9781SMoriah.Waterland@Sun.COM /* 282*9781SMoriah.Waterland@Sun.COM * Return value: int 283*9781SMoriah.Waterland@Sun.COM * 0 - success 284*9781SMoriah.Waterland@Sun.COM * 1 - end of file 285*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 286*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 287*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 288*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 289*9781SMoriah.Waterland@Sun.COM * 99 - fatal error 290*9781SMoriah.Waterland@Sun.COM */ 291*9781SMoriah.Waterland@Sun.COM 292*9781SMoriah.Waterland@Sun.COM int 293*9781SMoriah.Waterland@Sun.COM ckrunlevel(void) 294*9781SMoriah.Waterland@Sun.COM { 295*9781SMoriah.Waterland@Sun.COM struct utmpx utmpx; 296*9781SMoriah.Waterland@Sun.COM struct utmpx *putmpx; 297*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT], *pt, *istates, *pstate; 298*9781SMoriah.Waterland@Sun.COM int n; 299*9781SMoriah.Waterland@Sun.COM char *uxstate; 300*9781SMoriah.Waterland@Sun.COM 301*9781SMoriah.Waterland@Sun.COM if (ADM(runlevel, "nocheck")) { 302*9781SMoriah.Waterland@Sun.COM return (0); 303*9781SMoriah.Waterland@Sun.COM } 304*9781SMoriah.Waterland@Sun.COM 305*9781SMoriah.Waterland@Sun.COM pt = getenv("ISTATES"); 306*9781SMoriah.Waterland@Sun.COM if (pt == NULL) { 307*9781SMoriah.Waterland@Sun.COM return (0); 308*9781SMoriah.Waterland@Sun.COM } 309*9781SMoriah.Waterland@Sun.COM 310*9781SMoriah.Waterland@Sun.COM utmpx.ut_type = RUN_LVL; 311*9781SMoriah.Waterland@Sun.COM putmpx = getutxid(&utmpx); 312*9781SMoriah.Waterland@Sun.COM if (putmpx == NULL) { 313*9781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_NO_RUNST)); 314*9781SMoriah.Waterland@Sun.COM return (99); 315*9781SMoriah.Waterland@Sun.COM } 316*9781SMoriah.Waterland@Sun.COM 317*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 318*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 319*9781SMoriah.Waterland@Sun.COM 320*9781SMoriah.Waterland@Sun.COM /* 321*9781SMoriah.Waterland@Sun.COM * this cryptic code is trying to pull the run level 322*9781SMoriah.Waterland@Sun.COM * out of the utmpx entry...the level starts in column 323*9781SMoriah.Waterland@Sun.COM * 11 - looks like "run-level %c" 324*9781SMoriah.Waterland@Sun.COM */ 325*9781SMoriah.Waterland@Sun.COM uxstate = strtok(&putmpx->ut_line[10], " \t\n"); 326*9781SMoriah.Waterland@Sun.COM 327*9781SMoriah.Waterland@Sun.COM istates = qstrdup(pt); 328*9781SMoriah.Waterland@Sun.COM if ((pt = strtok(pt, " \t\n, ")) == NULL) { 329*9781SMoriah.Waterland@Sun.COM return (0); /* no list is no list */ 330*9781SMoriah.Waterland@Sun.COM } 331*9781SMoriah.Waterland@Sun.COM 332*9781SMoriah.Waterland@Sun.COM pstate = pt; 333*9781SMoriah.Waterland@Sun.COM do { 334*9781SMoriah.Waterland@Sun.COM if (strcmp(pt, uxstate) == 0) { 335*9781SMoriah.Waterland@Sun.COM free(istates); 336*9781SMoriah.Waterland@Sun.COM return (0); 337*9781SMoriah.Waterland@Sun.COM } 338*9781SMoriah.Waterland@Sun.COM } while (pt = strtok(NULL, " \t\n, ")); 339*9781SMoriah.Waterland@Sun.COM 340*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 341*9781SMoriah.Waterland@Sun.COM msgtext = gettext(MSG_RUNLEVEL); 342*9781SMoriah.Waterland@Sun.COM ptext(stderr, msgtext, uxstate); 343*9781SMoriah.Waterland@Sun.COM } else { 344*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "runlevel=%s", uxstate); 345*9781SMoriah.Waterland@Sun.COM } 346*9781SMoriah.Waterland@Sun.COM 347*9781SMoriah.Waterland@Sun.COM pt = strtok(istates, " \t\n, "); 348*9781SMoriah.Waterland@Sun.COM do { 349*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 350*9781SMoriah.Waterland@Sun.COM ptext(stderr, "\\t%s", pt); 351*9781SMoriah.Waterland@Sun.COM } else { 352*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, ":%s", pt); 353*9781SMoriah.Waterland@Sun.COM } 354*9781SMoriah.Waterland@Sun.COM } while (pt = strtok(NULL, " \t\n, ")); 355*9781SMoriah.Waterland@Sun.COM 356*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 357*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "\n"); 358*9781SMoriah.Waterland@Sun.COM } 359*9781SMoriah.Waterland@Sun.COM 360*9781SMoriah.Waterland@Sun.COM free(istates); 361*9781SMoriah.Waterland@Sun.COM 362*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 363*9781SMoriah.Waterland@Sun.COM return (4); 364*9781SMoriah.Waterland@Sun.COM } 365*9781SMoriah.Waterland@Sun.COM 366*9781SMoriah.Waterland@Sun.COM if (ADM(runlevel, "quit")) { 367*9781SMoriah.Waterland@Sun.COM return (4); 368*9781SMoriah.Waterland@Sun.COM } 369*9781SMoriah.Waterland@Sun.COM 370*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 371*9781SMoriah.Waterland@Sun.COM return (5); 372*9781SMoriah.Waterland@Sun.COM } 373*9781SMoriah.Waterland@Sun.COM 374*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 375*9781SMoriah.Waterland@Sun.COM 376*9781SMoriah.Waterland@Sun.COM ckquit = 0; 377*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_RUNLEVEL), 378*9781SMoriah.Waterland@Sun.COM ask_cont)) { 379*9781SMoriah.Waterland@Sun.COM return (n); 380*9781SMoriah.Waterland@Sun.COM } 381*9781SMoriah.Waterland@Sun.COM 382*9781SMoriah.Waterland@Sun.COM ckquit = 1; 383*9781SMoriah.Waterland@Sun.COM 384*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) != NULL) { 385*9781SMoriah.Waterland@Sun.COM return (0); 386*9781SMoriah.Waterland@Sun.COM } else { 387*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 388*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_STATECHG), pstate); 389*9781SMoriah.Waterland@Sun.COM } 390*9781SMoriah.Waterland@Sun.COM return (3); 391*9781SMoriah.Waterland@Sun.COM } 392*9781SMoriah.Waterland@Sun.COM } 393*9781SMoriah.Waterland@Sun.COM 394*9781SMoriah.Waterland@Sun.COM /* 395*9781SMoriah.Waterland@Sun.COM * Return value: int 396*9781SMoriah.Waterland@Sun.COM * 0 - success 397*9781SMoriah.Waterland@Sun.COM * 1 - end of file 398*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 399*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 400*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 401*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 402*9781SMoriah.Waterland@Sun.COM */ 403*9781SMoriah.Waterland@Sun.COM 404*9781SMoriah.Waterland@Sun.COM int 405*9781SMoriah.Waterland@Sun.COM ckdepend(void) 406*9781SMoriah.Waterland@Sun.COM { 407*9781SMoriah.Waterland@Sun.COM int n; 408*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT]; 409*9781SMoriah.Waterland@Sun.COM char path[PATH_MAX]; 410*9781SMoriah.Waterland@Sun.COM 411*9781SMoriah.Waterland@Sun.COM if (ADM(idepend, "nocheck")) { 412*9781SMoriah.Waterland@Sun.COM return (0); 413*9781SMoriah.Waterland@Sun.COM } 414*9781SMoriah.Waterland@Sun.COM 415*9781SMoriah.Waterland@Sun.COM (void) snprintf(path, sizeof (path), "%s/%s", instdir, DEPEND_FILE); 416*9781SMoriah.Waterland@Sun.COM if (access(path, F_OK) != 0) { 417*9781SMoriah.Waterland@Sun.COM return (0); /* no dependency file provided by package */ 418*9781SMoriah.Waterland@Sun.COM } 419*9781SMoriah.Waterland@Sun.COM 420*9781SMoriah.Waterland@Sun.COM if (zoneName == (char *)NULL) { 421*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKDEPEND_GZ)); 422*9781SMoriah.Waterland@Sun.COM } else { 423*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKDEPEND_LZ), zoneName); 424*9781SMoriah.Waterland@Sun.COM } 425*9781SMoriah.Waterland@Sun.COM 426*9781SMoriah.Waterland@Sun.COM if (dockdeps(path, 0, preinstallCheck)) { 427*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 428*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 429*9781SMoriah.Waterland@Sun.COM msgtext = gettext(ERR_DEPFAILED); 430*9781SMoriah.Waterland@Sun.COM 431*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 432*9781SMoriah.Waterland@Sun.COM return (4); 433*9781SMoriah.Waterland@Sun.COM } 434*9781SMoriah.Waterland@Sun.COM 435*9781SMoriah.Waterland@Sun.COM if (ADM(idepend, "quit")) { 436*9781SMoriah.Waterland@Sun.COM return (4); 437*9781SMoriah.Waterland@Sun.COM } 438*9781SMoriah.Waterland@Sun.COM 439*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 440*9781SMoriah.Waterland@Sun.COM return (5); 441*9781SMoriah.Waterland@Sun.COM } 442*9781SMoriah.Waterland@Sun.COM 443*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 444*9781SMoriah.Waterland@Sun.COM 445*9781SMoriah.Waterland@Sun.COM ckquit = 0; 446*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_DEPEND), 447*9781SMoriah.Waterland@Sun.COM ask_cont)) { 448*9781SMoriah.Waterland@Sun.COM return (n); 449*9781SMoriah.Waterland@Sun.COM } 450*9781SMoriah.Waterland@Sun.COM 451*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 452*9781SMoriah.Waterland@Sun.COM return (3); 453*9781SMoriah.Waterland@Sun.COM } 454*9781SMoriah.Waterland@Sun.COM 455*9781SMoriah.Waterland@Sun.COM ckquit = 1; 456*9781SMoriah.Waterland@Sun.COM } 457*9781SMoriah.Waterland@Sun.COM 458*9781SMoriah.Waterland@Sun.COM return (0); 459*9781SMoriah.Waterland@Sun.COM } 460*9781SMoriah.Waterland@Sun.COM 461*9781SMoriah.Waterland@Sun.COM void 462*9781SMoriah.Waterland@Sun.COM cksetZoneName(char *a_zoneName) 463*9781SMoriah.Waterland@Sun.COM { 464*9781SMoriah.Waterland@Sun.COM zoneName = a_zoneName; 465*9781SMoriah.Waterland@Sun.COM } 466*9781SMoriah.Waterland@Sun.COM 467*9781SMoriah.Waterland@Sun.COM void 468*9781SMoriah.Waterland@Sun.COM cksetPreinstallCheck(boolean_t a_preinstallCheck) 469*9781SMoriah.Waterland@Sun.COM { 470*9781SMoriah.Waterland@Sun.COM preinstallCheck = a_preinstallCheck; 471*9781SMoriah.Waterland@Sun.COM } 472*9781SMoriah.Waterland@Sun.COM 473*9781SMoriah.Waterland@Sun.COM /* 474*9781SMoriah.Waterland@Sun.COM * Return value: int 475*9781SMoriah.Waterland@Sun.COM * 0 - success 476*9781SMoriah.Waterland@Sun.COM * 1 - end of file 477*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 478*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 479*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 480*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 481*9781SMoriah.Waterland@Sun.COM */ 482*9781SMoriah.Waterland@Sun.COM int 483*9781SMoriah.Waterland@Sun.COM ckspace(void) 484*9781SMoriah.Waterland@Sun.COM { 485*9781SMoriah.Waterland@Sun.COM int n; 486*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT]; 487*9781SMoriah.Waterland@Sun.COM char path[PATH_MAX]; 488*9781SMoriah.Waterland@Sun.COM 489*9781SMoriah.Waterland@Sun.COM if (ADM(space, "nocheck")) { 490*9781SMoriah.Waterland@Sun.COM return (0); 491*9781SMoriah.Waterland@Sun.COM } 492*9781SMoriah.Waterland@Sun.COM 493*9781SMoriah.Waterland@Sun.COM if (zoneName == (char *)NULL) { 494*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKSPACE_GZ)); 495*9781SMoriah.Waterland@Sun.COM } else { 496*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKSPACE_LZ), zoneName); 497*9781SMoriah.Waterland@Sun.COM } 498*9781SMoriah.Waterland@Sun.COM 499*9781SMoriah.Waterland@Sun.COM (void) snprintf(path, sizeof (path), "%s/install/space", instdir); 500*9781SMoriah.Waterland@Sun.COM if (access(path, F_OK) == 0) { 501*9781SMoriah.Waterland@Sun.COM n = dockspace(path); 502*9781SMoriah.Waterland@Sun.COM } else { 503*9781SMoriah.Waterland@Sun.COM n = dockspace(NULL); 504*9781SMoriah.Waterland@Sun.COM } 505*9781SMoriah.Waterland@Sun.COM 506*9781SMoriah.Waterland@Sun.COM if (n) { 507*9781SMoriah.Waterland@Sun.COM msgtext = gettext(ERR_SPCFAILED); 508*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 509*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 510*9781SMoriah.Waterland@Sun.COM 511*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 512*9781SMoriah.Waterland@Sun.COM return (4); 513*9781SMoriah.Waterland@Sun.COM } 514*9781SMoriah.Waterland@Sun.COM 515*9781SMoriah.Waterland@Sun.COM if (ADM(space, "quit")) { 516*9781SMoriah.Waterland@Sun.COM return (4); 517*9781SMoriah.Waterland@Sun.COM } 518*9781SMoriah.Waterland@Sun.COM 519*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 520*9781SMoriah.Waterland@Sun.COM return (5); 521*9781SMoriah.Waterland@Sun.COM } 522*9781SMoriah.Waterland@Sun.COM 523*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 524*9781SMoriah.Waterland@Sun.COM 525*9781SMoriah.Waterland@Sun.COM ckquit = 0; 526*9781SMoriah.Waterland@Sun.COM n = ckyorn(ans, NULL, NULL, gettext(HLP_SPACE), ask_cont); 527*9781SMoriah.Waterland@Sun.COM if (n != 0) { 528*9781SMoriah.Waterland@Sun.COM return (n); 529*9781SMoriah.Waterland@Sun.COM } 530*9781SMoriah.Waterland@Sun.COM 531*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 532*9781SMoriah.Waterland@Sun.COM return (3); 533*9781SMoriah.Waterland@Sun.COM } 534*9781SMoriah.Waterland@Sun.COM 535*9781SMoriah.Waterland@Sun.COM ckquit = 1; 536*9781SMoriah.Waterland@Sun.COM } 537*9781SMoriah.Waterland@Sun.COM return (0); 538*9781SMoriah.Waterland@Sun.COM } 539*9781SMoriah.Waterland@Sun.COM 540*9781SMoriah.Waterland@Sun.COM void 541*9781SMoriah.Waterland@Sun.COM ckdirs(void) 542*9781SMoriah.Waterland@Sun.COM { 543*9781SMoriah.Waterland@Sun.COM char path[PATH_MAX]; 544*9781SMoriah.Waterland@Sun.COM 545*9781SMoriah.Waterland@Sun.COM if (mkpath(get_PKGADM())) { 546*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 547*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", get_PKGADM()); 548*9781SMoriah.Waterland@Sun.COM } else { 549*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), get_PKGADM()); 550*9781SMoriah.Waterland@Sun.COM } 551*9781SMoriah.Waterland@Sun.COM quit(99); 552*9781SMoriah.Waterland@Sun.COM } 553*9781SMoriah.Waterland@Sun.COM 554*9781SMoriah.Waterland@Sun.COM (void) snprintf(path, sizeof (path), "%s/admin", get_PKGADM()); 555*9781SMoriah.Waterland@Sun.COM 556*9781SMoriah.Waterland@Sun.COM if (mkpath(path)) { 557*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 558*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", path); 559*9781SMoriah.Waterland@Sun.COM } else { 560*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), path); 561*9781SMoriah.Waterland@Sun.COM } 562*9781SMoriah.Waterland@Sun.COM quit(99); 563*9781SMoriah.Waterland@Sun.COM } 564*9781SMoriah.Waterland@Sun.COM 565*9781SMoriah.Waterland@Sun.COM (void) snprintf(path, sizeof (path), "%s/logs", get_PKGADM()); 566*9781SMoriah.Waterland@Sun.COM 567*9781SMoriah.Waterland@Sun.COM if (mkpath(path)) { 568*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 569*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", path); 570*9781SMoriah.Waterland@Sun.COM } else { 571*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), path); 572*9781SMoriah.Waterland@Sun.COM } 573*9781SMoriah.Waterland@Sun.COM quit(99); 574*9781SMoriah.Waterland@Sun.COM } 575*9781SMoriah.Waterland@Sun.COM 576*9781SMoriah.Waterland@Sun.COM if (mkpath(PKGSCR)) { 577*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 578*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", PKGSCR); 579*9781SMoriah.Waterland@Sun.COM } else { 580*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), PKGSCR); 581*9781SMoriah.Waterland@Sun.COM } 582*9781SMoriah.Waterland@Sun.COM quit(99); 583*9781SMoriah.Waterland@Sun.COM } 584*9781SMoriah.Waterland@Sun.COM 585*9781SMoriah.Waterland@Sun.COM if (mkpath(get_PKGLOC())) { 586*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 587*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", get_PKGLOC()); 588*9781SMoriah.Waterland@Sun.COM } else { 589*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), get_PKGLOC()); 590*9781SMoriah.Waterland@Sun.COM } 591*9781SMoriah.Waterland@Sun.COM quit(99); 592*9781SMoriah.Waterland@Sun.COM } 593*9781SMoriah.Waterland@Sun.COM } 594*9781SMoriah.Waterland@Sun.COM 595*9781SMoriah.Waterland@Sun.COM /* 596*9781SMoriah.Waterland@Sun.COM * Return value: int 597*9781SMoriah.Waterland@Sun.COM * 0 - success 598*9781SMoriah.Waterland@Sun.COM * 99 - failure 599*9781SMoriah.Waterland@Sun.COM */ 600*9781SMoriah.Waterland@Sun.COM 601*9781SMoriah.Waterland@Sun.COM int 602*9781SMoriah.Waterland@Sun.COM ckpkgdirs(void) 603*9781SMoriah.Waterland@Sun.COM { 604*9781SMoriah.Waterland@Sun.COM boolean_t nonExistentPkgloc = B_FALSE; 605*9781SMoriah.Waterland@Sun.COM 606*9781SMoriah.Waterland@Sun.COM /* 607*9781SMoriah.Waterland@Sun.COM * If pkgloc doesn't exist make sure it gets removed after creating 608*9781SMoriah.Waterland@Sun.COM * it if this is a preinstall check. All dryrun and preinstallation 609*9781SMoriah.Waterland@Sun.COM * checks must not modify the file system. 610*9781SMoriah.Waterland@Sun.COM */ 611*9781SMoriah.Waterland@Sun.COM 612*9781SMoriah.Waterland@Sun.COM if (access(pkgloc, F_OK) != 0) { 613*9781SMoriah.Waterland@Sun.COM nonExistentPkgloc = B_TRUE; 614*9781SMoriah.Waterland@Sun.COM } 615*9781SMoriah.Waterland@Sun.COM 616*9781SMoriah.Waterland@Sun.COM if (mkpath(pkgloc)) { 617*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 618*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", pkgloc); 619*9781SMoriah.Waterland@Sun.COM } else { 620*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), pkgloc); 621*9781SMoriah.Waterland@Sun.COM } 622*9781SMoriah.Waterland@Sun.COM return (99); 623*9781SMoriah.Waterland@Sun.COM } 624*9781SMoriah.Waterland@Sun.COM 625*9781SMoriah.Waterland@Sun.COM if (mkpath(pkgbin)) { 626*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 627*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", pkgbin); 628*9781SMoriah.Waterland@Sun.COM } else { 629*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), pkgbin); 630*9781SMoriah.Waterland@Sun.COM } 631*9781SMoriah.Waterland@Sun.COM return (99); 632*9781SMoriah.Waterland@Sun.COM } 633*9781SMoriah.Waterland@Sun.COM 634*9781SMoriah.Waterland@Sun.COM if (mkpath(pkgsav)) { 635*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 636*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", pkgsav); 637*9781SMoriah.Waterland@Sun.COM } else { 638*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), pkgsav); 639*9781SMoriah.Waterland@Sun.COM } 640*9781SMoriah.Waterland@Sun.COM return (99); 641*9781SMoriah.Waterland@Sun.COM } 642*9781SMoriah.Waterland@Sun.COM 643*9781SMoriah.Waterland@Sun.COM if (!is_spool_create() && mkpath(saveSpoolInstallDir)) { 644*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 645*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckdirs=%s\n", pkgsav); 646*9781SMoriah.Waterland@Sun.COM } else { 647*9781SMoriah.Waterland@Sun.COM progerr(gettext(MSG_MKPKGDIR), pkgsav); 648*9781SMoriah.Waterland@Sun.COM } 649*9781SMoriah.Waterland@Sun.COM return (99); 650*9781SMoriah.Waterland@Sun.COM } 651*9781SMoriah.Waterland@Sun.COM 652*9781SMoriah.Waterland@Sun.COM if (preinstallCheck && nonExistentPkgloc) { 653*9781SMoriah.Waterland@Sun.COM rrmdir(pkgloc); 654*9781SMoriah.Waterland@Sun.COM } 655*9781SMoriah.Waterland@Sun.COM 656*9781SMoriah.Waterland@Sun.COM return (0); 657*9781SMoriah.Waterland@Sun.COM } 658*9781SMoriah.Waterland@Sun.COM 659*9781SMoriah.Waterland@Sun.COM /* 660*9781SMoriah.Waterland@Sun.COM * Return value: int 661*9781SMoriah.Waterland@Sun.COM * 0 - success 662*9781SMoriah.Waterland@Sun.COM * 1 - end of file 663*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 664*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 665*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 666*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 667*9781SMoriah.Waterland@Sun.COM */ 668*9781SMoriah.Waterland@Sun.COM 669*9781SMoriah.Waterland@Sun.COM int 670*9781SMoriah.Waterland@Sun.COM ckconflct(void) 671*9781SMoriah.Waterland@Sun.COM { 672*9781SMoriah.Waterland@Sun.COM int i, n, count, has_a_rogue = 0; 673*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT]; 674*9781SMoriah.Waterland@Sun.COM 675*9781SMoriah.Waterland@Sun.COM if (ADM(conflict, "nochange")) { 676*9781SMoriah.Waterland@Sun.COM nocnflct++; 677*9781SMoriah.Waterland@Sun.COM return (0); 678*9781SMoriah.Waterland@Sun.COM } 679*9781SMoriah.Waterland@Sun.COM 680*9781SMoriah.Waterland@Sun.COM if (ADM(conflict, "nocheck")) { 681*9781SMoriah.Waterland@Sun.COM return (0); 682*9781SMoriah.Waterland@Sun.COM } 683*9781SMoriah.Waterland@Sun.COM 684*9781SMoriah.Waterland@Sun.COM if (zoneName == (char *)NULL) { 685*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKCONFL_GZ)); 686*9781SMoriah.Waterland@Sun.COM } else { 687*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKCONFL_LZ), zoneName); 688*9781SMoriah.Waterland@Sun.COM } 689*9781SMoriah.Waterland@Sun.COM 690*9781SMoriah.Waterland@Sun.COM count = 0; 691*9781SMoriah.Waterland@Sun.COM for (i = 0; extlist[i]; i++) { 692*9781SMoriah.Waterland@Sun.COM struct cfent *ept; 693*9781SMoriah.Waterland@Sun.COM struct mergstat *mstat; 694*9781SMoriah.Waterland@Sun.COM 695*9781SMoriah.Waterland@Sun.COM if (extlist[i]->cf_ent.ftype == 'i') { 696*9781SMoriah.Waterland@Sun.COM continue; 697*9781SMoriah.Waterland@Sun.COM } 698*9781SMoriah.Waterland@Sun.COM 699*9781SMoriah.Waterland@Sun.COM ept = &(extlist[i]->cf_ent); 700*9781SMoriah.Waterland@Sun.COM mstat = &(extlist[i]->mstat); 701*9781SMoriah.Waterland@Sun.COM 702*9781SMoriah.Waterland@Sun.COM if (is_remote_fs(ept->path, &(extlist[i]->fsys_value)) && 703*9781SMoriah.Waterland@Sun.COM !is_fs_writeable(ept->path, 704*9781SMoriah.Waterland@Sun.COM &(extlist[i]->fsys_value))) { 705*9781SMoriah.Waterland@Sun.COM continue; 706*9781SMoriah.Waterland@Sun.COM } 707*9781SMoriah.Waterland@Sun.COM 708*9781SMoriah.Waterland@Sun.COM /* 709*9781SMoriah.Waterland@Sun.COM * If no other package claims it or it's from a continuation 710*9781SMoriah.Waterland@Sun.COM * file, skip it. 711*9781SMoriah.Waterland@Sun.COM */ 712*9781SMoriah.Waterland@Sun.COM if (!mstat->shared || mstat->preloaded) { 713*9781SMoriah.Waterland@Sun.COM continue; 714*9781SMoriah.Waterland@Sun.COM } 715*9781SMoriah.Waterland@Sun.COM 716*9781SMoriah.Waterland@Sun.COM if (ept->ftype == 'e') { 717*9781SMoriah.Waterland@Sun.COM continue; 718*9781SMoriah.Waterland@Sun.COM } 719*9781SMoriah.Waterland@Sun.COM 720*9781SMoriah.Waterland@Sun.COM if (mstat->rogue) { 721*9781SMoriah.Waterland@Sun.COM has_a_rogue = 1; 722*9781SMoriah.Waterland@Sun.COM } 723*9781SMoriah.Waterland@Sun.COM 724*9781SMoriah.Waterland@Sun.COM if (mstat->contchg) { 725*9781SMoriah.Waterland@Sun.COM if (!count++) { 726*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 727*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_CONFLICT)); 728*9781SMoriah.Waterland@Sun.COM } 729*9781SMoriah.Waterland@Sun.COM } else if ((echoGetFlag() == B_TRUE) && 730*9781SMoriah.Waterland@Sun.COM ((count % DISPSIZ) == 0)) { 731*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CONTDISP)); 732*9781SMoriah.Waterland@Sun.COM (void) getc(stdin); 733*9781SMoriah.Waterland@Sun.COM } 734*9781SMoriah.Waterland@Sun.COM /* 735*9781SMoriah.Waterland@Sun.COM * NOTE : The leading "!" in this string forces 736*9781SMoriah.Waterland@Sun.COM * puttext() to print leading white space. 737*9781SMoriah.Waterland@Sun.COM */ 738*9781SMoriah.Waterland@Sun.COM 739*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 740*9781SMoriah.Waterland@Sun.COM ptext(stderr, "!%s %s", 741*9781SMoriah.Waterland@Sun.COM (mstat->rogue) ? "*" : " ", ept->path); 742*9781SMoriah.Waterland@Sun.COM } else { 743*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, 744*9781SMoriah.Waterland@Sun.COM "conflict-contents=%s\n", ept->path); 745*9781SMoriah.Waterland@Sun.COM } 746*9781SMoriah.Waterland@Sun.COM } else if (mstat->attrchg) { 747*9781SMoriah.Waterland@Sun.COM if (!count++) { 748*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 749*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_CONFLICT)); 750*9781SMoriah.Waterland@Sun.COM } 751*9781SMoriah.Waterland@Sun.COM } else if ((echoGetFlag() == B_TRUE) && 752*9781SMoriah.Waterland@Sun.COM ((count % DISPSIZ) == 0)) { 753*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CONTDISP)); 754*9781SMoriah.Waterland@Sun.COM (void) getc(stdin); 755*9781SMoriah.Waterland@Sun.COM } 756*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 757*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_ATTRONLY), 758*9781SMoriah.Waterland@Sun.COM (mstat->rogue) ? "*" : " ", ept->path); 759*9781SMoriah.Waterland@Sun.COM } else { 760*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, 761*9781SMoriah.Waterland@Sun.COM "conflict-attributes=%s\n", ept->path); 762*9781SMoriah.Waterland@Sun.COM } 763*9781SMoriah.Waterland@Sun.COM } 764*9781SMoriah.Waterland@Sun.COM } 765*9781SMoriah.Waterland@Sun.COM 766*9781SMoriah.Waterland@Sun.COM if (count) { 767*9781SMoriah.Waterland@Sun.COM if (has_a_rogue) { 768*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 769*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_ROGUE)); 770*9781SMoriah.Waterland@Sun.COM } 771*9781SMoriah.Waterland@Sun.COM } 772*9781SMoriah.Waterland@Sun.COM 773*9781SMoriah.Waterland@Sun.COM msgtext = gettext(ERR_CNFFAILED); 774*9781SMoriah.Waterland@Sun.COM 775*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 776*9781SMoriah.Waterland@Sun.COM return (4); 777*9781SMoriah.Waterland@Sun.COM } 778*9781SMoriah.Waterland@Sun.COM 779*9781SMoriah.Waterland@Sun.COM if (ADM(conflict, "quit")) { 780*9781SMoriah.Waterland@Sun.COM return (4); 781*9781SMoriah.Waterland@Sun.COM } 782*9781SMoriah.Waterland@Sun.COM 783*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 784*9781SMoriah.Waterland@Sun.COM return (5); 785*9781SMoriah.Waterland@Sun.COM } 786*9781SMoriah.Waterland@Sun.COM 787*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 788*9781SMoriah.Waterland@Sun.COM 789*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_CONFLICT), 790*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONFLICT))) { 791*9781SMoriah.Waterland@Sun.COM return (n); 792*9781SMoriah.Waterland@Sun.COM } 793*9781SMoriah.Waterland@Sun.COM 794*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 795*9781SMoriah.Waterland@Sun.COM ckquit = 0; 796*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 797*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 798*9781SMoriah.Waterland@Sun.COM 799*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_CONT), 800*9781SMoriah.Waterland@Sun.COM ask_cont)) { 801*9781SMoriah.Waterland@Sun.COM return (n); 802*9781SMoriah.Waterland@Sun.COM } 803*9781SMoriah.Waterland@Sun.COM 804*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 805*9781SMoriah.Waterland@Sun.COM return (3); 806*9781SMoriah.Waterland@Sun.COM } 807*9781SMoriah.Waterland@Sun.COM ckquit = 1; 808*9781SMoriah.Waterland@Sun.COM nocnflct++; 809*9781SMoriah.Waterland@Sun.COM rprcflag++; 810*9781SMoriah.Waterland@Sun.COM } 811*9781SMoriah.Waterland@Sun.COM } 812*9781SMoriah.Waterland@Sun.COM return (0); 813*9781SMoriah.Waterland@Sun.COM } 814*9781SMoriah.Waterland@Sun.COM 815*9781SMoriah.Waterland@Sun.COM /* 816*9781SMoriah.Waterland@Sun.COM * Return value: int 817*9781SMoriah.Waterland@Sun.COM * 0 - success 818*9781SMoriah.Waterland@Sun.COM * 1 - end of file 819*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 820*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 821*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 822*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 823*9781SMoriah.Waterland@Sun.COM */ 824*9781SMoriah.Waterland@Sun.COM 825*9781SMoriah.Waterland@Sun.COM int 826*9781SMoriah.Waterland@Sun.COM cksetuid(void) 827*9781SMoriah.Waterland@Sun.COM { 828*9781SMoriah.Waterland@Sun.COM int i, n, count, overwriting = 0; 829*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT]; 830*9781SMoriah.Waterland@Sun.COM 831*9781SMoriah.Waterland@Sun.COM /* See if the administrative defaults already resolve this check. */ 832*9781SMoriah.Waterland@Sun.COM if (ADM(setuid, "nocheck")) { 833*9781SMoriah.Waterland@Sun.COM return (0); 834*9781SMoriah.Waterland@Sun.COM } 835*9781SMoriah.Waterland@Sun.COM 836*9781SMoriah.Waterland@Sun.COM if (ADM(setuid, "nochange")) { 837*9781SMoriah.Waterland@Sun.COM nosetuid++; /* Do not install processes as setuid/gid. */ 838*9781SMoriah.Waterland@Sun.COM return (0); 839*9781SMoriah.Waterland@Sun.COM } 840*9781SMoriah.Waterland@Sun.COM 841*9781SMoriah.Waterland@Sun.COM /* The administrative defaults require review of the package. */ 842*9781SMoriah.Waterland@Sun.COM 843*9781SMoriah.Waterland@Sun.COM if (zoneName == (char *)NULL) { 844*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKUID_GZ)); 845*9781SMoriah.Waterland@Sun.COM } else { 846*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CKUID_LZ), zoneName); 847*9781SMoriah.Waterland@Sun.COM } 848*9781SMoriah.Waterland@Sun.COM 849*9781SMoriah.Waterland@Sun.COM count = 0; 850*9781SMoriah.Waterland@Sun.COM for (i = 0; extlist[i]; i++) { 851*9781SMoriah.Waterland@Sun.COM int overwr; 852*9781SMoriah.Waterland@Sun.COM struct mergstat *mstat = &(extlist[i]->mstat); 853*9781SMoriah.Waterland@Sun.COM 854*9781SMoriah.Waterland@Sun.COM /* 855*9781SMoriah.Waterland@Sun.COM * Provide the administrator with info as to whether there is 856*9781SMoriah.Waterland@Sun.COM * already a setuid process in place. This is only necessary 857*9781SMoriah.Waterland@Sun.COM * to help the administrator decide whether or not to lay 858*9781SMoriah.Waterland@Sun.COM * down the process, it doesn't have anything to do with the 859*9781SMoriah.Waterland@Sun.COM * administrative defaults. 860*9781SMoriah.Waterland@Sun.COM */ 861*9781SMoriah.Waterland@Sun.COM if (mstat->osetuid || mstat->osetgid) { 862*9781SMoriah.Waterland@Sun.COM overwr = 1; 863*9781SMoriah.Waterland@Sun.COM overwriting = 1; 864*9781SMoriah.Waterland@Sun.COM } else 865*9781SMoriah.Waterland@Sun.COM overwr = 0; 866*9781SMoriah.Waterland@Sun.COM 867*9781SMoriah.Waterland@Sun.COM if (mstat->setuid || mstat->setgid) { 868*9781SMoriah.Waterland@Sun.COM if (!count++) { 869*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 870*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_SETUID)); 871*9781SMoriah.Waterland@Sun.COM } 872*9781SMoriah.Waterland@Sun.COM } else if ((echoGetFlag() == B_TRUE) && 873*9781SMoriah.Waterland@Sun.COM ((count % DISPSIZ) == 0)) { 874*9781SMoriah.Waterland@Sun.COM echo(gettext(MSG_CONTDISP)); 875*9781SMoriah.Waterland@Sun.COM (void) getc(stdin); 876*9781SMoriah.Waterland@Sun.COM } 877*9781SMoriah.Waterland@Sun.COM /* 878*9781SMoriah.Waterland@Sun.COM * NOTE : The leading "!" in these strings forces 879*9781SMoriah.Waterland@Sun.COM * puttext() to print leading white space. 880*9781SMoriah.Waterland@Sun.COM */ 881*9781SMoriah.Waterland@Sun.COM 882*9781SMoriah.Waterland@Sun.COM if (mstat->setuid && mstat->setgid) { 883*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 884*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext( 885*9781SMoriah.Waterland@Sun.COM "!%s %s <setuid %s setgid %s>"), 886*9781SMoriah.Waterland@Sun.COM (overwr) ? "*" : " ", 887*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 888*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.owner, 889*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.group); 890*9781SMoriah.Waterland@Sun.COM } else { 891*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "setuid=%s:%s\n", 892*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 893*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.owner); 894*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "setgid=%s:%s\n", 895*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 896*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.group); 897*9781SMoriah.Waterland@Sun.COM } 898*9781SMoriah.Waterland@Sun.COM } else if (mstat->setuid) { 899*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 900*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext( 901*9781SMoriah.Waterland@Sun.COM "!%s %s <setuid %s>"), 902*9781SMoriah.Waterland@Sun.COM (overwr) ? "*" : " ", 903*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 904*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.owner); 905*9781SMoriah.Waterland@Sun.COM } else { 906*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "setuid=%s:%s\n", 907*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 908*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.owner); 909*9781SMoriah.Waterland@Sun.COM } 910*9781SMoriah.Waterland@Sun.COM } else if (mstat->setgid) { 911*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 912*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext( 913*9781SMoriah.Waterland@Sun.COM "!%s%s <setgid %s>"), 914*9781SMoriah.Waterland@Sun.COM (overwr) ? "*" : " ", 915*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 916*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.group); 917*9781SMoriah.Waterland@Sun.COM } else { 918*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "setgid=%s:%s\n", 919*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.path, 920*9781SMoriah.Waterland@Sun.COM extlist[i]->cf_ent.ainfo.group); 921*9781SMoriah.Waterland@Sun.COM } 922*9781SMoriah.Waterland@Sun.COM } 923*9781SMoriah.Waterland@Sun.COM } 924*9781SMoriah.Waterland@Sun.COM } 925*9781SMoriah.Waterland@Sun.COM 926*9781SMoriah.Waterland@Sun.COM if (count) { 927*9781SMoriah.Waterland@Sun.COM if (overwriting) { 928*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 929*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_OVERWR)); 930*9781SMoriah.Waterland@Sun.COM } else { 931*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, 932*9781SMoriah.Waterland@Sun.COM "setuid-overwrite=true\n"); 933*9781SMoriah.Waterland@Sun.COM } 934*9781SMoriah.Waterland@Sun.COM } 935*9781SMoriah.Waterland@Sun.COM 936*9781SMoriah.Waterland@Sun.COM msgtext = gettext(MSG_UIDFND); 937*9781SMoriah.Waterland@Sun.COM 938*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 939*9781SMoriah.Waterland@Sun.COM return (4); 940*9781SMoriah.Waterland@Sun.COM } 941*9781SMoriah.Waterland@Sun.COM 942*9781SMoriah.Waterland@Sun.COM if (ADM(setuid, "quit")) { 943*9781SMoriah.Waterland@Sun.COM return (4); 944*9781SMoriah.Waterland@Sun.COM } 945*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 946*9781SMoriah.Waterland@Sun.COM return (5); 947*9781SMoriah.Waterland@Sun.COM } 948*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 949*9781SMoriah.Waterland@Sun.COM 950*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_SETUID), 951*9781SMoriah.Waterland@Sun.COM gettext(ASK_SETUID))) { 952*9781SMoriah.Waterland@Sun.COM return (n); 953*9781SMoriah.Waterland@Sun.COM } 954*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 955*9781SMoriah.Waterland@Sun.COM ckquit = 0; 956*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 957*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 958*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_CONT), 959*9781SMoriah.Waterland@Sun.COM ask_cont)) { 960*9781SMoriah.Waterland@Sun.COM return (n); 961*9781SMoriah.Waterland@Sun.COM } 962*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 963*9781SMoriah.Waterland@Sun.COM return (3); 964*9781SMoriah.Waterland@Sun.COM } 965*9781SMoriah.Waterland@Sun.COM ckquit = 1; 966*9781SMoriah.Waterland@Sun.COM nosetuid++; 967*9781SMoriah.Waterland@Sun.COM rprcflag++; 968*9781SMoriah.Waterland@Sun.COM } 969*9781SMoriah.Waterland@Sun.COM } 970*9781SMoriah.Waterland@Sun.COM 971*9781SMoriah.Waterland@Sun.COM return (0); 972*9781SMoriah.Waterland@Sun.COM } 973*9781SMoriah.Waterland@Sun.COM 974*9781SMoriah.Waterland@Sun.COM /* 975*9781SMoriah.Waterland@Sun.COM * Return value: int 976*9781SMoriah.Waterland@Sun.COM * 0 - success 977*9781SMoriah.Waterland@Sun.COM * 1 - end of file 978*9781SMoriah.Waterland@Sun.COM * 2 - undefined error 979*9781SMoriah.Waterland@Sun.COM * 3 - answer was not "y"/was "q" 980*9781SMoriah.Waterland@Sun.COM * 4 - quit action taken 981*9781SMoriah.Waterland@Sun.COM * 5 - interactive mode required 982*9781SMoriah.Waterland@Sun.COM */ 983*9781SMoriah.Waterland@Sun.COM 984*9781SMoriah.Waterland@Sun.COM int 985*9781SMoriah.Waterland@Sun.COM ckpriv(void) 986*9781SMoriah.Waterland@Sun.COM { 987*9781SMoriah.Waterland@Sun.COM struct dirent *dp; 988*9781SMoriah.Waterland@Sun.COM DIR *dirfp; 989*9781SMoriah.Waterland@Sun.COM int n, found; 990*9781SMoriah.Waterland@Sun.COM char ans[MAX_INPUT], path[PATH_MAX]; 991*9781SMoriah.Waterland@Sun.COM 992*9781SMoriah.Waterland@Sun.COM if (ADM(action, "nocheck")) { 993*9781SMoriah.Waterland@Sun.COM return (0); 994*9781SMoriah.Waterland@Sun.COM } 995*9781SMoriah.Waterland@Sun.COM 996*9781SMoriah.Waterland@Sun.COM (void) snprintf(path, sizeof (path), "%s/install", instdir); 997*9781SMoriah.Waterland@Sun.COM if ((dirfp = opendir(path)) == NULL) { 998*9781SMoriah.Waterland@Sun.COM return (0); 999*9781SMoriah.Waterland@Sun.COM } 1000*9781SMoriah.Waterland@Sun.COM 1001*9781SMoriah.Waterland@Sun.COM found = 0; 1002*9781SMoriah.Waterland@Sun.COM while ((dp = readdir(dirfp)) != NULL) { 1003*9781SMoriah.Waterland@Sun.COM if (strcmp(dp->d_name, "preinstall") == 0 || 1004*9781SMoriah.Waterland@Sun.COM strcmp(dp->d_name, "postinstall") == 0 || 1005*9781SMoriah.Waterland@Sun.COM strncmp(dp->d_name, "i.", 2) == 0) { 1006*9781SMoriah.Waterland@Sun.COM found++; 1007*9781SMoriah.Waterland@Sun.COM break; 1008*9781SMoriah.Waterland@Sun.COM } 1009*9781SMoriah.Waterland@Sun.COM } 1010*9781SMoriah.Waterland@Sun.COM (void) closedir(dirfp); 1011*9781SMoriah.Waterland@Sun.COM 1012*9781SMoriah.Waterland@Sun.COM if (found) { 1013*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 1014*9781SMoriah.Waterland@Sun.COM ptext(stderr, gettext(MSG_PRIV)); 1015*9781SMoriah.Waterland@Sun.COM msgtext = gettext(MSG_SCRFND); 1016*9781SMoriah.Waterland@Sun.COM } 1017*9781SMoriah.Waterland@Sun.COM (void) snprintf(ask_cont, sizeof (ask_cont), 1018*9781SMoriah.Waterland@Sun.COM gettext(ASK_CONT), pkginst); 1019*9781SMoriah.Waterland@Sun.COM 1020*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_TRUE) { 1021*9781SMoriah.Waterland@Sun.COM return (4); 1022*9781SMoriah.Waterland@Sun.COM } 1023*9781SMoriah.Waterland@Sun.COM 1024*9781SMoriah.Waterland@Sun.COM if (ADM(action, "quit")) { 1025*9781SMoriah.Waterland@Sun.COM return (4); 1026*9781SMoriah.Waterland@Sun.COM } 1027*9781SMoriah.Waterland@Sun.COM 1028*9781SMoriah.Waterland@Sun.COM if (echoGetFlag() == B_FALSE) { 1029*9781SMoriah.Waterland@Sun.COM return (5); 1030*9781SMoriah.Waterland@Sun.COM } 1031*9781SMoriah.Waterland@Sun.COM 1032*9781SMoriah.Waterland@Sun.COM msgtext = NULL; 1033*9781SMoriah.Waterland@Sun.COM 1034*9781SMoriah.Waterland@Sun.COM ckquit = 0; 1035*9781SMoriah.Waterland@Sun.COM if (n = ckyorn(ans, NULL, NULL, gettext(HLP_PRIV), 1036*9781SMoriah.Waterland@Sun.COM ask_cont)) { 1037*9781SMoriah.Waterland@Sun.COM return (n); 1038*9781SMoriah.Waterland@Sun.COM } 1039*9781SMoriah.Waterland@Sun.COM 1040*9781SMoriah.Waterland@Sun.COM if (strchr("yY", *ans) == NULL) { 1041*9781SMoriah.Waterland@Sun.COM return (3); 1042*9781SMoriah.Waterland@Sun.COM } 1043*9781SMoriah.Waterland@Sun.COM ckquit = 1; 1044*9781SMoriah.Waterland@Sun.COM } 1045*9781SMoriah.Waterland@Sun.COM 1046*9781SMoriah.Waterland@Sun.COM return (0); 1047*9781SMoriah.Waterland@Sun.COM } 1048*9781SMoriah.Waterland@Sun.COM 1049*9781SMoriah.Waterland@Sun.COM /* 1050*9781SMoriah.Waterland@Sun.COM * Return value: int 1051*9781SMoriah.Waterland@Sun.COM * 0 - success 1052*9781SMoriah.Waterland@Sun.COM * 99 - failure 1053*9781SMoriah.Waterland@Sun.COM */ 1054*9781SMoriah.Waterland@Sun.COM 1055*9781SMoriah.Waterland@Sun.COM int 1056*9781SMoriah.Waterland@Sun.COM ckpkgfiles(void) 1057*9781SMoriah.Waterland@Sun.COM { 1058*9781SMoriah.Waterland@Sun.COM register int i; 1059*9781SMoriah.Waterland@Sun.COM struct cfent *ept; 1060*9781SMoriah.Waterland@Sun.COM int errflg; 1061*9781SMoriah.Waterland@Sun.COM char source[PATH_MAX]; 1062*9781SMoriah.Waterland@Sun.COM 1063*9781SMoriah.Waterland@Sun.COM errflg = 0; 1064*9781SMoriah.Waterland@Sun.COM for (i = 0; extlist[i]; i++) { 1065*9781SMoriah.Waterland@Sun.COM ept = &(extlist[i]->cf_ent); 1066*9781SMoriah.Waterland@Sun.COM if (ept->ftype != 'i') { 1067*9781SMoriah.Waterland@Sun.COM continue; 1068*9781SMoriah.Waterland@Sun.COM } 1069*9781SMoriah.Waterland@Sun.COM 1070*9781SMoriah.Waterland@Sun.COM if (ept->ainfo.local) { 1071*9781SMoriah.Waterland@Sun.COM (void) snprintf(source, sizeof (source), 1072*9781SMoriah.Waterland@Sun.COM "%s/%s", instdir, ept->ainfo.local); 1073*9781SMoriah.Waterland@Sun.COM } else if (strcmp(ept->path, PKGINFO) == 0) { 1074*9781SMoriah.Waterland@Sun.COM (void) snprintf(source, sizeof (source), 1075*9781SMoriah.Waterland@Sun.COM "%s/%s", instdir, ept->path); 1076*9781SMoriah.Waterland@Sun.COM } else { 1077*9781SMoriah.Waterland@Sun.COM (void) snprintf(source, sizeof (source), 1078*9781SMoriah.Waterland@Sun.COM "%s/install/%s", instdir, ept->path); 1079*9781SMoriah.Waterland@Sun.COM } 1080*9781SMoriah.Waterland@Sun.COM if (cverify(0, &ept->ftype, source, &ept->cinfo, 1)) { 1081*9781SMoriah.Waterland@Sun.COM errflg++; 1082*9781SMoriah.Waterland@Sun.COM if (preinstallCheck == B_FALSE) { 1083*9781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_BADFILE), source); 1084*9781SMoriah.Waterland@Sun.COM logerr(getErrbufAddr()); 1085*9781SMoriah.Waterland@Sun.COM } else { 1086*9781SMoriah.Waterland@Sun.COM (void) fprintf(stdout, "ckpkgfilebad=%s", 1087*9781SMoriah.Waterland@Sun.COM source); 1088*9781SMoriah.Waterland@Sun.COM } 1089*9781SMoriah.Waterland@Sun.COM } 1090*9781SMoriah.Waterland@Sun.COM } 1091*9781SMoriah.Waterland@Sun.COM 1092*9781SMoriah.Waterland@Sun.COM if (errflg) { 1093*9781SMoriah.Waterland@Sun.COM return (99); 1094*9781SMoriah.Waterland@Sun.COM } else { 1095*9781SMoriah.Waterland@Sun.COM return (0); 1096*9781SMoriah.Waterland@Sun.COM } 1097*9781SMoriah.Waterland@Sun.COM } 1098