blob: bc1d30b638f2b128ea88b16dcd71cb7462893b41 [file] [log] [blame]
/* lib_test.c -- simple libcap-ng test suite
* Copyright 2009,2012 Red Hat Inc., Durham, North Carolina.
* All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Authors:
* Steve Grubb <sgrubb@redhat.com>
*/
#include "config.h"
#include "../cap-ng.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
int rc, i, len, last = CAP_LAST_CAP;
char *text;
void *saved;
puts("Doing basic bit tests...");
capng_clear(CAPNG_SELECT_BOTH);
if (capng_have_capabilities(CAPNG_SELECT_BOTH) != CAPNG_NONE) {
puts("Failed clearing capabilities");
abort();
}
saved = capng_save_state();
capng_fill(CAPNG_SELECT_BOTH);
if (capng_have_capabilities(CAPNG_SELECT_BOTH) != CAPNG_FULL) {
puts("Failed filling capabilities");
abort();
}
// Need to detect if version 1 or 2 capabilities
text = capng_print_caps_numeric(CAPNG_PRINT_BUFFER, CAPNG_SELECT_CAPS);
len = strlen(text);
free(text);
if (len < 80 && last > 30) // The kernel & headers are mismatched
last = 30;
// Now test that restore still works
capng_restore_state(&saved);
if (capng_have_capabilities(CAPNG_SELECT_BOTH) != CAPNG_NONE) {
puts("Failed restoring capabilities");
abort();
}
printf("Doing advanced bit tests for %d capabilities...\n", last);
for (i=0; i<=last; i++) {
const char *name;
capng_clear(CAPNG_SELECT_BOTH);
rc = capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, i);
if (rc) {
puts("Failed update test 1");
abort();
}
rc = capng_have_capability(CAPNG_EFFECTIVE, i);
if (rc == 0) {
puts("Failed have capability test 1");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_CAPS);
abort();
}
if(capng_have_capabilities(CAPNG_SELECT_CAPS)!=CAPNG_PARTIAL){
puts("Failed have capabilities test 1");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_CAPS);
abort();
}
#if CAP_LAST_CAP > 31
rc = capng_update(CAPNG_ADD, CAPNG_BOUNDING_SET, i);
if (rc) {
puts("Failed bset update test 2");
abort();
}
rc = capng_have_capability(CAPNG_BOUNDING_SET, i);
if (rc == 0) {
puts("Failed bset have capability test 2");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_BOTH);
abort();
}
if(capng_have_capabilities(CAPNG_SELECT_BOUNDS)!=CAPNG_PARTIAL){
puts("Failed bset have capabilities test 2");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_BOTH);
abort();
}
#endif
text=capng_print_caps_text(CAPNG_PRINT_BUFFER, CAPNG_EFFECTIVE);
if (text == NULL) {
puts("Failed getting print text to buffer");
abort();
}
name = capng_capability_to_name(i);
if (name == NULL) {
printf("Failed converting capability %d to name\n", i);
abort();
}
if (strcmp(text, name)) {
puts("Failed print text comparison");
printf("%s != %s\n", text, name);
abort();
}
free(text);
// Now make sure the mask part is working
capng_fill(CAPNG_SELECT_BOTH);
rc = capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, i);
if (rc) {
puts("Failed update test 3");
abort();
}
// Should be partial
if(capng_have_capabilities(CAPNG_SELECT_CAPS)!=CAPNG_PARTIAL){
puts("Failed have capabilities test 3");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_CAPS);
abort();
}
// Add back the bit and should be full capabilities
rc = capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, i);
if (rc) {
puts("Failed update test 4");
abort();
}
if (capng_have_capabilities(CAPNG_SELECT_CAPS) != CAPNG_FULL){
puts("Failed have capabilities test 4");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_CAPS);
abort();
}
}
// Now test the updatev function
capng_clear(CAPNG_SELECT_BOTH);
rc = capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE,
CAP_CHOWN, CAP_FOWNER, CAP_KILL, -1);
if (rc) {
puts("Failed updatev test");
abort();
}
rc = capng_have_capability(CAPNG_EFFECTIVE, CAP_CHOWN) &&
capng_have_capability(CAPNG_EFFECTIVE, CAP_FOWNER) &&
capng_have_capability(CAPNG_EFFECTIVE, CAP_KILL);
if (rc == 0) {
puts("Failed have updatev capability test");
capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
CAPNG_SELECT_CAPS);
abort();
}
return EXIT_SUCCESS;
}