usr/src/lib/libc/port/gen/str2sig.c
author raf
Mon, 10 Apr 2006 12:27:38 -0700
changeset 1778 6357a59054f7
parent 0 68f95e015346
child 6812 febeba71273d
permissions -rw-r--r--
6404383 select() behaviour changed in Solaris 10, breaking binary compatibility
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#pragma weak str2sig = _str2sig
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#pragma weak sig2str = _sig2str
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
typedef struct signame {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
	const char *sigstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	const int   signum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
} signame_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
static signame_t signames[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	{ "EXIT",	0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	{ "HUP",	SIGHUP },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	{ "INT",	SIGINT },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	{ "QUIT",	SIGQUIT },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	{ "ILL",	SIGILL },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	{ "TRAP",	SIGTRAP },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	{ "ABRT",	SIGABRT },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	{ "IOT",	SIGIOT },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	{ "EMT",	SIGEMT },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	{ "FPE",	SIGFPE },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	{ "KILL",	SIGKILL },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	{ "BUS",	SIGBUS },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	{ "SEGV",	SIGSEGV },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	{ "SYS",	SIGSYS },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	{ "PIPE",	SIGPIPE },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	{ "ALRM",	SIGALRM },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	{ "TERM",	SIGTERM },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	{ "USR1",	SIGUSR1 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	{ "USR2",	SIGUSR2 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	{ "CLD",	SIGCLD },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	{ "CHLD",	SIGCHLD },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	{ "PWR",	SIGPWR },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	{ "WINCH",	SIGWINCH },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	{ "URG",	SIGURG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	{ "POLL",	SIGPOLL },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	{ "IO",		SIGPOLL },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	{ "STOP",	SIGSTOP },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	{ "TSTP",	SIGTSTP },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	{ "CONT",	SIGCONT },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	{ "TTIN",	SIGTTIN },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	{ "TTOU",	SIGTTOU },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	{ "VTALRM",	SIGVTALRM },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	{ "PROF",	SIGPROF },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	{ "XCPU",	SIGXCPU },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	{ "XFSZ",	SIGXFSZ },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	{ "WAITING",	SIGWAITING },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	{ "LWP",	SIGLWP },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	{ "FREEZE",	SIGFREEZE },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	{ "THAW",	SIGTHAW },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	{ "CANCEL",	SIGCANCEL },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	{ "LOST",	SIGLOST },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	{ "XRES", 	SIGXRES },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	{ "JVM1",	SIGJVM1 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	{ "JVM2",	SIGJVM2 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	{ "RTMIN",	_SIGRTMIN },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	{ "RTMIN+1",	_SIGRTMIN+1 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	{ "RTMIN+2",	_SIGRTMIN+2 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	{ "RTMIN+3",	_SIGRTMIN+3 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	{ "RTMAX-3",	_SIGRTMAX-3 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	{ "RTMAX-2",	_SIGRTMAX-2 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	{ "RTMAX-1",	_SIGRTMAX-1 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	{ "RTMAX",	_SIGRTMAX },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
#define	SIGCNT	(sizeof (signames) / sizeof (struct signame))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
static int	str2long(const char *, long *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
str2long(const char *p, long *val)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	char *q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	int saved_errno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	*val = strtol(p, &q, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	error = ((errno != 0 || q == p || *q != '\0') ? -1 : 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	errno = saved_errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
str2sig(const char *s, int *sigp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	const struct signame *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	if (*s >= '0' && *s <= '9') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
		long val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		if (str2long(s, &val) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		for (sp = signames; sp < &signames[SIGCNT]; sp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			if (sp->signum == val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
				*sigp = sp->signum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		for (sp = signames; sp < &signames[SIGCNT]; sp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			if (strcmp(sp->sigstr, s) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
				*sigp = sp->signum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
sig2str(int i, char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	const struct signame *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	for (sp = signames; sp < &signames[SIGCNT]; sp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		if (sp->signum == i) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
			(void) strcpy(s, sp->sigstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
}