File: setcap.c

package info (click to toggle)
libcap 1.92-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 312 kB
  • ctags: 172
  • sloc: ansic: 1,294; makefile: 152; sh: 5
file content (119 lines) | stat: -rw-r--r-- 2,060 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 * $Id: setcap.c,v 1.1.2.1 1999/04/23 05:00:31 morgan Exp $
 *
 * Copyright (c) 1997 Andrew G. Morgan  <morgan@ftp.kernel.org>
 *
 * This sets the capabilities of a given file.
 */

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/capability.h>
#include <unistd.h>

static void usage(void)
{
    fprintf(stderr,
	    "usage: setcap [-q] (-|<caps>) <filename> "
	    "[ ... (-|<capsN>) <filenameN> ]\n"
	);
    exit(1);
}

#define MAXCAP  2048

static int read_caps(int quiet, const char *filename, char *buffer)
{
    int i=MAXCAP;

    if (!quiet) {
	fprintf(stderr,	"Please enter caps for file [empty line to end]:\n");
    }
    while (i > 0) {
	int j = read(STDIN_FILENO, buffer, i);

	if (j < 0) {
	    fprintf(stderr, "\n[Error - aborting]\n");
	    exit(1);
	}

	if (j==0 || buffer[0] == '\n') {
	    /* we're done */
	    break;
	}

	/* move on... */

	i -= j;
	buffer += j;
    }

    /* <NUL> terminate */
    buffer[0] = '\0';

    return (i < MAXCAP ? 0:-1);
}

int main(int argc, char **argv)
{
    char buffer[MAXCAP+1];
    int retval, quiet=0;
    cap_t cap_d;

    if (argc < 3) {
	usage();
    }

    while (--argc > 0) {
	const char *text;

	if (!strcmp(*++argv,"-q")) {
	    quiet = 1;
	    continue;
	}
	if (!strcmp(*argv,"-")) {
	    retval = read_caps(quiet, *argv, buffer);
	    if (retval)
		usage();
	    text = buffer;
	} else
	    text = *argv;

	cap_d = cap_from_text(text);
	if (cap_d == NULL) {
	    perror("fatal error");
	    usage();
	}
#ifdef DEBUG
	{
	    ssize_t length;
	    const char *result;

	    result = cap_to_text(cap_d, &length);
	    fprintf(stderr, "[caps set to:\n%s\n]\n", result);
	}
#endif

	if (--argc <= 0)
	    usage();

	retval = cap_set_file(*++argv, cap_d);

	if (retval != 0) {
	    fprintf(stderr,
		    "Failed to set capabilities on file `%s'\n"
		    " (%s)\n", argv[0], strerror(errno));
	    usage();
	}
    }

    return 0;
}

/*
 * $Log: setcap.c,v $
 * Revision 1.1.2.1  1999/04/23 05:00:31  morgan
 * resurecting from the dead for kernels with fcap support
 *
 */