1*a5f69788Scraigm /* 2*a5f69788Scraigm * CDDL HEADER START 3*a5f69788Scraigm * 4*a5f69788Scraigm * The contents of this file are subject to the terms of the 5*a5f69788Scraigm * Common Development and Distribution License (the "License"). 6*a5f69788Scraigm * You may not use this file except in compliance with the License. 7*a5f69788Scraigm * 8*a5f69788Scraigm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*a5f69788Scraigm * or http://www.opensolaris.org/os/licensing. 10*a5f69788Scraigm * See the License for the specific language governing permissions 11*a5f69788Scraigm * and limitations under the License. 12*a5f69788Scraigm * 13*a5f69788Scraigm * When distributing Covered Code, include this CDDL HEADER in each 14*a5f69788Scraigm * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*a5f69788Scraigm * If applicable, add the following below this CDDL HEADER, with the 16*a5f69788Scraigm * fields enclosed by brackets "[]" replaced with your own identifying 17*a5f69788Scraigm * information: Portions Copyright [yyyy] [name of copyright owner] 18*a5f69788Scraigm * 19*a5f69788Scraigm * CDDL HEADER END 20*a5f69788Scraigm */ 21*a5f69788Scraigm 22*a5f69788Scraigm /* 23*a5f69788Scraigm * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*a5f69788Scraigm * Use is subject to license terms. 25*a5f69788Scraigm */ 26*a5f69788Scraigm 27*a5f69788Scraigm #pragma ident "%Z%%M% %I% %E% SMI" 28*a5f69788Scraigm 29*a5f69788Scraigm #include "c_synonyms.h" 30*a5f69788Scraigm #include <sys/types.h> 31*a5f69788Scraigm #include <errno.h> 32*a5f69788Scraigm #include <fcntl.h> 33*a5f69788Scraigm #include <limits.h> 34*a5f69788Scraigm #include <signal.h> 35*a5f69788Scraigm #include <stdio.h> 36*a5f69788Scraigm #include <stdio_ext.h> 37*a5f69788Scraigm #include <stdlib.h> 38*a5f69788Scraigm #include <string.h> 39*a5f69788Scraigm #include <unistd.h> 40*a5f69788Scraigm 41*a5f69788Scraigm #define _FILE_FD_MAX 255 42*a5f69788Scraigm 43*a5f69788Scraigm /* 44*a5f69788Scraigm * This 32-bit only preloadable library enables extended fd FILE's. 45*a5f69788Scraigm */ 46*a5f69788Scraigm 47*a5f69788Scraigm #pragma init(init_STDIO_bad_fd) 48*a5f69788Scraigm 49*a5f69788Scraigm void 50*a5f69788Scraigm init_STDIO_bad_fd(void) 51*a5f69788Scraigm { 52*a5f69788Scraigm int action = -1; /* default signal */ 53*a5f69788Scraigm int closed_fd = -1; /* default fd */ 54*a5f69788Scraigm char *ptr; 55*a5f69788Scraigm int signal; 56*a5f69788Scraigm int retval; 57*a5f69788Scraigm 58*a5f69788Scraigm /* 59*a5f69788Scraigm * user specified badfd 60*a5f69788Scraigm */ 61*a5f69788Scraigm if ((ptr = getenv("_STDIO_BADFD")) != NULL) { 62*a5f69788Scraigm closed_fd = atoi(ptr); 63*a5f69788Scraigm if (closed_fd < 3 || closed_fd > _FILE_FD_MAX) { 64*a5f69788Scraigm (void) fprintf(stderr, "File descriptor must be" 65*a5f69788Scraigm " in the range 3-%d inclusive.\n", _FILE_FD_MAX); 66*a5f69788Scraigm exit(1); 67*a5f69788Scraigm } 68*a5f69788Scraigm } 69*a5f69788Scraigm 70*a5f69788Scraigm /* 71*a5f69788Scraigm * user specified action 72*a5f69788Scraigm */ 73*a5f69788Scraigm if ((ptr = getenv("_STDIO_BADFD_SIGNAL")) != NULL) { 74*a5f69788Scraigm /* accept numbers or symbolic names */ 75*a5f69788Scraigm if (strncmp(ptr, "SIG", 3) == 0) /* begins with "SIG"? */ 76*a5f69788Scraigm ptr = ptr + 3; 77*a5f69788Scraigm retval = str2sig(ptr, &signal); 78*a5f69788Scraigm if (retval == -1) { 79*a5f69788Scraigm (void) fprintf(stderr, 80*a5f69788Scraigm "Invalid signal name or number.\n"); 81*a5f69788Scraigm exit(1); 82*a5f69788Scraigm } 83*a5f69788Scraigm action = signal; 84*a5f69788Scraigm } 85*a5f69788Scraigm 86*a5f69788Scraigm if ((closed_fd = enable_extended_FILE_stdio(closed_fd, action)) == -1) { 87*a5f69788Scraigm perror("enable_extended_FILE_stdio(3C)"); 88*a5f69788Scraigm exit(1); 89*a5f69788Scraigm } 90*a5f69788Scraigm } 91