⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cap_alloc.c

📁 ProFTPd 是一款基于GPL协议的可配置的FTP服务器
💻 C
字号:
/* * $Id: cap_alloc.c,v 1.2 2003/05/15 00:49:13 castaglia Exp $ * * Copyright (c) 1997-8 Andrew G Morgan <morgan@linux.kernel.org> * * See end of file for Log. * * This file deals with allocation and deallocation of internal * capability sets as specified by POSIX.1e (formerlly, POSIX 6). */#include "libcap.h"/* * This function duplicates an internal capability set (x3) with * Obtain a blank set of capabilities */cap_t cap_init(void){    __u32 *raw_data;    cap_t result;    raw_data = malloc( sizeof(__u32) + sizeof(*result) );    if (raw_data == NULL) {       _cap_debug("out of memory");       errno = ENOMEM;       return NULL;    }    *raw_data = CAP_T_MAGIC;    result = (cap_t) (raw_data + 1);    memset(result, 0, sizeof(*result));    result->head.version = _LINUX_CAPABILITY_VERSION;    return result;}/* * This is an internal library function to duplicate a string and * tag the result as something cap_free can handle. */char *_libcap_strdup(const char *old){    __u32 *raw_data;    if (old == NULL) {       errno = EINVAL;       return NULL;    }    raw_data = malloc( sizeof(__u32) + strlen(old) + 1 );    if (raw_data == NULL) {       errno = ENOMEM;       return NULL;    }    *(raw_data++) = CAP_S_MAGIC;    strcpy((char *) raw_data, old);    return ((char *) raw_data);}/* * This function duplicates an internal capability set with * malloc()'d memory. It is the responsibility of the user to call * cap_free() to liberate it. */cap_t cap_dup(cap_t cap_d){    cap_t result;    if (!good_cap_t(cap_d)) {	_cap_debug("bad argument");	errno = EINVAL;	return NULL;    }    result = cap_init();    if (result == NULL) {	_cap_debug("out of memory");	return NULL;    }    memcpy(result, cap_d, sizeof(*cap_d));    return result;}/* * Scrub and then liberate an internal capability set. */int cap_free(void *data_p){    if ( good_cap_t(data_p) ) {        data_p = -1 + (__u32 *) data_p;        memset(data_p, 0, sizeof(__u32) + sizeof(struct _cap_struct));        free(data_p);        data_p = NULL;        return 0;    }    if ( good_cap_string(data_p) ) {        int length = strlen(data_p) + sizeof(__u32);        data_p = -1 + (__u32 *) data_p;        memset(data_p, 0, length);        free(data_p);        data_p = NULL;        return 0;    }    _cap_debug("don't recognize what we're supposed to liberate");    errno = EINVAL;    return -1;}/* * $Log: cap_alloc.c,v $ * Revision 1.2  2003/05/15 00:49:13  castaglia * * Bug#2000 - mod_cap should not use bundled libcap.  This patch updates the * bundled libcap; I won't be closing the bug report just yet. * * Revision 1.1  2003/01/03 02:16:17  jwm * * Turning mod_linuxprivs into a core module, mod_cap. This is by no means * complete. * * Revision 1.2  1999/09/07 23:14:19  macgyver * Updated capabilities library and model. * * Revision 1.1.1.1  1999/04/17 22:16:31  morgan * release 1.0 of libcap * * 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 * fixes and zefram's patches * * Revision 1.1  1997/04/21 04:32:52  morgan * Initial revision * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -