sysconf.c revision 165232
1/*-
2 * Copyright (c) 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Sean Eric Fagan of Cygnus Support.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by the University of
19 *	California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 *    may be used to endorse or promote products derived from this software
22 *    without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#if defined(LIBC_SCCS) && !defined(lint)
38static char sccsid[] = "@(#)sysconf.c	8.2 (Berkeley) 3/20/94";
39#endif /* LIBC_SCCS and not lint */
40#include <sys/cdefs.h>
41__FBSDID("$FreeBSD: head/lib/libc/gen/sysconf.c 165232 2006-12-14 22:14:14Z imp $");
42
43#include <sys/param.h>
44#include <sys/time.h>
45#include <sys/sysctl.h>
46#include <sys/resource.h>
47#include <sys/socket.h>
48
49#include <errno.h>
50#include <limits.h>
51#include <paths.h>
52#include <pthread.h>		/* we just need the limits */
53#include <time.h>
54#include <unistd.h>
55
56#include "../stdlib/atexit.h"
57#include "../stdtime/tzfile.h"
58
59#define	_PATH_ZONEINFO	TZDIR	/* from tzfile.h */
60
61/*
62 * sysconf --
63 *	get configurable system variables.
64 *
65 * XXX
66 * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values
67 * not change during the lifetime of the calling process.  This would seem
68 * to require that any change to system limits kill all running processes.
69 * A workaround might be to cache the values when they are first retrieved
70 * and then simply return the cached value on subsequent calls.  This is
71 * less useful than returning up-to-date values, however.
72 */
73long
74sysconf(name)
75	int name;
76{
77	struct rlimit rl;
78	size_t len;
79	int mib[2], sverrno, value;
80	long defaultresult;
81	const char *path;
82	const char *sname;
83
84	len = sizeof(value);
85	defaultresult = -1;
86	sname = NULL;
87
88	switch (name) {
89	case _SC_ARG_MAX:
90		mib[0] = CTL_KERN;
91		mib[1] = KERN_ARGMAX;
92		break;
93	case _SC_CHILD_MAX:
94		if (getrlimit(RLIMIT_NPROC, &rl) != 0)
95			return (-1);
96		if (rl.rlim_cur == RLIM_INFINITY)
97			return (-1);
98		if (rl.rlim_cur > LONG_MAX) {
99			errno = EOVERFLOW;
100			return (-1);
101		}
102		return ((long)rl.rlim_cur);
103	case _SC_CLK_TCK:
104		return (CLK_TCK);
105	case _SC_NGROUPS_MAX:
106		mib[0] = CTL_KERN;
107		mib[1] = KERN_NGROUPS;
108		break;
109	case _SC_OPEN_MAX:
110	case _SC_STREAM_MAX:	/* assume fds run out before memory does */
111		if (getrlimit(RLIMIT_NOFILE, &rl) != 0)
112			return (-1);
113		if (rl.rlim_cur == RLIM_INFINITY)
114			return (-1);
115		if (rl.rlim_cur > LONG_MAX) {
116			errno = EOVERFLOW;
117			return (-1);
118		}
119		return ((long)rl.rlim_cur);
120	case _SC_JOB_CONTROL:
121		return (_POSIX_JOB_CONTROL);
122	case _SC_SAVED_IDS:
123		/* XXX - must be 1 */
124		mib[0] = CTL_KERN;
125		mib[1] = KERN_SAVED_IDS;
126		goto yesno;
127	case _SC_VERSION:
128		mib[0] = CTL_KERN;
129		mib[1] = KERN_POSIX1;
130		break;
131	case _SC_BC_BASE_MAX:
132		return (BC_BASE_MAX);
133	case _SC_BC_DIM_MAX:
134		return (BC_DIM_MAX);
135	case _SC_BC_SCALE_MAX:
136		return (BC_SCALE_MAX);
137	case _SC_BC_STRING_MAX:
138		return (BC_STRING_MAX);
139	case _SC_COLL_WEIGHTS_MAX:
140		return (COLL_WEIGHTS_MAX);
141	case _SC_EXPR_NEST_MAX:
142		return (EXPR_NEST_MAX);
143	case _SC_LINE_MAX:
144		return (LINE_MAX);
145	case _SC_RE_DUP_MAX:
146		return (RE_DUP_MAX);
147	case _SC_2_VERSION:
148		/*
149		 * This is something of a lie, but it would be silly at
150		 * this point to try to deduce this from the contents
151		 * of the filesystem.
152		 */
153		return (_POSIX2_VERSION);
154	case _SC_2_C_BIND:
155		return (_POSIX2_C_BIND);
156	case _SC_2_C_DEV:
157		return (_POSIX2_C_DEV);
158	case _SC_2_CHAR_TERM:
159		return (_POSIX2_CHAR_TERM);
160	case _SC_2_FORT_DEV:
161		return (_POSIX2_FORT_DEV);
162	case _SC_2_FORT_RUN:
163		return (_POSIX2_FORT_RUN);
164	case _SC_2_LOCALEDEF:
165		return (_POSIX2_LOCALEDEF);
166	case _SC_2_SW_DEV:
167		return (_POSIX2_SW_DEV);
168	case _SC_2_UPE:
169		return (_POSIX2_UPE);
170	case _SC_TZNAME_MAX:
171		path = _PATH_ZONEINFO;
172do_NAME_MAX:
173		sverrno = errno;
174		errno = 0;
175		value = pathconf(path, _PC_NAME_MAX);
176		if (value == -1 && errno != 0)
177			return (-1);
178		errno = sverrno;
179		return (value);
180
181	case _SC_ASYNCHRONOUS_IO:
182#if _POSIX_ASYNCHRONOUS_IO == 0
183		mib[0] = CTL_P1003_1B;
184		mib[1] = CTL_P1003_1B_ASYNCHRONOUS_IO;
185		break;
186#else
187		return (_POSIX_ASYNCHRONOUS_IO);
188#endif
189	case _SC_MAPPED_FILES:
190		return (_POSIX_MAPPED_FILES);
191	case _SC_MEMLOCK:
192		return (_POSIX_MEMLOCK);
193	case _SC_MEMLOCK_RANGE:
194		return (_POSIX_MEMLOCK_RANGE);
195	case _SC_MEMORY_PROTECTION:
196		return (_POSIX_MEMORY_PROTECTION);
197	case _SC_MESSAGE_PASSING:
198#if _POSIX_MESSAGE_PASSING == 0
199		mib[0] = CTL_P1003_1B;
200		mib[1] = CTL_P1003_1B_MESSAGE_PASSING;
201		goto yesno;
202#else
203		return (_POSIX_MESSAGE_PASSING);
204#endif
205	case _SC_PRIORITIZED_IO:
206#if _POSIX_PRIORITIZED_IO == 0
207		mib[0] = CTL_P1003_1B;
208		mib[1] = CTL_P1003_1B_PRIORITIZED_IO;
209		goto yesno;
210#else
211		return (_POSIX_PRIORITIZED_IO);
212#endif
213	case _SC_PRIORITY_SCHEDULING:
214#if _POSIX_PRIORITY_SCHEDULING == 0
215		mib[0] = CTL_P1003_1B;
216		mib[1] = CTL_P1003_1B_PRIORITY_SCHEDULING;
217		goto yesno;
218#else
219		return (_POSIX_PRIORITY_SCHEDULING);
220#endif
221	case _SC_REALTIME_SIGNALS:
222#if _POSIX_REALTIME_SIGNALS == 0
223		mib[0] = CTL_P1003_1B;
224		mib[1] = CTL_P1003_1B_REALTIME_SIGNALS;
225		goto yesno;
226#else
227		return (_POSIX_REALTIME_SIGNALS);
228#endif
229	case _SC_SEMAPHORES:
230#if _POSIX_SEMAPHORES == 0
231		mib[0] = CTL_P1003_1B;
232		mib[1] = CTL_P1003_1B_SEMAPHORES;
233		goto yesno;
234#else
235		return (_POSIX_SEMAPHORES);
236#endif
237	case _SC_FSYNC:
238		return (_POSIX_FSYNC);
239
240	case _SC_SHARED_MEMORY_OBJECTS:
241		return (_POSIX_SHARED_MEMORY_OBJECTS);
242	case _SC_SYNCHRONIZED_IO:
243#if _POSIX_SYNCHRONIZED_IO == 0
244		mib[0] = CTL_P1003_1B;
245		mib[1] = CTL_P1003_1B_SYNCHRONIZED_IO;
246		goto yesno;
247#else
248		return (_POSIX_SYNCHRONIZED_IO);
249#endif
250	case _SC_TIMERS:
251#if _POSIX_TIMERS == 0
252		mib[0] = CTL_P1003_1B;
253		mib[1] = CTL_P1003_1B_TIMERS;
254		goto yesno;
255#else
256		return (_POSIX_TIMERS);
257#endif
258	case _SC_AIO_LISTIO_MAX:
259		mib[0] = CTL_P1003_1B;
260		mib[1] = CTL_P1003_1B_AIO_LISTIO_MAX;
261		break;
262	case _SC_AIO_MAX:
263		mib[0] = CTL_P1003_1B;
264		mib[1] = CTL_P1003_1B_AIO_MAX;
265		break;
266	case _SC_AIO_PRIO_DELTA_MAX:
267		mib[0] = CTL_P1003_1B;
268		mib[1] = CTL_P1003_1B_AIO_PRIO_DELTA_MAX;
269		break;
270	case _SC_DELAYTIMER_MAX:
271		mib[0] = CTL_P1003_1B;
272		mib[1] = CTL_P1003_1B_DELAYTIMER_MAX;
273		goto yesno;
274	case _SC_MQ_OPEN_MAX:
275		mib[0] = CTL_P1003_1B;
276		mib[1] = CTL_P1003_1B_MQ_OPEN_MAX;
277		goto yesno;
278	case _SC_PAGESIZE:
279		defaultresult = getpagesize();
280		mib[0] = CTL_P1003_1B;
281		mib[1] = CTL_P1003_1B_PAGESIZE;
282		goto yesno;
283	case _SC_RTSIG_MAX:
284		mib[0] = CTL_P1003_1B;
285		mib[1] = CTL_P1003_1B_RTSIG_MAX;
286		goto yesno;
287	case _SC_SEM_NSEMS_MAX:
288		mib[0] = CTL_P1003_1B;
289		mib[1] = CTL_P1003_1B_SEM_NSEMS_MAX;
290		goto yesno;
291	case _SC_SEM_VALUE_MAX:
292		mib[0] = CTL_P1003_1B;
293		mib[1] = CTL_P1003_1B_SEM_VALUE_MAX;
294		goto yesno;
295	case _SC_SIGQUEUE_MAX:
296		mib[0] = CTL_P1003_1B;
297		mib[1] = CTL_P1003_1B_SIGQUEUE_MAX;
298		goto yesno;
299	case _SC_TIMER_MAX:
300		mib[0] = CTL_P1003_1B;
301		mib[1] = CTL_P1003_1B_TIMER_MAX;
302
303yesno:		if (sysctl(mib, 2, &value, &len, NULL, 0) == -1)
304			return (-1);
305		if (value == 0)
306			return (defaultresult);
307		return (value);
308
309	case _SC_2_PBS:
310	case _SC_2_PBS_ACCOUNTING:
311	case _SC_2_PBS_CHECKPOINT:
312	case _SC_2_PBS_LOCATE:
313	case _SC_2_PBS_MESSAGE:
314	case _SC_2_PBS_TRACK:
315#if _POSIX2_PBS == 0
316#error "don't know how to determine _SC_2_PBS"
317		/*
318		 * This probably requires digging through the filesystem
319		 * to see if the appropriate package has been installed.
320		 * Since we don't currently support this option at all,
321		 * it's not worth the effort to write the code now.
322		 * Figuring out which of the sub-options are supported
323		 * would be even more difficult, so it's probably easier
324		 * to always say ``no''.
325		 */
326#else
327		return (_POSIX2_PBS);
328#endif
329	case _SC_ADVISORY_INFO:
330#if _POSIX_ADVISORY_INFO == 0
331#error "_POSIX_ADVISORY_INFO"
332#else
333		return (_POSIX_ADVISORY_INFO);
334#endif
335	case _SC_BARRIERS:
336#if _POSIX_BARRIERS == 0
337#error "_POSIX_BARRIERS"
338#else
339		return (_POSIX_BARRIERS);
340#endif
341	case _SC_CLOCK_SELECTION:
342#if _POSIX_CLOCK_SELECTION == 0
343#error "_POSIX_CLOCK_SELECTION"
344#else
345		return (_POSIX_CLOCK_SELECTION);
346#endif
347	case _SC_CPUTIME:
348#if _POSIX_CPUTIME == 0
349#error "_POSIX_CPUTIME"
350#else
351		return (_POSIX_CPUTIME);
352#endif
353#ifdef notdef
354	case _SC_FILE_LOCKING:
355		/*
356		 * XXX - The standard doesn't tell us how to define
357		 * _POSIX_FILE_LOCKING, so we can't answer this one.
358		 */
359#endif
360#if _POSIX_THREAD_SAFE_FUNCTIONS > -1
361	case _SC_GETGR_R_SIZE_MAX:
362	case _SC_GETPW_R_SIZE_MAX:
363#error "somebody needs to implement this"
364#endif
365	case _SC_HOST_NAME_MAX:
366		return (MAXHOSTNAMELEN - 1); /* does not include \0 */
367	case _SC_LOGIN_NAME_MAX:
368		return (MAXLOGNAME);
369	case _SC_MONOTONIC_CLOCK:
370#if _POSIX_MONOTONIC_CLOCK == 0
371#error "_POSIX_MONOTONIC_CLOCK"
372#else
373		return (_POSIX_MONOTONIC_CLOCK);
374#endif
375#if _POSIX_MESSAGE_PASSING > -1
376	case _SC_MQ_PRIO_MAX:
377		return (MQ_PRIO_MAX);
378#endif
379	case _SC_READER_WRITER_LOCKS:
380		return (_POSIX_READER_WRITER_LOCKS);
381	case _SC_REGEXP:
382		return (_POSIX_REGEXP);
383	case _SC_SHELL:
384		return (_POSIX_SHELL);
385	case _SC_SPAWN:
386		return (_POSIX_SPAWN);
387	case _SC_SPIN_LOCKS:
388		return (_POSIX_SPIN_LOCKS);
389	case _SC_SPORADIC_SERVER:
390#if _POSIX_SPORADIC_SERVER == 0
391#error "_POSIX_SPORADIC_SERVER"
392#else
393		return (_POSIX_SPORADIC_SERVER);
394#endif
395	case _SC_THREAD_ATTR_STACKADDR:
396		return (_POSIX_THREAD_ATTR_STACKADDR);
397	case _SC_THREAD_ATTR_STACKSIZE:
398		return (_POSIX_THREAD_ATTR_STACKSIZE);
399	case _SC_THREAD_CPUTIME:
400		return (_POSIX_THREAD_CPUTIME);
401	case _SC_THREAD_DESTRUCTOR_ITERATIONS:
402		return (PTHREAD_DESTRUCTOR_ITERATIONS);
403	case _SC_THREAD_KEYS_MAX:
404		return (PTHREAD_KEYS_MAX);
405	case _SC_THREAD_PRIO_INHERIT:
406		return (_POSIX_THREAD_PRIO_INHERIT);
407	case _SC_THREAD_PRIO_PROTECT:
408		return (_POSIX_THREAD_PRIO_PROTECT);
409	case _SC_THREAD_PRIORITY_SCHEDULING:
410		return (_POSIX_THREAD_PRIORITY_SCHEDULING);
411	case _SC_THREAD_PROCESS_SHARED:
412		return (_POSIX_THREAD_PROCESS_SHARED);
413	case _SC_THREAD_SAFE_FUNCTIONS:
414		return (_POSIX_THREAD_SAFE_FUNCTIONS);
415	case _SC_THREAD_STACK_MIN:
416		return (PTHREAD_STACK_MIN);
417	case _SC_THREAD_THREADS_MAX:
418		return (PTHREAD_THREADS_MAX); /* XXX wrong type! */
419	case _SC_TIMEOUTS:
420		return (_POSIX_TIMEOUTS);
421	case _SC_THREADS:
422		return (_POSIX_THREADS);
423	case _SC_TRACE:
424#if _POSIX_TRACE == 0
425#error "_POSIX_TRACE"
426		/* While you're implementing this, also do the ones below. */
427#else
428		return (_POSIX_TRACE);
429#endif
430#if _POSIX_TRACE > -1
431	case _SC_TRACE_EVENT_FILTER:
432		return (_POSIX_TRACE_EVENT_FILTER);
433	case _SC_TRACE_INHERIT:
434		return (_POSIX_TRACE_INHERIT);
435	case _SC_TRACE_LOG:
436		return (_POSIX_TRACE_LOG);
437#endif
438	case _SC_TTY_NAME_MAX:
439		path = _PATH_DEV;
440		goto do_NAME_MAX;
441	case _SC_TYPED_MEMORY_OBJECTS:
442#if _POSIX_TYPED_MEMORY_OBJECTS == 0
443#error "_POSIX_TYPED_MEMORY_OBJECTS"
444#else
445		return (_POSIX_TYPED_MEMORY_OBJECTS);
446#endif
447	case _SC_V6_ILP32_OFF32:
448#if _V6_ILP32_OFF32 == 0
449		if (sizeof(int) * CHAR_BIT == 32 &&
450		    sizeof(int) == sizeof(long) &&
451		    sizeof(long) == sizeof(void *) &&
452		    sizeof(void *) == sizeof(off_t))
453			return 1;
454		else
455			return -1;
456#else
457		return (_V6_ILP32_OFF32);
458#endif
459	case _SC_V6_ILP32_OFFBIG:
460#if _V6_ILP32_OFFBIG == 0
461		if (sizeof(int) * CHAR_BIT == 32 &&
462		    sizeof(int) == sizeof(long) &&
463		    sizeof(long) == sizeof(void *) &&
464		    sizeof(off_t) * CHAR_BIT >= 64)
465			return 1;
466		else
467			return -1;
468#else
469		return (_V6_ILP32_OFFBIG);
470#endif
471	case _SC_V6_LP64_OFF64:
472#if _V6_LP64_OFF64 == 0
473		if (sizeof(int) * CHAR_BIT == 32 &&
474		    sizeof(long) * CHAR_BIT == 64 &&
475		    sizeof(long) == sizeof(void *) &&
476		    sizeof(void *) == sizeof(off_t))
477			return 1;
478		else
479			return -1;
480#else
481		return (_V6_LP64_OFF64);
482#endif
483	case _SC_V6_LPBIG_OFFBIG:
484#if _V6_LPBIG_OFFBIG == 0
485		if (sizeof(int) * CHAR_BIT >= 32 &&
486		    sizeof(long) * CHAR_BIT >= 64 &&
487		    sizeof(void *) * CHAR_BIT >= 64 &&
488		    sizeof(off_t) * CHAR_BIT >= 64)
489			return 1;
490		else
491			return -1;
492#else
493		return (_V6_LPBIG_OFFBIG);
494#endif
495	case _SC_ATEXIT_MAX:
496		return (ATEXIT_SIZE);
497	case _SC_IOV_MAX:
498		mib[0] = CTL_KERN;
499		mib[1] = KERN_IOV_MAX;
500		break;
501	case _SC_XOPEN_CRYPT:
502		return (_XOPEN_CRYPT);
503	case _SC_XOPEN_ENH_I18N:
504		return (_XOPEN_ENH_I18N);
505	case _SC_XOPEN_LEGACY:
506		return (_XOPEN_LEGACY);
507	case _SC_XOPEN_REALTIME:
508#if _XOPEN_REALTIME == 0
509		sverrno = errno;
510		value = sysconf(_SC_ASYNCHRONOUS_IO) > 0 &&
511			sysconf(_SC_MEMLOCK) > 0 &&
512			sysconf(_SC_MEMLOCK_RANGE) > 0 &&
513			sysconf(_SC_MESSAGE_PASSING) > 0 &&
514			sysconf(_SC_PRIORITY_SCHEDULING) > 0 &&
515			sysconf(_SC_REALTIME_SIGNALS) > 0 &&
516			sysconf(_SC_SEMAPHORES) > 0 &&
517			sysconf(_SC_SHARED_MEMORY_OBJECTS) > 0 &&
518			sysconf(_SC_SYNCHRONIZED_IO) > 0 &&
519			sysconf(_SC_TIMERS) > 0;
520		errno = sverrno;
521		if (value)
522			return (200112L);
523		else
524			return (-1);
525#else
526		return (_XOPEN_REALTIME);
527#endif
528	case _SC_XOPEN_REALTIME_THREADS:
529#if _XOPEN_REALTIME_THREADS == 0
530#error "_XOPEN_REALTIME_THREADS"
531#else
532		return (_XOPEN_REALTIME_THREADS);
533#endif
534	case _SC_XOPEN_SHM:
535		sverrno = errno;
536		if (sysctlbyname("kern.ipc.shmmin", &value, &len, NULL,
537		    0) == -1) {
538			errno = sverrno;
539			return (-1);
540		}
541		errno = sverrno;
542		return (1);
543	case _SC_XOPEN_STREAMS:
544		return (_XOPEN_STREAMS);
545	case _SC_XOPEN_UNIX:
546		return (_XOPEN_UNIX);
547#ifdef _XOPEN_VERSION
548	case _SC_XOPEN_VERSION:
549		return (_XOPEN_VERSION);
550#endif
551#ifdef _XOPEN_XCU_VERSION
552	case _SC_XOPEN_XCU_VERSION:
553		return (_XOPEN_XCU_VERSION);
554#endif
555	case _SC_SYMLOOP_MAX:
556		return (MAXSYMLINKS);
557	case _SC_RAW_SOCKETS:
558		return (_POSIX_RAW_SOCKETS);
559	case _SC_IPV6:
560#if _POSIX_IPV6 == 0
561		sverrno = errno;
562		value = socket(PF_INET6, SOCK_DGRAM, 0);
563		errno = sverrno;
564		if (value >= 0) {
565			close(value);
566			return (200112L);
567		} else
568			return (0);
569#else
570		return (_POSIX_IPV6);
571#endif
572
573	case _SC_NPROCESSORS_CONF:
574	case _SC_NPROCESSORS_ONLN:
575		mib[0] = CTL_HW;
576		mib[1] = HW_NCPU;
577		break;
578
579#ifdef _SC_PHYS_PAGES
580	case _SC_PHYS_PAGES:
581		sname = "hw.availpages";
582		break;
583#endif
584
585	default:
586		errno = EINVAL;
587		return (-1);
588	}
589	if (sname == NULL) {
590		if (sysctl(mib, 2, &value, &len, NULL, 0) == -1)
591			value = -1;
592	} else {
593		if (sysctlbyname(sname, &value, &len, NULL, 0) == -1)
594			value = -1;
595	}
596	return (value);
597}
598