1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 23*0Sstevel@tonic-gate /* All Rights Reserved */ 24*0Sstevel@tonic-gate 25*0Sstevel@tonic-gate 26*0Sstevel@tonic-gate #ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.13 */ 27*0Sstevel@tonic-gate /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */ 28*0Sstevel@tonic-gate 29*0Sstevel@tonic-gate #include "string.h" 30*0Sstevel@tonic-gate #include "errno.h" 31*0Sstevel@tonic-gate #include "sys/types.h" 32*0Sstevel@tonic-gate #include "stdlib.h" 33*0Sstevel@tonic-gate 34*0Sstevel@tonic-gate #include "lp.h" 35*0Sstevel@tonic-gate #include "printers.h" 36*0Sstevel@tonic-gate 37*0Sstevel@tonic-gate /** 38*0Sstevel@tonic-gate ** getpwheel() - GET PRINT WHEEL INFO FROM DISK 39*0Sstevel@tonic-gate **/ 40*0Sstevel@tonic-gate 41*0Sstevel@tonic-gate PWHEEL * 42*0Sstevel@tonic-gate #if defined(__STDC__) 43*0Sstevel@tonic-gate getpwheel ( 44*0Sstevel@tonic-gate char * name 45*0Sstevel@tonic-gate ) 46*0Sstevel@tonic-gate #else 47*0Sstevel@tonic-gate getpwheel (name) 48*0Sstevel@tonic-gate char *name; 49*0Sstevel@tonic-gate #endif 50*0Sstevel@tonic-gate { 51*0Sstevel@tonic-gate static long lastdir = -1; 52*0Sstevel@tonic-gate 53*0Sstevel@tonic-gate static PWHEEL pwheel; 54*0Sstevel@tonic-gate 55*0Sstevel@tonic-gate register FALERT *pa; 56*0Sstevel@tonic-gate 57*0Sstevel@tonic-gate 58*0Sstevel@tonic-gate if (!name || !*name) { 59*0Sstevel@tonic-gate errno = EINVAL; 60*0Sstevel@tonic-gate return (0); 61*0Sstevel@tonic-gate } 62*0Sstevel@tonic-gate 63*0Sstevel@tonic-gate /* 64*0Sstevel@tonic-gate * Getting ``all''? If so, jump into the directory 65*0Sstevel@tonic-gate * wherever we left off. 66*0Sstevel@tonic-gate */ 67*0Sstevel@tonic-gate if (STREQU(NAME_ALL, name)) { 68*0Sstevel@tonic-gate if (!(name = next_dir(Lp_A_PrintWheels, &lastdir))) 69*0Sstevel@tonic-gate return (0); 70*0Sstevel@tonic-gate } else 71*0Sstevel@tonic-gate lastdir = -1; 72*0Sstevel@tonic-gate 73*0Sstevel@tonic-gate /* 74*0Sstevel@tonic-gate * Get the information for the alert. 75*0Sstevel@tonic-gate */ 76*0Sstevel@tonic-gate if (!(pa = getalert(Lp_A_PrintWheels, name))) { 77*0Sstevel@tonic-gate 78*0Sstevel@tonic-gate /* 79*0Sstevel@tonic-gate * Unless the world has turned weird, we shouldn't 80*0Sstevel@tonic-gate * get ENOTDIR if we're doing the ``all'' case--because 81*0Sstevel@tonic-gate * getting here in the all case meant the printwheel 82*0Sstevel@tonic-gate * directory exists, but ENOTDIR means it doesn't! 83*0Sstevel@tonic-gate */ 84*0Sstevel@tonic-gate if (errno == ENOTDIR) 85*0Sstevel@tonic-gate errno = ENOENT; /* printwheel doesn't exist */ 86*0Sstevel@tonic-gate 87*0Sstevel@tonic-gate return (0); 88*0Sstevel@tonic-gate } 89*0Sstevel@tonic-gate 90*0Sstevel@tonic-gate pwheel.alert = *pa; 91*0Sstevel@tonic-gate pwheel.name = Strdup(name); 92*0Sstevel@tonic-gate 93*0Sstevel@tonic-gate return (&pwheel); 94*0Sstevel@tonic-gate } 95*0Sstevel@tonic-gate 96*0Sstevel@tonic-gate /** 97*0Sstevel@tonic-gate ** putpwheel() - PUT PRINT WHEEL INFO TO DISK 98*0Sstevel@tonic-gate **/ 99*0Sstevel@tonic-gate 100*0Sstevel@tonic-gate int 101*0Sstevel@tonic-gate #if defined(__STDC__) 102*0Sstevel@tonic-gate putpwheel ( 103*0Sstevel@tonic-gate char * name, 104*0Sstevel@tonic-gate PWHEEL * pwheelp 105*0Sstevel@tonic-gate ) 106*0Sstevel@tonic-gate #else 107*0Sstevel@tonic-gate putpwheel (name, pwheelp) 108*0Sstevel@tonic-gate char *name; 109*0Sstevel@tonic-gate PWHEEL *pwheelp; 110*0Sstevel@tonic-gate #endif 111*0Sstevel@tonic-gate { 112*0Sstevel@tonic-gate register char *path; 113*0Sstevel@tonic-gate 114*0Sstevel@tonic-gate struct stat statbuf; 115*0Sstevel@tonic-gate 116*0Sstevel@tonic-gate 117*0Sstevel@tonic-gate if (!name || !*name) { 118*0Sstevel@tonic-gate errno = EINVAL; 119*0Sstevel@tonic-gate return (-1); 120*0Sstevel@tonic-gate } 121*0Sstevel@tonic-gate 122*0Sstevel@tonic-gate if (STREQU(name, NAME_ALL)) { 123*0Sstevel@tonic-gate errno = ENOENT; 124*0Sstevel@tonic-gate return (-1); 125*0Sstevel@tonic-gate } 126*0Sstevel@tonic-gate 127*0Sstevel@tonic-gate /* 128*0Sstevel@tonic-gate * Create the parent directory for this printer 129*0Sstevel@tonic-gate * if it doesn't yet exist. 130*0Sstevel@tonic-gate */ 131*0Sstevel@tonic-gate if (!(path = makepath(Lp_A_PrintWheels, name, (char *)0))) 132*0Sstevel@tonic-gate return (-1); 133*0Sstevel@tonic-gate if (Stat(path, &statbuf) == 0) { 134*0Sstevel@tonic-gate if (!(statbuf.st_mode & S_IFDIR)) { 135*0Sstevel@tonic-gate Free (path); 136*0Sstevel@tonic-gate errno = ENOTDIR; 137*0Sstevel@tonic-gate return (-1); 138*0Sstevel@tonic-gate } 139*0Sstevel@tonic-gate } else if (errno != ENOENT || mkdir_lpdir(path, MODE_DIR) == -1) { 140*0Sstevel@tonic-gate Free (path); 141*0Sstevel@tonic-gate return (-1); 142*0Sstevel@tonic-gate } 143*0Sstevel@tonic-gate Free (path); 144*0Sstevel@tonic-gate 145*0Sstevel@tonic-gate /* 146*0Sstevel@tonic-gate * Now write out the alert condition. 147*0Sstevel@tonic-gate */ 148*0Sstevel@tonic-gate if (putalert(Lp_A_PrintWheels, name, &(pwheelp->alert)) == -1) 149*0Sstevel@tonic-gate return (-1); 150*0Sstevel@tonic-gate 151*0Sstevel@tonic-gate return (0); 152*0Sstevel@tonic-gate } 153*0Sstevel@tonic-gate 154*0Sstevel@tonic-gate /** 155*0Sstevel@tonic-gate ** delpwheel() - DELETE PRINT WHEEL INFO FROM DISK 156*0Sstevel@tonic-gate **/ 157*0Sstevel@tonic-gate 158*0Sstevel@tonic-gate #if defined(__STDC__) 159*0Sstevel@tonic-gate static int _delpwheel ( char * ); 160*0Sstevel@tonic-gate #else 161*0Sstevel@tonic-gate static int _delpwheel(); 162*0Sstevel@tonic-gate #endif 163*0Sstevel@tonic-gate 164*0Sstevel@tonic-gate int 165*0Sstevel@tonic-gate #if defined(__STDC__) 166*0Sstevel@tonic-gate delpwheel ( 167*0Sstevel@tonic-gate char * name 168*0Sstevel@tonic-gate ) 169*0Sstevel@tonic-gate #else 170*0Sstevel@tonic-gate delpwheel (name) 171*0Sstevel@tonic-gate char *name; 172*0Sstevel@tonic-gate #endif 173*0Sstevel@tonic-gate { 174*0Sstevel@tonic-gate long lastdir; 175*0Sstevel@tonic-gate 176*0Sstevel@tonic-gate 177*0Sstevel@tonic-gate if (!name || !*name) { 178*0Sstevel@tonic-gate errno = EINVAL; 179*0Sstevel@tonic-gate return (-1); 180*0Sstevel@tonic-gate } 181*0Sstevel@tonic-gate 182*0Sstevel@tonic-gate if (STREQU(NAME_ALL, name)) { 183*0Sstevel@tonic-gate lastdir = -1; 184*0Sstevel@tonic-gate while ((name = next_dir(Lp_A_PrintWheels, &lastdir))) 185*0Sstevel@tonic-gate if (_delpwheel(name) == -1) 186*0Sstevel@tonic-gate return (-1); 187*0Sstevel@tonic-gate return (0); 188*0Sstevel@tonic-gate } else 189*0Sstevel@tonic-gate return (_delpwheel(name)); 190*0Sstevel@tonic-gate } 191*0Sstevel@tonic-gate 192*0Sstevel@tonic-gate /** 193*0Sstevel@tonic-gate ** _delpwheel() 194*0Sstevel@tonic-gate **/ 195*0Sstevel@tonic-gate 196*0Sstevel@tonic-gate static int 197*0Sstevel@tonic-gate #if defined(__STDC__) 198*0Sstevel@tonic-gate _delpwheel ( 199*0Sstevel@tonic-gate char * name 200*0Sstevel@tonic-gate ) 201*0Sstevel@tonic-gate #else 202*0Sstevel@tonic-gate _delpwheel (name) 203*0Sstevel@tonic-gate char *name; 204*0Sstevel@tonic-gate #endif 205*0Sstevel@tonic-gate { 206*0Sstevel@tonic-gate register char *path; 207*0Sstevel@tonic-gate 208*0Sstevel@tonic-gate if (delalert(Lp_A_PrintWheels, name) == -1) 209*0Sstevel@tonic-gate return (-1); 210*0Sstevel@tonic-gate if (!(path = makepath(Lp_A_PrintWheels, name, (char *)0))) 211*0Sstevel@tonic-gate return (-1); 212*0Sstevel@tonic-gate if (Rmdir(path)) { 213*0Sstevel@tonic-gate Free (path); 214*0Sstevel@tonic-gate return (-1); 215*0Sstevel@tonic-gate } 216*0Sstevel@tonic-gate Free (path); 217*0Sstevel@tonic-gate return (0); 218*0Sstevel@tonic-gate } 219*0Sstevel@tonic-gate 220*0Sstevel@tonic-gate /** 221*0Sstevel@tonic-gate ** freepwheel() - FREE MEMORY ALLOCATED FOR PRINT WHEEL STRUCTURE 222*0Sstevel@tonic-gate **/ 223*0Sstevel@tonic-gate 224*0Sstevel@tonic-gate void 225*0Sstevel@tonic-gate #if defined(__STDC__) 226*0Sstevel@tonic-gate freepwheel ( 227*0Sstevel@tonic-gate PWHEEL * ppw 228*0Sstevel@tonic-gate ) 229*0Sstevel@tonic-gate #else 230*0Sstevel@tonic-gate freepwheel (ppw) 231*0Sstevel@tonic-gate PWHEEL *ppw; 232*0Sstevel@tonic-gate #endif 233*0Sstevel@tonic-gate { 234*0Sstevel@tonic-gate if (!ppw) 235*0Sstevel@tonic-gate return; 236*0Sstevel@tonic-gate if (ppw->name) 237*0Sstevel@tonic-gate Free (ppw->name); 238*0Sstevel@tonic-gate if (ppw->alert.shcmd) 239*0Sstevel@tonic-gate Free (ppw->alert.shcmd); 240*0Sstevel@tonic-gate return; 241*0Sstevel@tonic-gate } 242