1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 #include "mt.h" 31 #include <stdlib.h> 32 #include <thread.h> 33 #undef t_errno 34 35 /* 36 * transport errno 37 */ 38 39 int t_errno = 0; 40 41 /* 42 * TLI Interface exposes "t_nerr" and "t_errlist" which is a poor 43 * choice. XTI fixes that and only documents t_error() and t_strerror() 44 * as interface. We leave these variables here alone here. We create 45 * replica of these as a subset for use by XTI in t_strerror(). The 46 * first part of the replica is same as here. 47 * The rest of the errors are defined only in XTI. 48 */ 49 int t_nerr = 19; 50 51 /* 52 * transport interface error list 53 */ 54 55 char *t_errlist[] = { 56 "No Error", /* 0 */ 57 "Incorrect address format", /* 1 */ 58 "Incorrect options format", /* 2 */ 59 "Illegal permissions", /* 3 */ 60 "Illegal file descriptor", /* 4 */ 61 "Couldn't allocate address", /* 5 */ 62 "Routine will place interface out of state", /* 6 */ 63 "Illegal called/calling sequence number", /* 7 */ 64 "System error", /* 8 */ 65 "An event requires attention", /* 9 */ 66 "Illegal amount of data", /* 10 */ 67 "Buffer not large enough", /* 11 */ 68 "Can't send message - (blocked)", /* 12 */ 69 "No message currently available", /* 13 */ 70 "Disconnect message not found", /* 14 */ 71 "Unitdata error message not found", /* 15 */ 72 "Incorrect flags specified", /* 16 */ 73 "Orderly release message not found", /* 17 */ 74 "Primitive not supported by provider", /* 18 */ 75 "State is in process of changing", /* 19 */ 76 "", 77 "", 78 "", 79 "", 80 "", 81 "", 82 "", 83 "", 84 "", 85 "", 86 "", 87 "", 88 "", 89 "", 90 "", 91 "", 92 "", 93 "", 94 "", 95 "", 96 "", 97 "", 98 "", 99 "", 100 "", 101 "", 102 "", 103 "", 104 "", 105 "", 106 "", 107 "", 108 "", 109 "", 110 "", 111 "", 112 "", 113 "" 114 /* 115 * N.B.: t_errlist must not expand beyond this point or binary 116 * compatibility will be broken. When necessary to accomodate 117 * more error strings, they may only be added to the list printed 118 * by t_strerror(), q.v.. Currently, t_strerror() conserves space 119 * by pointing into t_errlist[]. To expand beyond 57 errors, it 120 * will be necessary to change t_strerror() to use a different 121 * array. 122 */ 123 }; 124 125 126 int * 127 __t_errno(void) 128 { 129 static pthread_key_t t_errno_key = PTHREAD_ONCE_KEY_NP; 130 int *ret; 131 132 if (thr_main()) 133 return (&t_errno); 134 ret = thr_get_storage(&t_errno_key, sizeof (int), free); 135 /* if thr_get_storage fails we return the address of t_errno */ 136 return (ret ? ret : &t_errno); 137 } 138