diff options
Diffstat (limited to 'usr/src/lib/libproc/common/Putil.c')
-rw-r--r-- | usr/src/lib/libproc/common/Putil.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/usr/src/lib/libproc/common/Putil.c b/usr/src/lib/libproc/common/Putil.c new file mode 100644 index 0000000000..7e06c14f67 --- /dev/null +++ b/usr/src/lib/libproc/common/Putil.c @@ -0,0 +1,152 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 1998-2001 by Sun Microsystems, Inc. + * All rights reserved. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <limits.h> +#include <string.h> +#include <stdarg.h> +#include <stdio.h> +#include <errno.h> + +#include "Pcontrol.h" +#include "Putil.h" + +/* + * Place the new element on the list prior to the existing element. + */ +void +list_link(void *new, void *existing) +{ + list_t *p = new; + list_t *q = existing; + + if (q) { + p->list_forw = q; + p->list_back = q->list_back; + q->list_back->list_forw = p; + q->list_back = p; + } else { + p->list_forw = p->list_back = p; + } +} + +/* + * Unchain the specified element from a list. + */ +void +list_unlink(void *old) +{ + list_t *p = old; + + if (p->list_forw != p) { + p->list_back->list_forw = p->list_forw; + p->list_forw->list_back = p->list_back; + } + p->list_forw = p->list_back = p; +} + +/* + * Routines to manipulate sigset_t, fltset_t, or sysset_t. These routines + * are provided as equivalents for the <sys/procfs.h> macros prfillset, + * premptyset, praddset, and prdelset. These functions are preferable + * because they are not macros which rely on using sizeof (*sp), and thus + * can be used to create common code to manipulate event sets. The set + * size must be passed explicitly, e.g. : prset_fill(&set, sizeof (set)); + */ +void +prset_fill(void *sp, size_t size) +{ + size_t i = size / sizeof (uint32_t); + + while (i != 0) + ((uint32_t *)sp)[--i] = (uint32_t)0xFFFFFFFF; +} + +void +prset_empty(void *sp, size_t size) +{ + size_t i = size / sizeof (uint32_t); + + while (i != 0) + ((uint32_t *)sp)[--i] = (uint32_t)0; +} + +void +prset_add(void *sp, size_t size, uint_t flag) +{ + if (flag - 1 < 32 * size / sizeof (uint32_t)) + ((uint32_t *)sp)[(flag - 1) / 32] |= 1U << ((flag - 1) % 32); +} + +void +prset_del(void *sp, size_t size, uint_t flag) +{ + if (flag - 1 < 32 * size / sizeof (uint32_t)) + ((uint32_t *)sp)[(flag - 1) / 32] &= ~(1U << ((flag - 1) % 32)); +} + +int +prset_ismember(void *sp, size_t size, uint_t flag) +{ + return ((flag - 1 < 32 * size / sizeof (uint32_t)) && + (((uint32_t *)sp)[(flag - 1) / 32] & (1U << ((flag - 1) % 32)))); +} + +/* + * If _libproc_debug is set, printf the debug message to stderr + * with an appropriate prefix. + */ +/*PRINTFLIKE1*/ +void +dprintf(const char *format, ...) +{ + if (_libproc_debug) { + va_list alist; + + va_start(alist, format); + (void) fputs("libproc DEBUG: ", stderr); + (void) vfprintf(stderr, format, alist); + va_end(alist); + } +} + +/* + * Printf-style error reporting function. This is used to supplement the error + * return codes from various libproc functions with additional text. Since we + * are a library, and should not be spewing messages to stderr, we provide a + * default version of this function that does nothing, but by calling this + * function we allow the client program to define its own version of the + * function that will interpose on our empty default. This may be useful for + * clients that wish to display such messages to the user. + */ +/*ARGSUSED*/ +/*PRINTFLIKE2*/ +void +Perror_printf(struct ps_prochandle *P, const char *format, ...) +{ + /* nothing to do here */ +} |