blob: eff5f8b8dd6be2d0e2ea43863a30c72ed2cce8a8 [file] [log] [blame]
/*
* $Id: libcap.h,v 1.5 1999/11/18 07:23:24 morgan Exp $
*
* Copyright (c) 1997 Andrew G Morgan <morgan@linux.kernel.org>
*
* See end of file for Log.
*
* This file contains internal definitions for the various functions in
* this small capability library.
*/
#ifndef LIBCAP_H
#define LIBCAP_H
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/capability.h>
#ifndef __u8
#define __u8 unsigned char
#endif /* __8 */
#ifndef __u32
#define __u32 unsigned int
#endif /* __u32 */
/* include the names for the caps and a definition of __CAP_BITS */
#include "cap_names.h"
/*
* This is a pointer to a struct containing three consecutive
* capability sets in the order of the cap_flag_t type: the are
* effective,inheritable and permitted. This is the type that the
* user-space routines think of as 'internal' capabilities - this is
* the type that is passed to the kernel with the system calls related
* to processes.
*/
#define CAP_T_MAGIC 0xCA90D0
struct _cap_struct {
struct __user_cap_header_struct head;
struct __user_cap_data_struct set;
};
/* string magic for cap_free */
#define CAP_S_MAGIC 0xCA95D0
/*
* Do we match the local kernel?
*/
#if !defined(_LINUX_CAPABILITY_VERSION) || \
(_LINUX_CAPABILITY_VERSION != 0x19980330)
# error "Kernel <linux/capability.h> does not match library"
# error "file "libcap.h" --> fix and recompile libcap"
#endif
/*
* kernel API cap set abstraction
*/
#define NUMBER_OF_CAP_SETS 3 /* effective, inheritable, permitted */
#define CAP_SET_SIZE (sizeof(struct __user_cap_data_struct)/NUMBER_OF_CAP_SETS)
#define __CAP_BLKS (CAP_SET_SIZE/sizeof(__u32))
typedef struct {
__u32 _blk[__CAP_BLKS];
} __cap_s;
#define raise_cap(x) _blk[(x)>>5] |= (1<<((x)&31))
#define lower_cap(x) _blk[(x)>>5] &= ~(1<<((x)&31))
#define isset_cap(y,x) ((y)->_blk[(x)>>5] & (1<<((x)&31)))
/*
* Private definitions for internal use by the library.
*/
#define __libcap_check_magic(c,magic) ((c) && *(-1+(__u32 *)(c)) == (magic))
#define good_cap_t(c) __libcap_check_magic(c, CAP_T_MAGIC)
#define good_cap_string(c) __libcap_check_magic(c, CAP_S_MAGIC)
/*
* library debugging
*/
#ifdef DEBUG
#include <stdio.h>
# define _cap_debug(f, x...) { \
fprintf(stderr, __FUNCTION__ "(" __FILE__ ":%d): ", __LINE__); \
fprintf(stderr, f, ## x); \
fprintf(stderr, "\n"); \
}
# define _cap_debugcap(s, c) \
fprintf(stderr, __FUNCTION__ "(" __FILE__ ":%d): " s \
"%08x\n", __LINE__, *(c))
#else /* !DEBUG */
# define _cap_debug(f, x...)
# define _cap_debugcap(s, c)
#endif /* DEBUG */
extern char *_libcap_strdup(const char *text);
/*
* These are semi-public prototypes, they will only be defined in
* <sys/capability.h> if _POSIX_SOURCE is not #define'd, so we
* place them here too.
*/
extern int capset(cap_user_header_t header, cap_user_data_t data);
extern int capget(cap_user_header_t header, const cap_user_data_t data);
extern int capgetp(pid_t pid, cap_t cap_d);
extern int capsetp(pid_t pid, cap_t cap_d);
#endif /* LIBCAP_H */
/*
* $Log: libcap.h,v $
* Revision 1.5 1999/11/18 07:23:24 morgan
* final fixes tested on a RH6.0 system for release-1.10
*
* Revision 1.4 1999/11/18 06:25:02 morgan
* added prototype for _libcap_strdup
*
* Revision 1.3 1999/11/18 06:03:26 morgan
* fixed cap_free to work as indicated in manuals
*
* Revision 1.2 1999/04/17 23:25:10 morgan
* fixes from peeterj
*
* Revision 1.1.1.1 1999/04/17 22:16:31 morgan
* release 1.0 of libcap
*
* Revision 1.5 1998/06/08 00:15:28 morgan
* accommodate alpha (glibc?)
*
* Revision 1.4 1998/06/07 15:58:23 morgan
* accommodate real kernel header files :*)
*
* Revision 1.3 1998/05/24 22:54:09 morgan
* updated for 2.1.104
*
* Revision 1.2 1997/04/28 00:57:11 morgan
* zefram's replacement file with a number of bug fixes from AGM
*
* Revision 1.1 1997/04/21 04:32:52 morgan
* Initial revision
*
*/