Blame nfs4_getfacl/nfs4_getfacl.c

Packit b0b924
/*  Copyright (c) 2002, 2003, 2006 The Regents of the University of Michigan.
Packit b0b924
 *  All rights reserved.
Packit b0b924
 *
Packit b0b924
 *  Andy Adamson <andros@citi.umich.edu>
Packit b0b924
 *  David M. Richter <richterd@citi.umich.edu>
Packit b0b924
 *  Alexis Mackenzie <allamack@citi.umich.edu>
Packit b0b924
 *  Alex Soule <soule@umich.edu>
Packit b0b924
 *
Packit b0b924
 *  Redistribution and use in source and binary forms, with or without
Packit b0b924
 *  modification, are permitted provided that the following conditions
Packit b0b924
 *  are met:
Packit b0b924
 *
Packit b0b924
 *  1. Redistributions of source code must retain the above copyright
Packit b0b924
 *     notice, this list of conditions and the following disclaimer.
Packit b0b924
 *  2. Redistributions in binary form must reproduce the above copyright
Packit b0b924
 *     notice, this list of conditions and the following disclaimer in the
Packit b0b924
 *     documentation and/or other materials provided with the distribution.
Packit b0b924
 *  3. Neither the name of the University nor the names of its
Packit b0b924
 *     contributors may be used to endorse or promote products derived
Packit b0b924
 *     from this software without specific prior written permission.
Packit b0b924
 *
Packit b0b924
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Packit b0b924
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Packit b0b924
 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Packit b0b924
 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Packit b0b924
 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit b0b924
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit b0b924
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Packit b0b924
 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Packit b0b924
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Packit b0b924
 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Packit b0b924
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit b0b924
 */
Packit b0b924
Packit b0b924
Packit b0b924
#include <stdio.h>
Packit b0b924
#include <errno.h>
Packit b0b924
#include <string.h>
Packit b0b924
#include <sys/types.h>
Packit b0b924
#include <libgen.h>
Packit b0b924
#include "libacl_nfs4.h"
Packit b0b924
#include <ftw.h>
Packit b0b924
#include <getopt.h>
Packit b0b924
Packit b0b924
static void usage(int);
Packit b0b924
static void more_help();
Packit b0b924
static char *execname;
Packit b0b924
static void print_acl_from_path();
Packit Service 42d24d
static int ignore_comment = 0;
Packit b0b924
Packit b0b924
static int recursive(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf)
Packit b0b924
{
Packit b0b924
	print_acl_from_path(fpath);
Packit b0b924
	return 0;
Packit b0b924
}
Packit b0b924
Packit b0b924
static struct option long_options[] = {
Packit b0b924
        {"more-help",    0, 0, 'H' },
Packit b0b924
        {"help",         0, 0, 'h' },
Packit b0b924
        {"recursive",     0, 0, 'R' },
Packit Service 42d24d
        {"omit-header",  0, 0, 'c'},
Packit b0b924
        { NULL,          0, 0, 0,  },
Packit b0b924
};
Packit b0b924
Packit b0b924
int main(int argc, char **argv)
Packit b0b924
{
Packit b0b924
	int opt, res = 1;
Packit b0b924
        int do_recursive = 0;
Packit b0b924
	
Packit b0b924
	execname = basename(argv[0]);
Packit b0b924
Packit b0b924
	if (argc < 2) {
Packit b0b924
		fprintf(stderr, "%s: you must specify a path.\n", execname);
Packit b0b924
		usage(0);
Packit b0b924
		goto out;
Packit b0b924
	}
Packit b0b924
Packit Service 42d24d
	while ((opt = getopt_long(argc, argv, "HR?hc", long_options, NULL)) != -1) {
Packit b0b924
		switch(opt) {
Packit b0b924
			case 'H':
Packit b0b924
				more_help();
Packit b0b924
				res = 0;
Packit b0b924
				goto out;
Packit b0b924
Packit b0b924
			case 'R':
Packit b0b924
				do_recursive = 1;
Packit b0b924
				break;
Packit Service 42d24d
			case 'c':
Packit Service 42d24d
				ignore_comment = 1;
Packit Service 42d24d
				break;
Packit b0b924
			default:
Packit b0b924
				usage(1);
Packit b0b924
				res = 0;
Packit b0b924
				goto out;
Packit b0b924
		}
Packit b0b924
	}
Packit b0b924
Packit b0b924
	if (optind >= argc) {
Packit b0b924
		fprintf(stderr, "%s: you must specify a path after options.\n", execname);
Packit b0b924
		usage(0);
Packit b0b924
		goto out;
Packit b0b924
	}
Packit b0b924
Packit b0b924
	for(; optind < argc; optind++) {
Packit b0b924
		if(do_recursive) {
Packit b0b924
			if (nftw(argv[optind], recursive, 20, 0) == -1)
Packit b0b924
				printf("Invalid filename: %s\n", argv[optind]);
Packit b0b924
		}
Packit b0b924
		else
Packit b0b924
			print_acl_from_path(argv[optind]);
Packit b0b924
		res = 0;
Packit b0b924
	}
Packit b0b924
out:
Packit b0b924
	return res;
Packit b0b924
}
Packit b0b924
Packit b0b924
static void print_acl_from_path(const char *fpath)
Packit b0b924
{
Packit b0b924
	struct nfs4_acl *acl;
Packit b0b924
	acl = nfs4_acl_for_path(fpath);
Packit b0b924
	if (acl != NULL) {
Packit Service 42d24d
		if (ignore_comment == 0)
Packit Service 42d24d
			printf("# file: %s\n", fpath);
Packit b0b924
		nfs4_print_acl(stdout, acl);
Packit Service 42d24d
		printf("\n");
Packit b0b924
		nfs4_free_acl(acl);
Packit b0b924
	}
Packit b0b924
}
Packit b0b924
Packit b0b924
static void usage(int label)
Packit b0b924
{
Packit b0b924
	if (label)
Packit b0b924
		fprintf(stderr, "%s %s -- get NFSv4 file or directory access control lists.\n", execname, VERSION);
Packit Service 42d24d
	fprintf(stderr, "Usage: %s [-R] file ...\n  -H, --more-help\tdisplay ACL format information\n  -?, -h, --help\tdisplay this help text\n  -R --recursive\trecurse into subdirectories\n  -c, --omit-header\tDo not display the comment header (Do not print filename)\n", execname);
Packit b0b924
}
Packit b0b924
Packit b0b924
static void more_help()
Packit b0b924
{
Packit b0b924
	const char *info = \
Packit b0b924
	"%s %s -- get NFSv4 file or directory access control lists.\n\n"
Packit b0b924
	"An NFSv4 ACL consists of one or more NFSv4 ACEs, each delimited by commas or whitespace.\n"
Packit b0b924
	"An NFSv4 ACE is written as a colon-delimited, 4-field string in the following format:\n"
Packit b0b924
	"\n"
Packit b0b924
	"    <type>:<flags>:<principal>:<permissions>\n"
Packit b0b924
	"\n"
Packit b0b924
	"    * <type> - one of:\n"
Packit b0b924
	"        'A'  allow\n"
Packit b0b924
	"        'D'  deny\n"
Packit b0b924
	"        'U'  audit\n"
Packit b0b924
	"        'L'  alarm\n"
Packit b0b924
	"\n"
Packit b0b924
	"    * <flags> - zero or more (depending on <type>) of:\n"
Packit b0b924
	"        'f'  file-inherit\n"
Packit b0b924
	"        'd'  directory-inherit\n"
Packit b0b924
	"        'p'  no-propagate-inherit\n"
Packit b0b924
	"        'i'  inherit-only\n"
Packit b0b924
	"        'S'  successful-access\n"
Packit b0b924
	"        'F'  failed-access\n"
Packit b0b924
	"        'g'  group (denotes that <principal> is a group)\n"
Packit b0b924
	"\n"
Packit b0b924
	"    * <principal> - named user or group, or one of: \"OWNER@\", \"GROUP@\", \"EVERYONE@\"\n"
Packit b0b924
	"\n"
Packit b0b924
	"    * <permissions> - one or more of:\n"
Packit b0b924
	"        'r'  read-data / list-directory \n"
Packit b0b924
	"        'w'  write-data / create-file \n"
Packit b0b924
	"        'a'  append-data / create-subdirectory \n"
Packit b0b924
	"        'x'  execute \n"
Packit b0b924
	"        'd'  delete\n"
Packit b0b924
	"        'D'  delete-child (directories only)\n"
Packit b0b924
	"        't'  read-attrs\n"
Packit b0b924
	"        'T'  write-attrs\n"
Packit b0b924
	"        'n'  read-named-attrs\n"
Packit b0b924
	"        'N'  write-named-attrs\n"
Packit b0b924
	"        'c'  read-ACL\n"
Packit b0b924
	"        'C'  write-ACL\n"
Packit b0b924
	"        'o'  write-owner\n"
Packit b0b924
	"        'y'  synchronize\n"
Packit b0b924
	"\n"
Packit b0b924
	"For more information and examples, please refer to the nfs4_acl(5) manpage.\n";
Packit b0b924
Packit b0b924
	printf(info, execname, VERSION); 
Packit b0b924
}