From c8f23c92177c5a82ab3699b1b0d4acbee9afb770 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 10 Jan 2014 10:07:41 -0500 Subject: [PATCH 13/34] modernize build system This deletes the hand rolled build system and replaces it entirely with autotools. The overall diffstat shows that this is a clear win, and it makes the package build/install like every other autotool package out there which makes the lives of distro maintainers a lot easier. This should also be faster by virtue of using a non-recursive build. Things to note: - to generate autotools: ./autogen.sh - to see full compile output: make V=1 - to build specific targets: make attr getfattr ... - to run tests: make check - to create a release: make distcheck -j Other non-developer things: - man pages are no longer compressed as this is uncommon in the autotools world and distros don't need it anyways (they already handle it automatically for most pakages) - the minor # of the shared library is now based on the package version so it'll be much bigger ... this isn't a problem, and is actually a bugfix (older releases didn't change when they should have) (Again, this is all using the standard autotool targets.) --- .gitignore | 48 +-- Makefile | 115 ------- Makefile.am | 32 ++ Makepkgs | 80 ----- VERSION | 7 - autogen.sh | 4 + chacl/Makefile | 35 --- chacl/chacl.c | 354 --------------------- configure.ac | 60 ++-- doc/Makefile | 42 --- doc/Makemodule.am | 10 + doc/TODO | 2 - examples/Makefile | 30 +- examples/Makefile.examples | 9 - examples/Makemodule.am | 7 + getfacl/Makefile | 36 --- getfacl/getfacl.c | 747 --------------------------------------------- getfacl/user_group.c | 59 ---- getfacl/user_group.h | 31 -- include/Makefile | 40 --- include/Makemodule.am | 10 + include/builddefs.in | 94 ------ include/buildmacros | 160 ---------- include/buildrules | 104 ------- include/config.h.in | 46 --- include/install-sh | 365 ---------------------- libacl/Makefile | 68 ----- libacl/Makemodule.am | 81 +++++ libmisc/Makefile | 31 -- libmisc/Makemodule.am | 8 + m4/.gitignore | 3 + m4/Makefile | 34 --- m4/manual_format.m4 | 31 -- m4/multilib.m4 | 43 --- m4/package_globals.m4 | 61 ---- m4/package_utilies.m4 | 95 ------ man/Makefile | 41 --- man/Makemodule.am | 3 + man/man1/Makefile | 35 --- man/man1/Makemodule.am | 4 + man/man3/Makefile | 35 --- man/man3/Makemodule.am | 40 +++ man/man5/Makefile | 35 --- man/man5/Makemodule.am | 2 + package/Makefile | 60 ---- package/tar/Makefile | 36 --- po/.gitignore | 12 + po/LINGUAS | 3 + po/Makefile | 42 --- po/Makevars | 41 +++ po/update-potfiles | 13 + setfacl/Makefile | 36 --- setfacl/do_set.c | 528 -------------------------------- setfacl/do_set.h | 36 --- setfacl/parse.c | 594 ----------------------------------- setfacl/parse.h | 85 ------ setfacl/sequence.c | 162 ---------- setfacl/sequence.h | 115 ------- setfacl/setfacl.c | 669 ---------------------------------------- test/.gitignore | 1 + test/Makefile | 50 --- test/Makemodule.am | 27 ++ test/root/getfacl.test | 4 + test/root/permissions.test | 3 +- test/root/restore.test | 4 + test/root/setfacl.test | 4 + test/run | 8 + tools/Makemodule.am | 23 ++ tools/chacl.c | 354 +++++++++++++++++++++ tools/do_set.c | 528 ++++++++++++++++++++++++++++++++ tools/do_set.h | 36 +++ tools/getfacl.c | 747 +++++++++++++++++++++++++++++++++++++++++++++ tools/parse.c | 594 +++++++++++++++++++++++++++++++++++ tools/parse.h | 85 ++++++ tools/sequence.c | 162 ++++++++++ tools/sequence.h | 115 +++++++ tools/setfacl.c | 669 ++++++++++++++++++++++++++++++++++++++++ tools/user_group.c | 59 ++++ tools/user_group.h | 31 ++ 79 files changed, 3798 insertions(+), 5315 deletions(-) delete mode 100644 Makefile create mode 100644 Makefile.am delete mode 100755 Makepkgs delete mode 100644 VERSION create mode 100755 autogen.sh delete mode 100644 chacl/Makefile delete mode 100644 chacl/chacl.c delete mode 100644 doc/Makefile create mode 100644 doc/Makemodule.am delete mode 100644 examples/Makefile.examples create mode 100644 examples/Makemodule.am delete mode 100644 getfacl/Makefile delete mode 100644 getfacl/getfacl.c delete mode 100644 getfacl/user_group.c delete mode 100644 getfacl/user_group.h delete mode 100644 include/Makefile create mode 100644 include/Makemodule.am delete mode 100644 include/builddefs.in delete mode 100644 include/buildmacros delete mode 100644 include/buildrules delete mode 100644 include/config.h.in delete mode 100755 include/install-sh delete mode 100644 libacl/Makefile create mode 100644 libacl/Makemodule.am delete mode 100644 libmisc/Makefile create mode 100644 libmisc/Makemodule.am create mode 100644 m4/.gitignore delete mode 100644 m4/Makefile delete mode 100644 m4/manual_format.m4 delete mode 100644 m4/multilib.m4 delete mode 100644 m4/package_globals.m4 delete mode 100644 m4/package_utilies.m4 delete mode 100644 man/Makefile create mode 100644 man/Makemodule.am delete mode 100644 man/man1/Makefile create mode 100644 man/man1/Makemodule.am delete mode 100644 man/man3/Makefile create mode 100644 man/man3/Makemodule.am delete mode 100644 man/man5/Makefile create mode 100644 man/man5/Makemodule.am delete mode 100644 package/Makefile delete mode 100644 package/tar/Makefile create mode 100644 po/.gitignore create mode 100644 po/LINGUAS delete mode 100644 po/Makefile create mode 100644 po/Makevars create mode 100755 po/update-potfiles delete mode 100644 setfacl/Makefile delete mode 100644 setfacl/do_set.c delete mode 100644 setfacl/do_set.h delete mode 100644 setfacl/parse.c delete mode 100644 setfacl/parse.h delete mode 100644 setfacl/sequence.c delete mode 100644 setfacl/sequence.h delete mode 100644 setfacl/setfacl.c create mode 100644 test/.gitignore delete mode 100644 test/Makefile create mode 100644 test/Makemodule.am create mode 100644 tools/Makemodule.am create mode 100644 tools/chacl.c create mode 100644 tools/do_set.c create mode 100644 tools/do_set.h create mode 100644 tools/getfacl.c create mode 100644 tools/parse.c create mode 100644 tools/parse.h create mode 100644 tools/sequence.c create mode 100644 tools/sequence.h create mode 100644 tools/setfacl.c create mode 100644 tools/user_group.c create mode 100644 tools/user_group.h diff --git a/.gitignore b/.gitignore index 71009b9..d907d15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,46 @@ +*~ *.la *.lo *.mo *.o -*[-.]manifest +.dirstamp +.deps/ .libs/ -/.census + /Logs/ + /acl-* +/chacl +/getfacl +/setfacl + +/ABOUT-NLS /aclocal.m4 /autom4te.cache/ -/chacl/chacl +/ar-lib +/config.cache /config.guess /config.log +/config.rpath /config.status /config.sub /configure -/doc/CHANGES.gz -/getfacl/getfacl +/compile +/depcomp +/install-sh +/libtool +/ltmain.sh +/m4/ +/missing +/test-driver +Makefile +Makefile.in +stamp-h1 + +*.log +*.trs + /include/acl -/include/builddefs /include/config.h +/include/config.h.in /include/sys -/libtool -/ltmain.sh -/po/acl.pot -/setfacl/setfacl -acl-*.tar.gz -install-sh -m4/libtool.m4 -m4/ltoptions.m4 -m4/ltsugar.m4 -m4/ltversion.m4 -m4/lt~obsolete.m4 -config.h.in -*~ diff --git a/Makefile b/Makefile deleted file mode 100644 index 235736e..0000000 --- a/Makefile +++ /dev/null @@ -1,115 +0,0 @@ -# -# Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = . -HAVE_BUILDDEFS = $(shell test -f $(TOPDIR)/include/builddefs && echo yes || echo no) - -ifeq ($(HAVE_BUILDDEFS), yes) -include $(TOPDIR)/include/builddefs -endif - -CONFIGURE = \ - aclocal.m4 \ - configure config.guess config.sub \ - ltmain.sh m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 \ - m4/ltversion.m4 m4/lt~obsolete.m4 -LSRCFILES = \ - configure.ac Makepkgs install-sh exports README VERSION \ - $(CONFIGURE) - -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - Logs/* built .census install.* install-dev.* install-lib.* *.gz - -LIB_SUBDIRS = include libmisc libacl -TOOL_SUBDIRS = getfacl setfacl chacl m4 man doc po test examples package - -SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) - -default: include/builddefs include/config.h -ifeq ($(HAVE_BUILDDEFS), no) - $(MAKE) -C . $@ -else - $(MAKE) $(SUBDIRS) -endif - -# tool/lib dependencies -libacl: libmisc -getfacl setfacl chacl: libacl - -ifeq ($(HAVE_BUILDDEFS), yes) -include $(BUILDRULES) -else -clean: # if configure hasn't run, nothing to clean -endif - -# Recent versions of libtool require the -i option for copying auxiliary -# files (config.sub, config.guess, install-sh, ltmain.sh), while older -# versions will copy those files anyway, and don't understand -i. -LIBTOOLIZE_INSTALL = `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` - -configure include/builddefs: - libtoolize -c $(LIBTOOLIZE_INSTALL) -f - cp include/install-sh . - aclocal -I m4 - autoconf - ./configure \ - --prefix=/ \ - --exec-prefix=/ \ - --sbindir=/bin \ - --bindir=/usr/bin \ - --libdir=/lib \ - --libexecdir=/usr/lib \ - --enable-lib64=yes \ - --includedir=/usr/include \ - --mandir=/usr/share/man \ - --datadir=/usr/share \ - $$LOCAL_CONFIGURE_OPTIONS - touch .census - -include/config.h: include/builddefs -## Recover from the removal of $@ - @if test -f $@; then :; else \ - rm -f include/builddefs; \ - $(MAKE) $(AM_MAKEFLAGS) include/builddefs; \ - fi - -install: default $(addsuffix -install,$(SUBDIRS)) - $(INSTALL) -m 755 -d $(PKG_DOC_DIR) - $(INSTALL) -m 644 README $(PKG_DOC_DIR) - -install-dev: default $(addsuffix -install-dev,$(SUBDIRS)) - -install-lib: default $(addsuffix -install-lib,$(SUBDIRS)) - -%-install: - $(MAKE) -C $* install - -%-install-lib: - $(MAKE) -C $* install-lib - -%-install-dev: - $(MAKE) -C $* install-dev - -realclean distclean: clean - rm -f $(LDIRT) $(CONFIGURE) - rm -f include/builddefs include/config.h install-sh libtool - rm -rf autom4te.cache Logs - -.PHONY: tests root-tests nfs-tests -tests root-tests nfs-tests: default - $(MAKE) -C test/ $@ diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..40d6ae5 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,32 @@ +ACLOCAL_AMFLAGS = -I m4 + +EXTRA_DIST = \ + exports + +SUBDIRS = po + +AM_CPPFLAGS = \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ + -DLOCALEDIR=\"$(localedir)\" + +aclincludedir = $(includedir)/acl +sysincludedir = $(includedir)/sys + +aclinclude_HEADERS = +sysinclude_HEADERS = +bin_PROGRAMS = +lib_LTLIBRARIES = +noinst_HEADERS = +noinst_LTLIBRARIES = +dist_doc_DATA = +dist_man_MANS = + +include doc/Makemodule.am +include examples/Makemodule.am +include include/Makemodule.am +include libacl/Makemodule.am +include libmisc/Makemodule.am +include man/Makemodule.am +include test/Makemodule.am +include tools/Makemodule.am diff --git a/Makepkgs b/Makepkgs deleted file mode 100755 index 52368f4..0000000 --- a/Makepkgs +++ /dev/null @@ -1,80 +0,0 @@ -#! /bin/sh -# -# Copyright (C) 2001, 2002, 2003 Silicon Graphics, Inc. All rights reserved. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -LOGDIR=Logs - -verbose=false - -MAKE=${MAKE:-make} -test ! -z "$MAKE" && make=$MAKE - -for opt in $* -do - case "$opt" in - clean) - ;; # ignored, kept for backward compatibility - verbose) - verbose=true ;; - *) - echo "Usage: Makepkgs [verbose]"; exit 1 ;; - esac -done - -# start with a clean manifest -test ! -d $LOGDIR && mkdir $LOGDIR -rm -rf $LOGDIR/* > /dev/null 2>&1 - -# build Debian packages, cleans itself before starting -SUDO=${SUDO:-sudo} -test ! -z "$SUDO" && sudo=$SUDO - -# build packages - manual clean before starting -echo "== clean, log is $LOGDIR/clean" -if $verbose ; then - $MAKE clean 2>&1 | tee $LOGDIR/clean -else - $MAKE clean > $LOGDIR/clean 2>&1 || exit 1 -fi - -echo -echo "== configure, log is $LOGDIR/configure" -rm -f .census # force configure to run here -if $verbose ; then - $MAKE configure 2>&1 | tee $LOGDIR/configure -else - $MAKE configure > $LOGDIR/configure 2>&1 || exit 1 -fi - -echo -echo "== default, log is $LOGDIR/default" -if $verbose ; then - $MAKE default 2>&1 | tee $LOGDIR/default -else - $MAKE default > $LOGDIR/default 2>&1 || exit 1 -fi - -echo -echo "== dist, log is $LOGDIR/dist" -[ ! -f .census ] && touch .census -if $verbose ; then - $MAKE -C package dist 2>&1 | tee $LOGDIR/dist -else - $MAKE -C package dist > $LOGDIR/dist 2>&1 || exit 1 - grep '^Wrote:' $LOGDIR/dist | sed -e 's/\.\.\/\.\.\///' -fi - -exit 0 diff --git a/VERSION b/VERSION deleted file mode 100644 index 245aaf4..0000000 --- a/VERSION +++ /dev/null @@ -1,7 +0,0 @@ -# -# This file is used by configure to get version information -# -PKG_MAJOR=2 -PKG_MINOR=2 -PKG_REVISION=52 -PKG_BUILD=1 diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..a98a3c5 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,4 @@ +#!/bin/sh -ex +po/update-potfiles +autopoint --force +exec autoreconf -f -i diff --git a/chacl/Makefile b/chacl/Makefile deleted file mode 100644 index 33858d6..0000000 --- a/chacl/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LTCOMMAND = chacl -CFILES = chacl.c - -LLDLIBS = $(LIBACL) $(LIBATTR) -LTDEPENDENCIES = $(LIBACL) - -default: $(LTCOMMAND) - -include $(BUILDRULES) - -install: default - $(INSTALL) -m 755 -d $(PKG_BIN_DIR) - $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_BIN_DIR) -install-dev install-lib: diff --git a/chacl/chacl.c b/chacl/chacl.c deleted file mode 100644 index 525a7ff..0000000 --- a/chacl/chacl.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) 2001-2002 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "config.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "misc.h" - -static int acl_delete_file (const char * path, acl_type_t type); -static int list_acl(char *file); -static int set_acl(acl_t acl, acl_t dacl, const char *fname); -static int walk_dir(acl_t acl, acl_t dacl, const char *fname); - -static char *program; -static int rflag; - -static void -usage(void) -{ - fprintf(stderr, _("Usage:\n")); - fprintf(stderr, _("\t%s acl pathname...\n"), program); - fprintf(stderr, _("\t%s -b acl dacl pathname...\n"), program); - fprintf(stderr, _("\t%s -d dacl pathname...\n"), program); - fprintf(stderr, _("\t%s -R pathname...\n"), program); - fprintf(stderr, _("\t%s -D pathname...\n"), program); - fprintf(stderr, _("\t%s -B pathname...\n"), program); - fprintf(stderr, _("\t%s -l pathname...\t[not IRIX compatible]\n"), - program); - fprintf(stderr, _("\t%s -r pathname...\t[not IRIX compatible]\n"), - program); - exit(1); -} - -int -main(int argc, char *argv[]) -{ - char *file; - int switch_flag = 0; /* ensure only one switch is used */ - int args_required = 2; - int failed = 0; /* exit status */ - int c; /* For use by getopt(3) */ - int dflag = 0; /* a Default ACL is desired */ - int bflag = 0; /* a both ACLs are desired */ - int Rflag = 0; /* set to true to remove an acl */ - int Dflag = 0; /* set to true to remove default acls */ - int Bflag = 0; /* set to true to remove both acls */ - int lflag = 0; /* set to true to list acls */ - acl_t acl = NULL; /* File ACL */ - acl_t dacl = NULL; /* Directory Default ACL */ - - program = basename(argv[0]); - - setlocale(LC_CTYPE, ""); - setlocale(LC_MESSAGES, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); - - /* parse arguments */ - while ((c = getopt(argc, argv, "bdlRDBr")) != -1) { - if (switch_flag) - usage(); - switch_flag = 1; - - switch (c) { - case 'b': - bflag = 1; - args_required = 3; - break; - case 'd': - dflag = 1; - args_required = 2; - break; - case 'R': - Rflag = 1; - args_required = 1; - break; - case 'D': - Dflag = 1; - args_required = 1; - break; - case 'B': - Bflag = 1; - args_required = 1; - break; - case 'l': - lflag = 1; - args_required = 1; - break; - case 'r': - rflag = 1; - args_required = 1; - break; - default: - usage(); - break; - } - } - - /* if not enough arguments quit */ - if ((argc - optind) < args_required) - usage(); - - /* list the acls */ - if (lflag) { - for (; optind < argc; optind++) { - file = argv[optind]; - if (!list_acl(file)) - failed++; - } - return(failed); - } - - /* remove the acls */ - if (Rflag || Dflag || Bflag) { - for (; optind < argc; optind++) { - file = argv[optind]; - if (!Dflag && - (acl_delete_file(file, ACL_TYPE_ACCESS) == -1)) { - fprintf(stderr, _( - "%s: error removing access acl on \"%s\": %s\n"), - program, file, strerror(errno)); - failed++; - } - if (!Rflag && - (acl_delete_file(file, ACL_TYPE_DEFAULT) == -1)) { - fprintf(stderr, _( - "%s: error removing default acl on \"%s\": %s\n"), - program, file, strerror(errno)); - failed++; - } - } - return(failed); - } - - /* file access acl */ - if (! dflag) { - acl = acl_from_text(argv[optind]); - failed = acl_check(acl, &c); - if (failed < 0) { - fprintf(stderr, "%s: %s - %s\n", - program, argv[optind], strerror(errno)); - return 1; - } - else if (failed > 0) { - fprintf(stderr, _( - "%s: access ACL '%s': %s at entry %d\n"), - program, argv[optind], acl_error(failed), c); - return 1; - } - optind++; - } - - - /* directory default acl */ - if (bflag || dflag) { - dacl = acl_from_text(argv[optind]); - failed = acl_check(dacl, &c); - if (failed < 0) { - fprintf(stderr, "%s: %s - %s\n", - program, argv[optind], strerror(errno)); - return 1; - } - else if (failed > 0) { - fprintf(stderr, _( - "%s: access ACL '%s': %s at entry %d\n"), - program, argv[optind], acl_error(failed), c); - return 1; - } - optind++; - } - - /* place acls on files */ - for (; optind < argc; optind++) - failed += set_acl(acl, dacl, argv[optind]); - - if (acl) - acl_free(acl); - if (dacl) - acl_free(dacl); - - return(failed); -} - -/* - * deletes an access acl or directory default acl if one exists - */ -static int -acl_delete_file(const char *path, acl_type_t type) -{ - int error = 0; - - /* converts access ACL to a minimal ACL */ - if (type == ACL_TYPE_ACCESS) { - acl_t acl; - acl_entry_t entry; - acl_tag_t tag; - - acl = acl_get_file(path, ACL_TYPE_ACCESS); - if (!acl) - return -1; - error = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); - while (error == 1) { - acl_get_tag_type(entry, &tag); - switch(tag) { - case ACL_USER: - case ACL_GROUP: - case ACL_MASK: - acl_delete_entry(acl, entry); - break; - } - error = acl_get_entry(acl, ACL_NEXT_ENTRY, &entry); - } - if (!error) - error = acl_set_file(path, ACL_TYPE_ACCESS, acl); - } else - error = acl_delete_def_file(path); - return(error); -} - -/* - * lists the acl for a file/dir in short text form - * return 0 on failure - * return 1 on success - */ -static int -list_acl(char *file) -{ - acl_t acl = NULL; - acl_t dacl = NULL; - char *acl_text, *dacl_text = NULL; - - if ((acl = acl_get_file(file, ACL_TYPE_ACCESS)) == NULL) { - fprintf(stderr, _("%s: cannot get access ACL on '%s': %s\n"), - program, file, strerror(errno)); - return 0; - } - if ((dacl = acl_get_file(file, ACL_TYPE_DEFAULT)) == NULL && - (errno != EACCES)) { /* EACCES given if not a directory */ - fprintf(stderr, _("%s: cannot get default ACL on '%s': %s\n"), - program, file, strerror(errno)); - return 0; - } - acl_text = acl_to_any_text(acl, NULL, ',', TEXT_ABBREVIATE); - if (acl_text == NULL) { - fprintf(stderr, _("%s: cannot get access ACL text on " - "'%s': %s\n"), program, file, strerror(errno)); - return 0; - } - if (acl_entries(dacl) > 0) { - dacl_text = acl_to_any_text(dacl, NULL, ',', TEXT_ABBREVIATE); - if (dacl_text == NULL) { - fprintf(stderr, _("%s: cannot get default ACL text on " - "'%s': %s\n"), program, file, strerror(errno)); - return 0; - } - } - if (dacl_text) { - printf("%s [%s/%s]\n", file, acl_text, dacl_text); - acl_free(dacl_text); - } else - printf("%s [%s]\n", file, acl_text); - acl_free(acl_text); - acl_free(acl); - acl_free(dacl); - return 1; -} - -static int -set_acl(acl_t acl, acl_t dacl, const char *fname) -{ - int failed = 0; - - if (rflag) - failed += walk_dir(acl, dacl, fname); - - /* set regular acl */ - if (acl && acl_set_file(fname, ACL_TYPE_ACCESS, acl) == -1) { - fprintf(stderr, _("%s: cannot set access acl on \"%s\": %s\n"), - program, fname, strerror(errno)); - failed++; - } - /* set default acl */ - if (dacl && acl_set_file(fname, ACL_TYPE_DEFAULT, dacl) == -1) { - fprintf(stderr, _("%s: cannot set default acl on \"%s\": %s\n"), - program, fname, strerror(errno)); - failed++; - } - - return(failed); -} - -static int -walk_dir(acl_t acl, acl_t dacl, const char *fname) -{ - int failed = 0; - DIR *dir; - struct dirent64 *d; - char *name; - - if ((dir = opendir(fname)) == NULL) { - if (errno != ENOTDIR) { - fprintf(stderr, _("%s: opendir failed: %s\n"), - program, strerror(errno)); - return(1); - } - return(0); /* got a file, not an error */ - } - - while ((d = readdir64(dir)) != NULL) { - /* skip "." and ".." entries */ - if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) - continue; - - name = malloc(strlen(fname) + strlen(d->d_name) + 2); - if (name == NULL) { - fprintf(stderr, _("%s: malloc failed: %s\n"), - program, strerror(errno)); - exit(1); - } - sprintf(name, "%s/%s", fname, d->d_name); - - failed += set_acl(acl, dacl, name); - free(name); - } - closedir(dir); - - return(failed); -} diff --git a/configure.ac b/configure.ac index 7af2e8d..1ca2a3c 100644 --- a/configure.ac +++ b/configure.ac @@ -13,37 +13,53 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -AC_INIT(include/acl.h) + +AC_INIT([acl], [2.2.53], [acl-devel@nongnu.org]) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) -AC_CONFIG_HEADER(include/config.h) +AC_CONFIG_HEADER([include/config.h]) AC_PREFIX_DEFAULT(/usr) -AC_PROG_LIBTOOL +AM_INIT_AUTOMAKE([-Wall foreign 1.11 dist-xz subdir-objects]) +AM_SILENT_RULES([yes]) + +AC_PROG_CC +AM_PROG_CC_C_O +AC_USE_SYSTEM_EXTENSIONS +AC_FUNC_GCC_VISIBILITY + +AM_PROG_AR +LT_INIT -AC_ARG_ENABLE(shared, -[ --enable-shared=[yes/no] Enable use of shared libraries [default=yes]],, - enable_shared=yes) -AC_SUBST(enable_shared) +AM_GNU_GETTEXT_VERSION([0.18.2]) +AM_GNU_GETTEXT([external]) -AC_ARG_ENABLE(gettext, -[ --enable-gettext=[yes/no] Enable alternate language support [default=yes]],, - enable_gettext=yes) -AC_SUBST(enable_gettext) +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], [Enable extra debugging])]) +AS_IF([test "x$enable_debug" = "xyes"], + [CPPFLAGS="$CPPFLAGS -DDEBUG"], + [CPPFLAGS="$CPPFLAGS -DNDEBUG"]) -AC_ARG_ENABLE(lib64, -[ --enable-lib64=[yes/no] Enable lib64 support [default=no]],, - enable_lib64=no) -AC_SUBST(enable_lib64) +dnl Automatically increment the revision for every release. +LT_REVISION=$(echo "${PACKAGE_VERSION}" | tr -d .) +AC_SUBST(LT_REVISION) -AC_PACKAGE_GLOBALS(acl) -AC_PACKAGE_UTILITIES(acl) AC_PACKAGE_NEED_ATTR_XATTR_H AC_PACKAGE_NEED_ATTR_ERROR_H -AC_MULTILIB($enable_lib64) AC_PACKAGE_NEED_GETXATTR_LIBATTR -AC_MANUAL_FORMAT - -AC_FUNC_GCC_VISIBILITY -AC_OUTPUT(include/builddefs) +AC_CONFIG_COMMANDS([include/acl], + [dnl + rm -rf include/acl + $as_ln_s "$ac_abs_top_srcdir/include" include/acl + ]) +AC_CONFIG_COMMANDS([include/sys], + [dnl + rm -rf include/sys + $as_ln_s "$ac_abs_top_srcdir/include" include/sys + ]) +AC_CONFIG_FILES([ + Makefile + po/Makefile.in +]) +AC_OUTPUT diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index a08e403..0000000 --- a/doc/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LSRCFILES = extensions.txt libacl.txt TODO PORTING CHANGES COPYING COPYING.LGPL INSTALL \ - old-acl.5 -LDIRT = *.gz - -default: CHANGES.gz - -include $(BUILDRULES) - -CHANGES.gz: - $(ZIP) --best -c < CHANGES > $@ - -install: default - $(INSTALL) -m 755 -d $(PKG_DOC_DIR) - $(INSTALL) -m 644 PORTING CHANGES.gz $(PKG_DOC_DIR) -ifeq ($(PKG_DISTRIBUTION), debian) - $(INSTALL) -S CHANGES.gz $(PKG_DOC_DIR)/changelog.gz -else - $(INSTALL) -m 644 COPYING COPYING.LGPL $(PKG_DOC_DIR) -endif - -install-dev install-lib: diff --git a/doc/Makemodule.am b/doc/Makemodule.am new file mode 100644 index 0000000..1b9c165 --- /dev/null +++ b/doc/Makemodule.am @@ -0,0 +1,10 @@ +dist_doc_DATA += \ + doc/extensions.txt \ + doc/CHANGES \ + doc/COPYING \ + doc/COPYING.LGPL \ + doc/libacl.txt \ + doc/PORTING + +EXTRA_DIST += \ + doc/TODO diff --git a/doc/TODO b/doc/TODO index 9c23d69..b376a65 100644 --- a/doc/TODO +++ b/doc/TODO @@ -1,4 +1,2 @@ -- include po (gettext stuff) in packages and build process -- fix build process - check documentation - add manual pages for POSIX functions diff --git a/examples/Makefile b/examples/Makefile index c6aa124..74642ca 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,27 +1,9 @@ -# -# Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# +CFLAGS = -g -Wall -I../include +LDFLAGS = -lacl -TOPDIR = .. -include $(TOPDIR)/include/builddefs +PROGS = get-acl copy-acl set-acl copyperm -LSRCFILES = README Makefile.examples get-acl.c set-acl.c copy-acl.c copyperm.c -LDIRT = get-acl set-acl copy-acl +all: $(PROGS) -include $(BUILDRULES) - -default install install-dev install-lib: +clean: + rm -f $(PROGS) diff --git a/examples/Makefile.examples b/examples/Makefile.examples deleted file mode 100644 index b33c2a5..0000000 --- a/examples/Makefile.examples +++ /dev/null @@ -1,9 +0,0 @@ -CFLAGS = -g -Wall -LDFLAGS = -lacl - -PROGS = get-acl copy-acl set-acl copyperm - -all: $(PROGS) - -clean: - rm -f $(PROGS) diff --git a/examples/Makemodule.am b/examples/Makemodule.am new file mode 100644 index 0000000..e18991a --- /dev/null +++ b/examples/Makemodule.am @@ -0,0 +1,7 @@ +EXTRA_DIST += \ + examples/copy-acl.c \ + examples/copyperm.c \ + examples/get-acl.c \ + examples/Makefile \ + examples/README \ + examples/set-acl.c diff --git a/getfacl/Makefile b/getfacl/Makefile deleted file mode 100644 index 7fbafda..0000000 --- a/getfacl/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (c) 2000, 2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LTCOMMAND = getfacl -CFILES = getfacl.c user_group.c -HFILES = user_group.h - -LLDLIBS = $(LIBMISC) $(LIBACL) $(LIBATTR) -LTDEPENDENCIES = $(LIBMISC) $(LIBACL) - -default: $(LTCOMMAND) - -include $(BUILDRULES) - -install: default - $(INSTALL) -m 755 -d $(PKG_BIN_DIR) - $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_BIN_DIR) -install-dev install-lib: diff --git a/getfacl/getfacl.c b/getfacl/getfacl.c deleted file mode 100644 index 22cc1c7..0000000 --- a/getfacl/getfacl.c +++ /dev/null @@ -1,747 +0,0 @@ -/* - File: getfacl.c - (Linux Access Control List Management) - - Copyright (C) 1999-2002 - Andreas Gruenbacher, - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU 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. -*/ - -#include "config.h" -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include "misc.h" -#include "user_group.h" -#include "walk_tree.h" - -#define POSIXLY_CORRECT_STR "POSIXLY_CORRECT" - -#if !POSIXLY_CORRECT -# define CMD_LINE_OPTIONS "aceEsRLPtpndvh" -#endif -#define POSIXLY_CMD_LINE_OPTIONS "d" - -struct option long_options[] = { -#if !POSIXLY_CORRECT - { "access", 0, 0, 'a' }, - { "omit-header", 0, 0, 'c' }, - { "all-effective", 0, 0, 'e' }, - { "no-effective", 0, 0, 'E' }, - { "skip-base", 0, 0, 's' }, - { "recursive", 0, 0, 'R' }, - { "logical", 0, 0, 'L' }, - { "physical", 0, 0, 'P' }, - { "tabular", 0, 0, 't' }, - { "absolute-names", 0, 0, 'p' }, - { "numeric", 0, 0, 'n' }, -#endif - { "default", 0, 0, 'd' }, - { "version", 0, 0, 'v' }, - { "help", 0, 0, 'h' }, - { NULL, 0, 0, 0 } -}; - -const char *progname; -const char *cmd_line_options; - -int walk_flags = WALK_TREE_DEREFERENCE_TOPLEVEL; -int opt_print_acl; -int opt_print_default_acl; -int opt_strip_leading_slash = 1; -int opt_comments = 1; /* include comments */ -int opt_skip_base; /* skip files that only have the base entries */ -int opt_tabular; /* tabular output format (alias `showacl') */ -#if POSIXLY_CORRECT -const int posixly_correct = 1; /* Posix compatible behavior! */ -#else -int posixly_correct; /* Posix compatible behavior? */ -#endif -int had_errors; -int absolute_warning; /* Absolute path warning was issued */ -int print_options = TEXT_SOME_EFFECTIVE; -int opt_numeric; /* don't convert id's to symbolic names */ - - -static const char *xquote(const char *str, const char *quote_chars) -{ - const char *q = quote(str, quote_chars); - if (q == NULL) { - fprintf(stderr, "%s: %s\n", progname, strerror(errno)); - exit(1); - } - return q; -} - -struct name_list { - struct name_list *next; - char name[0]; -}; - -void free_list(struct name_list *names) -{ - struct name_list *next; - - while (names) { - next = names->next; - free(names); - names = next; - } -} - -struct name_list *get_list(const struct stat *st, acl_t acl) -{ - struct name_list *first = NULL, *last = NULL; - acl_entry_t ent; - int ret = 0; - - if (acl != NULL) - ret = acl_get_entry(acl, ACL_FIRST_ENTRY, &ent); - if (ret != 1) - return NULL; - while (ret > 0) { - acl_tag_t e_type; - const id_t *id_p; - const char *name = ""; - int len; - - acl_get_tag_type(ent, &e_type); - switch(e_type) { - case ACL_USER_OBJ: - name = user_name(st->st_uid, opt_numeric); - break; - - case ACL_USER: - id_p = acl_get_qualifier(ent); - if (id_p != NULL) - name = user_name(*id_p, opt_numeric); - break; - - case ACL_GROUP_OBJ: - name = group_name(st->st_gid, opt_numeric); - break; - - case ACL_GROUP: - id_p = acl_get_qualifier(ent); - if (id_p != NULL) - name = group_name(*id_p, opt_numeric); - break; - } - name = xquote(name, "\t\n\r"); - len = strlen(name); - if (last == NULL) { - first = last = (struct name_list *) - malloc(sizeof(struct name_list) + len + 1); - } else { - last->next = (struct name_list *) - malloc(sizeof(struct name_list) + len + 1); - last = last->next; - } - if (last == NULL) { - free_list(first); - return NULL; - } - last->next = NULL; - strcpy(last->name, name); - - ret = acl_get_entry(acl, ACL_NEXT_ENTRY, &ent); - } - return first; -} - -int max_name_length(struct name_list *names) -{ - int max_len = 0; - while (names != NULL) { - struct name_list *next = names->next; - int len = strlen(names->name); - - if (len > max_len) - max_len = len; - names = next; - } - return max_len; -} - -int names_width; - -struct acl_perm_def { - acl_tag_t tag; - char c; -}; - -struct acl_perm_def acl_perm_defs[] = { - { ACL_READ, 'r' }, - { ACL_WRITE, 'w' }, - { ACL_EXECUTE, 'x' }, - { 0, 0 } -}; - -#define ACL_PERMS (sizeof(acl_perm_defs) / sizeof(struct acl_perm_def) - 1) - -void acl_perm_str(acl_entry_t entry, char *str) -{ - acl_permset_t permset; - int n; - - acl_get_permset(entry, &permset); - for (n = 0; n < (int) ACL_PERMS; n++) { - str[n] = (acl_get_perm(permset, acl_perm_defs[n].tag) ? - acl_perm_defs[n].c : '-'); - } - str[n] = '\0'; -} - -void acl_mask_perm_str(acl_t acl, char *str) -{ - acl_entry_t entry; - - str[0] = '\0'; - if (acl_get_entry(acl, ACL_FIRST_ENTRY, &entry) != 1) - return; - for(;;) { - acl_tag_t tag; - - acl_get_tag_type(entry, &tag); - if (tag == ACL_MASK) { - acl_perm_str(entry, str); - return; - } - if (acl_get_entry(acl, ACL_NEXT_ENTRY, &entry) != 1) - return; - } -} - -void apply_mask(char *perm, const char *mask) -{ - while (*perm) { - if (*mask == '-' && *perm >= 'a' && *perm <= 'z') - *perm = *perm - 'a' + 'A'; - perm++; - if (*mask) - mask++; - } -} - -int show_line(FILE *stream, struct name_list **acl_names, acl_t acl, - acl_entry_t *acl_ent, const char *acl_mask, - struct name_list **dacl_names, acl_t dacl, - acl_entry_t *dacl_ent, const char *dacl_mask) -{ - acl_tag_t tag_type; - const char *tag, *name; - char acl_perm[ACL_PERMS+1], dacl_perm[ACL_PERMS+1]; - - if (acl) { - acl_get_tag_type(*acl_ent, &tag_type); - name = (*acl_names)->name; - } else { - acl_get_tag_type(*dacl_ent, &tag_type); - name = (*dacl_names)->name; - } - - switch(tag_type) { - case ACL_USER_OBJ: - tag = "USER"; - break; - case ACL_USER: - tag = "user"; - break; - case ACL_GROUP_OBJ: - tag = "GROUP"; - break; - case ACL_GROUP: - tag = "group"; - break; - case ACL_MASK: - tag = "mask"; - break; - case ACL_OTHER: - tag = "other"; - break; - default: - return -1; - } - - memset(acl_perm, ' ', ACL_PERMS); - acl_perm[ACL_PERMS] = '\0'; - if (acl_ent) { - acl_perm_str(*acl_ent, acl_perm); - if (tag_type != ACL_USER_OBJ && tag_type != ACL_OTHER && - tag_type != ACL_MASK) - apply_mask(acl_perm, acl_mask); - } - memset(dacl_perm, ' ', ACL_PERMS); - dacl_perm[ACL_PERMS] = '\0'; - if (dacl_ent) { - acl_perm_str(*dacl_ent, dacl_perm); - if (tag_type != ACL_USER_OBJ && tag_type != ACL_OTHER && - tag_type != ACL_MASK) - apply_mask(dacl_perm, dacl_mask); - } - - fprintf(stream, "%-5s %*s %*s %*s\n", - tag, -names_width, name, - -(int)ACL_PERMS, acl_perm, - -(int)ACL_PERMS, dacl_perm); - - if (acl_names) { - acl_get_entry(acl, ACL_NEXT_ENTRY, acl_ent); - (*acl_names) = (*acl_names)->next; - } - if (dacl_names) { - acl_get_entry(dacl, ACL_NEXT_ENTRY, dacl_ent); - (*dacl_names) = (*dacl_names)->next; - } - return 0; -} - -int do_show(FILE *stream, const char *path_p, const struct stat *st, - acl_t acl, acl_t dacl) -{ - struct name_list *acl_names = get_list(st, acl), - *first_acl_name = acl_names; - struct name_list *dacl_names = get_list(st, dacl), - *first_dacl_name = dacl_names; - - int acl_names_width = max_name_length(acl_names); - int dacl_names_width = max_name_length(dacl_names); - acl_entry_t acl_ent; - acl_entry_t dacl_ent; - char acl_mask[ACL_PERMS+1], dacl_mask[ACL_PERMS+1]; - int ret; - - names_width = 8; - if (acl_names_width > names_width) - names_width = acl_names_width; - if (dacl_names_width > names_width) - names_width = dacl_names_width; - - acl_mask[0] = '\0'; - if (acl) { - acl_mask_perm_str(acl, acl_mask); - ret = acl_get_entry(acl, ACL_FIRST_ENTRY, &acl_ent); - if (ret == 0) - acl = NULL; - if (ret < 0) - return ret; - } - dacl_mask[0] = '\0'; - if (dacl) { - acl_mask_perm_str(dacl, dacl_mask); - ret = acl_get_entry(dacl, ACL_FIRST_ENTRY, &dacl_ent); - if (ret == 0) - dacl = NULL; - if (ret < 0) - return ret; - } - fprintf(stream, "# file: %s\n", xquote(path_p, "\n\r")); - while (acl_names != NULL || dacl_names != NULL) { - acl_tag_t acl_tag, dacl_tag; - - if (acl) - acl_get_tag_type(acl_ent, &acl_tag); - if (dacl) - acl_get_tag_type(dacl_ent, &dacl_tag); - - if (acl && (!dacl || acl_tag < dacl_tag)) { - show_line(stream, &acl_names, acl, &acl_ent, acl_mask, - NULL, NULL, NULL, NULL); - continue; - } else if (dacl && (!acl || dacl_tag < acl_tag)) { - show_line(stream, NULL, NULL, NULL, NULL, - &dacl_names, dacl, &dacl_ent, dacl_mask); - continue; - } else { - if (acl_tag == ACL_USER || acl_tag == ACL_GROUP) { - id_t *acl_id_p = NULL, *dacl_id_p = NULL; - if (acl_ent) - acl_id_p = acl_get_qualifier(acl_ent); - if (dacl_ent) - dacl_id_p = acl_get_qualifier(dacl_ent); - - if (acl && (!dacl || *acl_id_p < *dacl_id_p)) { - show_line(stream, &acl_names, acl, - &acl_ent, acl_mask, - NULL, NULL, NULL, NULL); - continue; - } else if (dacl && - (!acl || *dacl_id_p < *acl_id_p)) { - show_line(stream, NULL, NULL, NULL, - NULL, &dacl_names, dacl, - &dacl_ent, dacl_mask); - continue; - } - } - show_line(stream, &acl_names, acl, &acl_ent, acl_mask, - &dacl_names, dacl, &dacl_ent, dacl_mask); - } - } - - free_list(first_acl_name); - free_list(first_dacl_name); - - return 0; -} - -/* - * Create an ACL from the file permission bits - * of the file PATH_P. - */ -static acl_t -acl_get_file_mode(const char *path_p) -{ - struct stat st; - - if (stat(path_p, &st) != 0) - return NULL; - return acl_from_mode(st.st_mode); -} - -static const char * -flagstr(mode_t mode) -{ - static char str[4]; - - str[0] = (mode & S_ISUID) ? 's' : '-'; - str[1] = (mode & S_ISGID) ? 's' : '-'; - str[2] = (mode & S_ISVTX) ? 't' : '-'; - str[3] = '\0'; - return str; -} - -int do_print(const char *path_p, const struct stat *st, int walk_flags, void *unused) -{ - const char *default_prefix = NULL; - acl_t acl = NULL, default_acl = NULL; - int error = 0; - - if (walk_flags & WALK_TREE_FAILED) { - fprintf(stderr, "%s: %s: %s\n", progname, xquote(path_p, "\n\r"), - strerror(errno)); - return 1; - } - - /* - * Symlinks can never have ACLs, so when doing a physical walk, we - * skip symlinks altogether, and when doing a half-logical walk, we - * skip all non-toplevel symlinks. - */ - if ((walk_flags & WALK_TREE_SYMLINK) && - ((walk_flags & WALK_TREE_PHYSICAL) || - !(walk_flags & (WALK_TREE_TOPLEVEL | WALK_TREE_LOGICAL)))) - return 0; - - if (opt_print_acl) { - acl = acl_get_file(path_p, ACL_TYPE_ACCESS); - if (acl == NULL && (errno == ENOSYS || errno == ENOTSUP)) - acl = acl_get_file_mode(path_p); - if (acl == NULL) - goto fail; - } - - if (opt_print_default_acl && S_ISDIR(st->st_mode)) { - default_acl = acl_get_file(path_p, ACL_TYPE_DEFAULT); - if (default_acl == NULL) { - if (errno != ENOSYS && errno != ENOTSUP) - goto fail; - } else if (acl_entries(default_acl) == 0) { - acl_free(default_acl); - default_acl = NULL; - } - } - - if (opt_skip_base && - (!acl || acl_equiv_mode(acl, NULL) == 0) && !default_acl) - return 0; - - if (opt_print_acl && opt_print_default_acl) - default_prefix = "default:"; - - if (opt_strip_leading_slash) { - if (*path_p == '/') { - if (!absolute_warning) { - fprintf(stderr, _("%s: Removing leading " - "'/' from absolute path names\n"), - progname); - absolute_warning = 1; - } - while (*path_p == '/') - path_p++; - } else if (*path_p == '.' && *(path_p+1) == '/') - while (*++path_p == '/') - /* nothing */ ; - if (*path_p == '\0') - path_p = "."; - } - - if (opt_tabular) { - if (do_show(stdout, path_p, st, acl, default_acl) != 0) - goto fail; - } else { - if (opt_comments) { - printf("# file: %s\n", xquote(path_p, "\n\r")); - printf("# owner: %s\n", - xquote(user_name(st->st_uid, opt_numeric), " \t\n\r")); - printf("# group: %s\n", - xquote(group_name(st->st_gid, opt_numeric), " \t\n\r")); - if ((st->st_mode & (S_ISVTX | S_ISUID | S_ISGID)) && !posixly_correct) - printf("# flags: %s\n", flagstr(st->st_mode)); - } - if (acl != NULL) { - char *acl_text = acl_to_any_text(acl, NULL, '\n', - print_options); - if (!acl_text) - goto fail; - if (puts(acl_text) < 0) { - acl_free(acl_text); - goto fail; - } - acl_free(acl_text); - } - if (default_acl != NULL) { - char *acl_text = acl_to_any_text(default_acl, - default_prefix, '\n', - print_options); - if (!acl_text) - goto fail; - if (puts(acl_text) < 0) { - acl_free(acl_text); - goto fail; - } - acl_free(acl_text); - } - } - if (acl || default_acl || opt_comments) - printf("\n"); - -cleanup: - if (acl) - acl_free(acl); - if (default_acl) - acl_free(default_acl); - return error; - -fail: - fprintf(stderr, "%s: %s: %s\n", progname, xquote(path_p, "\n\r"), - strerror(errno)); - error = -1; - goto cleanup; -} - - -void help(void) -{ - printf(_("%s %s -- get file access control lists\n"), - progname, VERSION); - printf(_("Usage: %s [-%s] file ...\n"), - progname, cmd_line_options); -#if !POSIXLY_CORRECT - if (posixly_correct) { -#endif - printf(_( -" -d, --default display the default access control list\n")); -#if !POSIXLY_CORRECT - } else { - printf(_( -" -a, --access display the file access control list only\n" -" -d, --default display the default access control list only\n" -" -c, --omit-header do not display the comment header\n" -" -e, --all-effective print all effective rights\n" -" -E, --no-effective print no effective rights\n" -" -s, --skip-base skip files that only have the base entries\n" -" -R, --recursive recurse into subdirectories\n" -" -L, --logical logical walk, follow symbolic links\n" -" -P, --physical physical walk, do not follow symbolic links\n" -" -t, --tabular use tabular output format\n" -" -n, --numeric print numeric user/group identifiers\n" -" -p, --absolute-names don't strip leading '/' in pathnames\n")); - } -#endif - printf(_( -" -v, --version print version and exit\n" -" -h, --help this help text\n")); -} - -int main(int argc, char *argv[]) -{ - int opt; - char *line; - - progname = basename(argv[0]); - -#if POSIXLY_CORRECT - cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; -#else - if (getenv(POSIXLY_CORRECT_STR)) - posixly_correct = 1; - if (!posixly_correct) - cmd_line_options = CMD_LINE_OPTIONS; - else - cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; -#endif - - setlocale(LC_CTYPE, ""); - setlocale(LC_MESSAGES, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); - - /* Align `#effective:' comments to column 40 for tty's */ - if (!posixly_correct && isatty(fileno(stdout))) - print_options |= TEXT_SMART_INDENT; - - while ((opt = getopt_long(argc, argv, cmd_line_options, - long_options, NULL)) != -1) { - switch (opt) { - case 'a': /* acl only */ - if (posixly_correct) - goto synopsis; - opt_print_acl = 1; - break; - - case 'd': /* default acl only */ - opt_print_default_acl = 1; - break; - - case 'c': /* no comments */ - if (posixly_correct) - goto synopsis; - opt_comments = 0; - break; - - case 'e': /* all #effective comments */ - if (posixly_correct) - goto synopsis; - print_options |= TEXT_ALL_EFFECTIVE; - break; - - case 'E': /* no #effective comments */ - if (posixly_correct) - goto synopsis; - print_options &= ~(TEXT_SOME_EFFECTIVE | - TEXT_ALL_EFFECTIVE); - break; - - case 'R': /* recursive */ - if (posixly_correct) - goto synopsis; - walk_flags |= WALK_TREE_RECURSIVE; - break; - - case 'L': /* follow all symlinks */ - if (posixly_correct) - goto synopsis; - walk_flags |= WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE; - walk_flags &= ~WALK_TREE_PHYSICAL; - break; - - case 'P': /* skip all symlinks */ - if (posixly_correct) - goto synopsis; - walk_flags |= WALK_TREE_PHYSICAL; - walk_flags &= ~(WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE | - WALK_TREE_DEREFERENCE_TOPLEVEL); - break; - - case 's': /* skip files with only base entries */ - if (posixly_correct) - goto synopsis; - opt_skip_base = 1; - break; - - case 'p': - if (posixly_correct) - goto synopsis; - opt_strip_leading_slash = 0; - break; - - case 't': - if (posixly_correct) - goto synopsis; - opt_tabular = 1; - break; - - case 'n': /* numeric */ - opt_numeric = 1; - print_options |= TEXT_NUMERIC_IDS; - break; - - case 'v': /* print version */ - printf("%s " VERSION "\n", progname); - return 0; - - case 'h': /* help */ - help(); - return 0; - - case ':': /* option missing */ - case '?': /* unknown option */ - default: - goto synopsis; - } - } - - if (!(opt_print_acl || opt_print_default_acl)) { - opt_print_acl = 1; - if (!posixly_correct) - opt_print_default_acl = 1; - } - - if ((optind == argc) && !posixly_correct) - goto synopsis; - - do { - if (optind == argc || - strcmp(argv[optind], "-") == 0) { - while ((line = next_line(stdin)) != NULL) { - if (*line == '\0') - continue; - - had_errors += walk_tree(line, walk_flags, 0, - do_print, NULL); - } - if (!feof(stdin)) { - fprintf(stderr, _("%s: Standard input: %s\n"), - progname, strerror(errno)); - had_errors++; - } - } else - had_errors += walk_tree(argv[optind], walk_flags, 0, - do_print, NULL); - optind++; - } while (optind < argc); - - return had_errors ? 1 : 0; - -synopsis: - fprintf(stderr, _("Usage: %s [-%s] file ...\n"), - progname, cmd_line_options); - fprintf(stderr, _("Try `%s --help' for more information.\n"), - progname); - return 2; -} - diff --git a/getfacl/user_group.c b/getfacl/user_group.c deleted file mode 100644 index 61fa0c3..0000000 --- a/getfacl/user_group.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - File: user_group.c - (Linux Access Control List Management) - - Copyright (C) 1999, 2000 - Andreas Gruenbacher, - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU 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. -*/ - -#include -#include -#include "user_group.h" - - -const char * -user_name(uid_t uid, int numeric) -{ - struct passwd *passwd = numeric ? NULL : getpwuid(uid); - static char uid_str[22]; - int ret; - - if (passwd != NULL) - return passwd->pw_name; - ret = snprintf(uid_str, sizeof(uid_str), "%ld", (long)uid); - if (ret < 1 || (size_t)ret >= sizeof(uid_str)) - return "?"; - return uid_str; -} - - -const char * -group_name(gid_t gid, int numeric) -{ - struct group *group = numeric ? NULL : getgrgid(gid); - static char gid_str[22]; - int ret; - - if (group != NULL) - return group->gr_name; - ret = snprintf(gid_str, sizeof(gid_str), "%ld", (long)gid); - if (ret < 1 || (size_t)ret >= sizeof(gid_str)) - return "?"; - return gid_str; -} - diff --git a/getfacl/user_group.h b/getfacl/user_group.h deleted file mode 100644 index aad5846..0000000 --- a/getfacl/user_group.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - File: user_group.h - (Linux Access Control List Management) - - Copyright (C) 1999 by Andreas Gruenbacher - - - This program 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 program 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. -*/ - -#include -#include -#include - -const char * -user_name(uid_t uid, int numeric); -const char * -group_name(gid_t uid, int numeric); - diff --git a/include/Makefile b/include/Makefile deleted file mode 100644 index 328a61d..0000000 --- a/include/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -# -# Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -HFILES = acl.h libacl.h acl_ea.h misc.h walk_tree.h -LSRCFILES = builddefs.in buildmacros buildrules config.h.in install-sh -LDIRT = sys acl - -default: sys acl - -sys acl: - $(LN_S) . $@ - -include $(BUILDRULES) - -install-dev: default - $(INSTALL) -m 755 -d $(PKG_INC_DIR) - $(INSTALL) -m 755 -d $(PKG_INC_DIR)/sys - $(INSTALL) -m 644 acl.h $(PKG_INC_DIR)/sys/acl.h - $(INSTALL) -m 755 -d $(PKG_INC_DIR)/acl - $(INSTALL) -m 644 libacl.h $(PKG_INC_DIR)/acl/libacl.h - -install install-lib: diff --git a/include/Makemodule.am b/include/Makemodule.am new file mode 100644 index 0000000..2596f5e --- /dev/null +++ b/include/Makemodule.am @@ -0,0 +1,10 @@ +aclinclude_HEADERS += \ + include/libacl.h + +sysinclude_HEADERS += \ + include/acl.h + +noinst_HEADERS += \ + include/acl_ea.h \ + include/misc.h \ + include/walk_tree.h diff --git a/include/builddefs.in b/include/builddefs.in deleted file mode 100644 index 9ed15b4..0000000 --- a/include/builddefs.in +++ /dev/null @@ -1,94 +0,0 @@ -# -# Copyright (c) 2002-2006 Silicon Graphics, Inc. All Rights Reserved. -# -# @configure_input@ -# - -ifndef _BUILDDEFS_INCLUDED_ -_BUILDDEFS_INCLUDED_ = 1 - -DEBUG = @debug_build@ -OPTIMIZER = @opt_build@ -MALLOCLIB = @malloc_lib@ -LOADERFLAGS = @LDFLAGS@ - -LIBACL = $(TOPDIR)/libacl/libacl.la -LIBATTR = @libattr@ -LIBMISC = $(TOPDIR)/libmisc/libmisc.la - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -top_builddir = @top_builddir@ -datarootdir = @datarootdir@ - -PKG_NAME = @pkg_name@ -PKG_USER = @pkg_user@ -PKG_GROUP = @pkg_group@ -PKG_RELEASE = @pkg_release@ -PKG_VERSION = @pkg_version@ -PKG_PLATFORM = @pkg_platform@ -PKG_DISTRIBUTION= @pkg_distribution@ -PKG_BIN_DIR = @bindir@ -PKG_SBIN_DIR = @sbindir@ -PKG_LIB_DIR = @libdir@@libdirsuffix@ -PKG_DEVLIB_DIR = @libdir@@libdirsuffix@ -PKG_INC_DIR = @includedir@ -PKG_MAN_DIR = @mandir@ -PKG_DOC_DIR = @datadir@/doc/@pkg_name@ -PKG_LOCALE_DIR = @datadir@/locale - -CC = @cc@ -AWK = @awk@ -SED = @sed@ -TAR = @tar@ -ZIP = @zip@ -MAKE = @make@ -ECHO = @echo@ -SORT = @sort@ -LN_S = @LN_S@ -SHELL = @SHELL@ -LIBTOOL = @LIBTOOL@ -MAKEDEPEND = @makedepend@ - -MSGFMT = @msgfmt@ -MSGMERGE = @msgmerge@ -XGETTEXT = @xgettext@ - -ENABLE_SHARED = @enable_shared@ -ENABLE_GETTEXT = @enable_gettext@ - -HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ - -ifneq "$(findstring $(PKG_PLATFORM), linux gnu gnu/kfreebsd gnu/knetbsd)" "" -PCFLAGS = -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -endif - -ifeq ($(PKG_PLATFORM),linux) -DEPENDFLAGS = -D__linux__ -endif -ifeq ($(PKG_PLATFORM),darwin) -DEPENDFLAGS = -D__APPLE__ -endif -ifeq ($(PKG_PLATFORM),irix) -DEPENDFLAGS = -D__sgi__ -endif -ifeq ($(PKG_PLATFORM),freebsd) -DEPENDFLAGS = -D__FreeBSD__ -endif - -GCFLAGS = $(OPTIMIZER) $(DEBUG) -funsigned-char -fno-strict-aliasing -Wall \ - -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ - -DPACKAGE=\"$(PKG_NAME)\" -I$(TOPDIR)/include - -# Global, Platform, Local CFLAGS -CFLAGS += $(GCFLAGS) $(PCFLAGS) $(LCFLAGS) - -include $(TOPDIR)/include/buildmacros - -endif - -# -# For targets that should always be rebuilt, -# define a target that is never up-to-date. -# Targets needing this should depend on $(_FORCE) -_FORCE = __force_build diff --git a/include/buildmacros b/include/buildmacros deleted file mode 100644 index 9e81bb8..0000000 --- a/include/buildmacros +++ /dev/null @@ -1,160 +0,0 @@ -# -# Copyright (c) 2002-2003 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -BUILDRULES = $(TOPDIR)/include/buildrules - -# LCFLAGS, LLDFLAGS, LLDLIBS, LSRCFILES and LDIRT may be specified in -# user Makefiles. Note: LSRCFILES is anything other than Makefile, $(CFILES) -# $(CXXFILES), or $(HFILES) and is used to construct the manifest list -# during the "dist" phase (packaging). - -LDFLAGS += $(LOADERFLAGS) $(LLDFLAGS) -LTLDFLAGS += $(LOADERFLAGS) -LDLIBS = $(LLDLIBS) $(PLDLIBS) $(MALLOCLIB) - -MAKEOPTS = --no-print-directory -SRCFILES = Makefile $(HFILES) $(CFILES) $(LSRCFILES) $(LFILES) $(YFILES) - -DEPDIRT = dep dep.bak -MANDIRT = *.[1-9].gz -PODIRT = *.tmpo *.mo -CDIRT = $(OBJECTS) $(LTOBJECTS) $(LTCOMMAND) $(LTLIBRARY) -DIRT = $(LDIRT) $(DEPDIRT) $(MANDIRT) $(PODIRT) $(CDIRT) - -OBJECTS = $(ASFILES:.s=.o) \ - $(CFILES:.c=.o) \ - $(LFILES:.l=.o) \ - $(YFILES:%.y=%.tab.o) - -INSTALL = $(TOPDIR)/include/install-sh -o $(PKG_USER) -g $(PKG_GROUP) - -IMAGES_DIR = $(TOPDIR)/all-images -DIST_DIR = $(TOPDIR)/dist - -CCF = $(CC) $(CFLAGS) $(CPPFLAGS) -MAKEF = $(MAKE) $(MAKEOPTS) -CXXF = $(CXX) $(CXXFLAGS) - -# For libtool. -LIBNAME = $(basename $(LTLIBRARY)) -LTOBJECTS = $(OBJECTS:.o=.lo) -LTVERSION = $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) - -LTLINK = $(LIBTOOL) --mode=link $(CC) -LTEXEC = $(LIBTOOL) --mode=execute -LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CCF) - -ifeq ($(ENABLE_SHARED),yes) -LTLDFLAGS += -rpath $(PKG_LIB_DIR) -LTLDFLAGS += -version-info $(LTVERSION) -endif - -ifeq ($(ENABLE_SHARED),yes) -INSTALL_LTLIB = \ - cd $(TOPDIR)/$(LIBNAME)/.libs; \ - ../$(INSTALL) -m 755 -d $(PKG_LIB_DIR); \ - ../$(INSTALL) -m 644 -T so_dot_version $(LIBNAME).lai $(PKG_LIB_DIR); \ - ../$(INSTALL) -T so_dot_current $(LIBNAME).lai $(PKG_LIB_DIR) -endif - -# Libtool thinks the static and shared libs should be in the same dir, so -# make the static lib appear in the place we chose as rpath (using the two -# symlinks below). -# Other things want the shared libs to appear in /usr/lib, else they'll -# link with the static libs there. So, another symlink to get the .so into -# /usr/lib. -ifeq ($(ENABLE_SHARED),yes) -INSTALL_LTLIB_DEV = \ - cd $(TOPDIR)/$(LIBNAME)/.libs; \ - ../$(INSTALL) -m 755 -d $(PKG_DEVLIB_DIR); \ - ../$(INSTALL) -m 644 -T old_lib $(LIBNAME).lai $(PKG_DEVLIB_DIR); \ - ../$(INSTALL) -m 644 $(LIBNAME).lai $(PKG_DEVLIB_DIR)/$(LIBNAME).la ; \ - ../$(INSTALL) -m 755 -d $(PKG_LIB_DIR); \ - ../$(INSTALL) -T so_base $(LIBNAME).lai $(PKG_LIB_DIR); \ - if test "x$(PKG_DEVLIB_DIR)" != "x$(PKG_LIB_DIR)" ; then \ - ../$(INSTALL) -S $(PKG_DEVLIB_DIR)/$(LIBNAME).a $(PKG_LIB_DIR)/$(LIBNAME).a; \ - ../$(INSTALL) -S $(PKG_DEVLIB_DIR)/$(LIBNAME).la $(PKG_LIB_DIR)/$(LIBNAME).la; \ - ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).so $(PKG_DEVLIB_DIR)/$(LIBNAME).so; \ - fi -else -INSTALL_LTLIB_DEV = $(INSTALL_LTLIB_STATIC) -endif - -INSTALL_LTLIB_STATIC = \ - cd $(TOPDIR)/$(LIBNAME)/.libs; \ - ../$(INSTALL) -m 755 -d $(PKG_DEVLIB_DIR); - -INSTALL_MAN = \ - @for d in $(MAN_PAGES); do \ - first=true; \ - for m in `$(AWK) \ - '/^\.S[h|H] NAME/ {ok=1; next} ok {print; exit}' $$d \ - | $(SED) \ - -e 's/^\.Nm //' -e 's/,/ /g' -e 's/\\-.*//' \ - -e 's/\\\f[0-9]//g' -e 's/ / /g;q'`; \ - do \ - [ -z "$$m" -o "$$m" = "\\" ] && continue; \ - t=$(MAN_DEST)/$$m.$(MAN_SECTION); \ - if $$first; then \ - if $(HAVE_ZIPPED_MANPAGES); then \ - $(ZIP) -9 -c $$d > $$d.gz; _sfx=.gz; \ - fi; \ - u=$$m.$(MAN_SECTION)$$_sfx; \ - echo $(INSTALL) -m 644 $${d}$$_sfx $${t}$$_sfx;\ - $(INSTALL) -m 644 $${d}$$_sfx $${t}$$_sfx; \ - else \ - echo $(INSTALL) -S $$u $${t}$$_sfx; \ - $(INSTALL) -S $$u $${t}$$_sfx; \ - fi; \ - first=false; \ - done; \ - done - -ifeq ($(ENABLE_GETTEXT),yes) -INSTALL_LINGUAS = \ - @for l in $(LINGUAS) ""; do \ - if test -f "$$l.mo" ; then \ - ldir=$(PKG_LOCALE_DIR)/$$l/LC_MESSAGES; \ - $(INSTALL) -m 755 -d $$ldir; \ - $(INSTALL) -m 644 $$l.mo $$ldir/$(PKG_NAME).mo; \ - fi; \ - done -endif - -MAN_MAKERULE = \ - @for f in *.[12345678] ""; do \ - if test ! -z "$$f"; then \ - $(ZIP) --best -c < $$f > $$f.gz; \ - fi; \ - done - -DIST_MAKERULE = \ - $(MAKEF) -C build dist - -SOURCE_MAKERULE = \ - @test -z "$$DIR" && DIR="."; \ - for f in $(SRCFILES) ""; do \ - test -z "$$f" && break; \ - test -L "$$f" || $(ECHO) $$DIR/$$f; \ - done; \ - for d in `echo $(SUBDIRS)` ""; do \ - test -z "$$d" && break; \ - if test -d "$$d"; then \ - $(MAKEF) DIR=$$DIR/$$d -C $$d $@ || exit $$?; \ - fi; \ - done diff --git a/include/buildrules b/include/buildrules deleted file mode 100644 index 159d70c..0000000 --- a/include/buildrules +++ /dev/null @@ -1,104 +0,0 @@ -# -# Copyright (c) 1999, 2001-2003 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -ifndef _BUILDRULES_INCLUDED_ -_BUILDRULES_INCLUDED_ = 1 - -include $(TOPDIR)/include/builddefs - -clean clobber : $(addsuffix -clean,$(SUBDIRS)) - rm -f $(DIRT) - @rm -fr .libs - -%-clean: - $(MAKE) -C $* clean - -# Never blow away subdirs -ifdef SUBDIRS -.PRECIOUS: $(SUBDIRS) -.PHONY: $(SUBDIRS) - -$(SUBDIRS): - $(MAKE) -C $@ -endif - -# -# Standard targets -# - -ifdef LTCOMMAND -$(LTCOMMAND) : $(SUBDIRS) $(OBJECTS) $(LTDEPENDENCIES) - $(LTLINK) -o $@ $(LDFLAGS) $(OBJECTS) $(LDLIBS) -endif - -ifdef LTLIBRARY -$(LTLIBRARY) : $(SUBDIRS) $(LTOBJECTS) - $(LTLINK) $(LTLDFLAGS) -o $(LTLIBRARY) $(LTOBJECTS) $(LTLIBS) - -%.lo: %.c - $(LTCOMPILE) -c $< -endif - -ifdef POTHEAD -%.pot: $(XGETTEXTFILES) - $(XGETTEXT) --language=C --keyword=_ -o $@ $(XGETTEXTFILES) - -# Generate temp .po files, to check whether translations need updating. -# Not by default, due to gettext output differences between versions. -%.po: $(POTHEAD) -# $(MSGMERGE) -o $@.tmpo $@ $(POTHEAD) -# if ! diff $@.tmpo $@ >/dev/null; then echo "$@ dated, see $@.tmpo"; fi - -%.mo: %.po - $(MSGFMT) -o $@ $< -endif - -source : - $(SOURCE_MAKERULE) - -endif # _BUILDRULES_INCLUDED_ - -$(_FORCE): - -.PHONY : depend - -DEPENDSCRIPT := $(MAKEDEPEND) $(DEPENDFLAGS) -f - -- $(CFLAGS) -- $(CFILES) | \ - $(SED) -e 's,`pwd`,$(TOPDIR),g' \ - -e 's, */[^ ]*,,g' \ - -e '/^[^ ]*: *$$/d' \ - -e '/^ *$$/d' - -ifdef LTLIBRARY -DEPENDSCRIPT := $(DEPENDSCRIPT) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' -endif - -depend : $(CFILES) $(HFILES) $(addsuffix -depend,$(SUBDIRS)) - $(DEPENDSCRIPT) > .dep - test -s .dep || rm -f .dep - -%-depend: - $(MAKE) -C $* depend - -# Include dep, but only if it exists -ifeq ($(shell test -f .dep && echo .dep), .dep) -include .dep -else -ifdef LTLIBRARY -$(LTOBJECTS): $(HFILES) -else -$(OBJECTS): $(HFILES) -endif -endif diff --git a/include/config.h.in b/include/config.h.in deleted file mode 100644 index 6a720ac..0000000 --- a/include/config.h.in +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2002 Silicon Graphics, Inc. All Rights Reserved. - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * @configure_input@ - */ - -/* Define if you have the attr/error_context.h header */ -#undef HAVE_ATTR_ERROR_CONTEXT_H - -/* Define if you want Posix compliant getfacl and setfacl utilities - without extensions */ -#undef POSIXLY_CORRECT - -/* The number of bytes in a int. */ -#undef SIZEOF_INT - -/* The number of bytes in a long. */ -#undef SIZEOF_LONG - -/* The number of bytes in a short. */ -#undef SIZEOF_SHORT - -/* Define if you have attribute((visibility(hidden))) in gcc. */ -#undef HAVE_VISIBILITY_ATTRIBUTE - -/* Define if you want gettext (I18N) support */ -#undef ENABLE_GETTEXT - -/* On GNU/kFreeBSD, ENODATA is not defined in the system headers */ -#include -#ifndef ENODATA -# define ENODATA ENOATTR -#endif diff --git a/include/install-sh b/include/install-sh deleted file mode 100755 index 3c9d49b..0000000 --- a/include/install-sh +++ /dev/null @@ -1,365 +0,0 @@ -#! /bin/sh -# -# Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# This script emulates bsd install and also recognises -# two environment variables, with the following semantics :- -# -# $DIST_MANIFEST - if set, the name of the file to append manifest -# information in the following format: -# File : f mode owner group src target -# Directory: d mode owner group target -# Symlink : l linkval target -# -# $DIST_ROOT - if set, prepend to target -# -# The sematics of all combinations of these two variables -# are as follows: -# -# $DIST_MANIFEST? $DIST_ROOT? | Copy? Append Manifest? -# -----------------------------+-------------------------- -# not set not set | yes no -# not set set | yes no -# set not set | no yes -# set set | yes yes -# -_usage() { - echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory" - echo "or $prog [-D] [-o owner] [-g group] [-m mode] file directory/file" - echo "or $prog [-o owner] [-g group] [-m mode] file [file ...] directory" - echo "or $prog -S file target (creates \"target\" symlink)" - echo "or $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory" - echo "" - echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the" - echo "behaviour of this command - see comments in the script." - echo "The -D flag is only available for the second usage, and causes" - echo "the target directory to be created before installing the file." - echo "" - exit 1 -} - -_chown () -{ - _st=255 - if [ $# -eq 3 ] ; then - chown $1:$2 $3 - _st=$? - if [ $_st -ne 0 ] ; then - if [ $REAL_UID != '0' ] ; then - if [ ! -f $DIST_ROOT/.chown.quiet ] ; then - echo '===============================================' - echo Ownership of files under ${DIST_ROOT:-/} - echo cannot be changed - echo '===============================================' - if [ -n "$DIST_ROOT" ] ; then - touch $DIST_ROOT/.chown.quiet - fi - fi - _st=0 - fi - fi - fi - - return $_st -} - - -_manifest () -{ - echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null} -} - -prog=`basename $0` -HERE=`pwd` -dflag=false -Dflag=false -Sflag=false -Tflag=false -DIRMODE=755 -FILEMODE=644 -OWNER=`id -u` -GROUP=`id -g` -REAL_UID=$OWNER - -# default is to install and don't append manifest -INSTALL=true -MANIFEST=: - -: ${DIST_ROOT:=${DESTDIR}} - -[ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false -[ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest" - -[ $# -eq 0 ] && _usage - -if $INSTALL -then - CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown -else - CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true -fi - -[ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true - -while getopts "Dcm:d:S:o:g:T:" c $* -do - case $c in - c) - ;; - g) - GROUP=$OPTARG - ;; - o) - OWNER=$OPTARG - ;; - m) - DIRMODE=`expr $OPTARG` - FILEMODE=$DIRMODE - ;; - D) - Dflag=true - ;; - S) - symlink=$OPTARG - Sflag=true - ;; - d) - dir=$DIST_ROOT/$OPTARG - dflag=true - ;; - T) - lt_install=$OPTARG - Tflag=true - ;; - *) - _usage - ;; - esac -done - -shift `expr $OPTIND - 1` - -status=0 -if $dflag -then - # - # first usage - # - $MKDIR -p $dir - status=$? - if [ $status -eq 0 ] - then - $CHMOD $DIRMODE $dir - status=$? - fi - if [ $status -eq 0 ] - then - $CHOWN $OWNER $GROUP $dir - status=$? - fi - $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT} -elif $Sflag -then - # - # fourth usage (symlink) - # - if [ $# -ne 1 ] - then - _usage - else - target=$DIST_ROOT/$1 - fi - $LN -s -f $symlink $target - status=$? - $MANIFEST l $symlink ${target#$DIST_ROOT} -elif $Tflag -then - # - # -T (install libs built by libtool) - # - if [ $# -ne 2 ] - then - _usage - else - libtool_lai=$1 - # source the libtool variables - if [ ! -f $libtool_lai ] - then - echo "$prog: Unable to find libtool library file $libtool_lai" - exit 2 - fi - . ./$libtool_lai - target=$DIST_ROOT/$2 - fi - case $lt_install in - so_dot_version) - # Loop until we find libfoo.so.x.y.z, then break out. - for solib in $library_names - do - # does it have enough parts? libfoo.so.x.y.z == 5 - cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w` - if [ $cnt -eq 5 ] - then - install_name=$target/$solib - $CP $solib $install_name - status=$? - $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT} - break - fi - done - ;; - - so_*) - case $lt_install in - so_dot_current) - # ln -s libfoo.so.x.y.z to libfoo.so.x - from_parts=5 # libfoo.so.x.y.z - to_parts=3 # libfoo.so.x - ;; - so_base) - # ln -s libfoo.so.x to libfoo.so - from_parts=3 # libfoo.so.x - to_parts=2 # libfoo.so - ;; - *) - echo "$prog: -T $lt_install invalid" - exit 2 - ;; - esac - - # Loop until we find the names, then break out. - for solib in $library_names - do - # does it have enough parts? - cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w` - if [ $cnt -eq $from_parts ] - then - from_name=$solib - elif [ $cnt -eq $to_parts ] - then - to_name=$solib - fi - - if [ -n "$from_name" ] && [ -n "$to_name" ] - then - install_name=$target/$to_name - $LN -s -f $from_name $install_name - status=$? - $MANIFEST l $from_name ${install_name#$DIST_ROOT} - break - fi - done - ;; - old_lib) - install_name=$target/$old_library - $CP $old_library $install_name - status=$? - $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT} - ;; - *) - echo "$prog: -T $lt_install invalid" - exit 2 - ;; - esac - - case $lt_install in - old_lib|so_dot_version) - if [ $status -eq 0 ] - then - $CHMOD $FILEMODE $install_name - $CHOWN $OWNER $GROUP $install_name - fi - ;; - esac - -else - list="" - dir="" - if [ $# -eq 2 ] - then - # - # second usage - # - f=$1 - dir=$DIST_ROOT/$2 - if $Dflag - then - mkdir -p `dirname $dir` - fi - $CP $f $dir - status=$? - if [ $status -eq 0 ] - then - if [ -f $dir/$f ] - then - $CHMOD $FILEMODE $dir/$f - status=$? - if [ $status -eq 0 ] - then - $CHOWN $OWNER $GROUP $dir/$f - status=$? - fi - $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f - else - $CHMOD $FILEMODE $dir - status=$? - if [ $status -eq 0 ] - then - $CHOWN $OWNER $GROUP $dir - status=$? - fi - $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT} - fi - fi - else - # - # third usage - # - n=1 - while [ $# -gt 0 ] - do - if [ $# -gt 1 ] - then - list="$list $1" - else - dir=$DIST_ROOT/$1 - fi - shift - done - - # echo DIR=$dir list=\"$list\" - for f in $list - do - $CP $f $dir - status=$? - if [ $status -eq 0 ] - then - $CHMOD $FILEMODE $dir/$f - status=$? - if [ $status -eq 0 ] - then - $CHOWN $OWNER $GROUP $dir/$f - status=$? - fi - $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f - fi - [ $status -ne 0 ] && break - done - fi -fi - -exit $status diff --git a/libacl/Makefile b/libacl/Makefile deleted file mode 100644 index 6befcd4..0000000 --- a/libacl/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. - -LTLDFLAGS += -Wl,--version-script,$(TOPDIR)/exports -include $(TOPDIR)/include/builddefs - -LTLIBRARY = libacl.la -LTLIBS = -lattr $(LIBMISC) -LTDEPENDENCIES = $(LIBMISC) -LT_CURRENT = 2 -LT_REVISION = 0 -LT_AGE = 1 - -CFILES = $(POSIX_CFILES) $(LIBACL_CFILES) $(INTERNAL_CFILES) \ - perm_copy_fd.c perm_copy_file.c -HFILES = libobj.h libacl.h byteorder.h __acl_from_xattr.h __acl_to_xattr.h \ - perm_copy.h __acl_extended_file.h - -LCFLAGS = -include perm_copy.h - -POSIX_CFILES = \ - acl_add_perm.c acl_calc_mask.c acl_clear_perms.c acl_copy_entry.c \ - acl_copy_ext.c acl_copy_int.c acl_create_entry.c acl_delete_def_file.c \ - acl_delete_entry.c acl_delete_perm.c acl_dup.c acl_free.c \ - acl_from_text.c acl_get_entry.c acl_get_fd.c acl_get_file.c \ - acl_get_perm.c acl_get_permset.c acl_get_qualifier.c \ - acl_get_tag_type.c acl_init.c acl_set_fd.c acl_set_file.c \ - acl_set_permset.c acl_set_qualifier.c acl_set_tag_type.c acl_to_text.c \ - acl_valid.c acl_size.c - -LIBACL_CFILES = \ - acl_to_any_text.c acl_entries.c acl_check.c acl_error.c acl_cmp.c \ - acl_extended_fd.c acl_extended_file.c acl_equiv_mode.c acl_from_mode.c \ - acl_extended_file_nofollow.c __acl_extended_file.c - -INTERNAL_CFILES = \ - __acl_to_any_text.c __acl_to_xattr.c __acl_from_xattr.c \ - __acl_reorder_obj_p.c __libobj.c __apply_mask_to_mode.c - - -default: $(LTLIBRARY) - -include $(BUILDRULES) - -install: - -install-dev: default - $(INSTALL_LTLIB_DEV) - -install-lib: default - $(INSTALL_LTLIB) diff --git a/libacl/Makemodule.am b/libacl/Makemodule.am new file mode 100644 index 0000000..c35214c --- /dev/null +++ b/libacl/Makemodule.am @@ -0,0 +1,81 @@ +lib_LTLIBRARIES += libacl.la + +# No other library exports version info, otherwise we'd have to add +# "libacl_" prefix to all these variables. +LT_CURRENT = 2 +# The configure script will set this for us automatically. +#LT_REVISION = +LT_AGE = 1 +LTVERSION = $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) + +CFILES = $(POSIX_CFILES) $(LIBACL_CFILES) $(INTERNAL_CFILES) \ + libacl/perm_copy_fd.c \ + libacl/perm_copy_file.c +HFILES = \ + libacl/libobj.h \ + libacl/libacl.h \ + libacl/byteorder.h \ + libacl/__acl_from_xattr.h \ + libacl/__acl_to_xattr.h \ + libacl/perm_copy.h \ + libacl/__acl_extended_file.h + +POSIX_CFILES = \ + libacl/acl_add_perm.c \ + libacl/acl_calc_mask.c \ + libacl/acl_clear_perms.c \ + libacl/acl_copy_entry.c \ + libacl/acl_copy_ext.c \ + libacl/acl_copy_int.c \ + libacl/acl_create_entry.c \ + libacl/acl_delete_def_file.c \ + libacl/acl_delete_entry.c \ + libacl/acl_delete_perm.c \ + libacl/acl_dup.c \ + libacl/acl_free.c \ + libacl/acl_from_text.c \ + libacl/acl_get_entry.c \ + libacl/acl_get_fd.c \ + libacl/acl_get_file.c \ + libacl/acl_get_perm.c \ + libacl/acl_get_permset.c \ + libacl/acl_get_qualifier.c \ + libacl/acl_get_tag_type.c \ + libacl/acl_init.c \ + libacl/acl_set_fd.c \ + libacl/acl_set_file.c \ + libacl/acl_set_permset.c \ + libacl/acl_set_qualifier.c \ + libacl/acl_set_tag_type.c \ + libacl/acl_size.c \ + libacl/acl_to_text.c \ + libacl/acl_valid.c + +LIBACL_CFILES = \ + libacl/acl_check.c \ + libacl/acl_cmp.c \ + libacl/acl_entries.c \ + libacl/acl_equiv_mode.c \ + libacl/acl_error.c \ + libacl/acl_extended_fd.c \ + libacl/acl_extended_file.c \ + libacl/acl_extended_file_nofollow.c \ + libacl/acl_from_mode.c \ + libacl/acl_to_any_text.c \ + libacl/__acl_extended_file.c + +INTERNAL_CFILES = \ + libacl/__acl_from_xattr.c \ + libacl/__acl_reorder_obj_p.c \ + libacl/__acl_to_any_text.c \ + libacl/__acl_to_xattr.c \ + libacl/__apply_mask_to_mode.c \ + libacl/__libobj.c + +libacl_la_DEPENDENCIES = exports libmisc.la +libacl_la_SOURCES = $(CFILES) $(HFILES) +libacl_la_LIBADD = -lattr libmisc.la +libacl_la_CFLAGS = $(AM_CFLAGS) -include $(srcdir)/libacl/perm_copy.h +libacl_la_LDFLAGS = \ + -Wl,--version-script,$(top_srcdir)/exports \ + -version-info $(LTVERSION) diff --git a/libmisc/Makefile b/libmisc/Makefile deleted file mode 100644 index e64a287..0000000 --- a/libmisc/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) 2000, 2002 Silicon Graphics, Inc. All Rights Reserved. -# Copyright (C) 2009 Andreas Gruenbacher -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LTLIBRARY = libmisc.la -LTLDFLAGS = - -CFILES = quote.c unquote.c high_water_alloc.c next_line.c walk_tree.c - -default: $(LTLIBRARY) -install install-dev install-lib: - -include $(BUILDRULES) - diff --git a/libmisc/Makemodule.am b/libmisc/Makemodule.am new file mode 100644 index 0000000..d784622 --- /dev/null +++ b/libmisc/Makemodule.am @@ -0,0 +1,8 @@ +noinst_LTLIBRARIES += libmisc.la + +libmisc_la_SOURCES = \ + libmisc/high_water_alloc.c \ + libmisc/next_line.c \ + libmisc/quote.c \ + libmisc/unquote.c \ + libmisc/walk_tree.c diff --git a/m4/.gitignore b/m4/.gitignore new file mode 100644 index 0000000..73d27ec --- /dev/null +++ b/m4/.gitignore @@ -0,0 +1,3 @@ +!.gitignore +!package_attrdev.m4 +!visibility_hidden.m4 diff --git a/m4/Makefile b/m4/Makefile deleted file mode 100644 index 9748f11..0000000 --- a/m4/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LSRCFILES = \ - manual_format.m4 \ - package_attrdev.m4 \ - package_globals.m4 \ - package_utilies.m4 \ - visibility_hidden.m4 \ - multilib.m4 - -default: - -include $(BUILDRULES) - -install install-dev install-lib: default diff --git a/m4/manual_format.m4 b/m4/manual_format.m4 deleted file mode 100644 index 34aa466..0000000 --- a/m4/manual_format.m4 +++ /dev/null @@ -1,31 +0,0 @@ -dnl Copyright (C) 2003 Silicon Graphics, Inc. -dnl -dnl This program is free software: you can redistribute it and/or modify it -dnl under the terms of the GNU General Public License as published by -dnl the Free Software Foundation, either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with this program. If not, see . -# -# Find format of installed man pages. -# Always gzipped on Debian, but not Redhat pre-7.0. -# We don't deal with bzip2'd man pages, which Mandrake uses, -# someone will send us a patch sometime hopefully. :-) -# -AC_DEFUN([AC_MANUAL_FORMAT], - [ have_zipped_manpages=false - for d in ${prefix}/share/man ${prefix}/man ; do - if test -f $d/man1/man.1.gz - then - have_zipped_manpages=true - break - fi - done - AC_SUBST(have_zipped_manpages) - ]) diff --git a/m4/multilib.m4 b/m4/multilib.m4 deleted file mode 100644 index 8d991d8..0000000 --- a/m4/multilib.m4 +++ /dev/null @@ -1,43 +0,0 @@ -# The AC_MULTILIB macro was extracted and modified from -# gettext-0.15's AC_LIB_PREPARE_MULTILIB macro in the lib-prefix.m4 file -# so that the correct paths can be used for 64-bit libraries. -# -dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. -dnl From Bruno Haible. - -dnl AC_MULTILIB creates a variable libdirsuffix, containing -dnl the suffix of the libdir, either "" or "64". -dnl Only do this if the given enable parameter is "yes". -AC_DEFUN([AC_MULTILIB], -[ - dnl There is no formal standard regarding lib and lib64. The current - dnl practice is that on a system supporting 32-bit and 64-bit instruction - dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit - dnl libraries go under $prefix/lib. We determine the compiler's default - dnl mode by looking at the compiler's library search path. If at least - dnl of its elements ends in /lib64 or points to a directory whose absolute - dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the - dnl default, namely "lib". - enable_lib64="$1" - libdirsuffix="" - searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` - if test "$enable_lib64" = "yes" -a -n "$searchpath"; then - save_IFS="${IFS= }"; IFS=":" - for searchdir in $searchpath; do - if test -d "$searchdir"; then - case "$searchdir" in - */lib64/ | */lib64 ) libdirsuffix=64 ;; - *) searchdir=`cd "$searchdir" && pwd` - case "$searchdir" in - */lib64 ) libdirsuffix=64 ;; - esac ;; - esac - fi - done - IFS="$save_IFS" - fi - AC_SUBST(libdirsuffix) -]) diff --git a/m4/package_globals.m4 b/m4/package_globals.m4 deleted file mode 100644 index e5c2418..0000000 --- a/m4/package_globals.m4 +++ /dev/null @@ -1,61 +0,0 @@ -dnl Copyright (C) 2003, 2005, 2006, 2007 Silicon Graphics, Inc. -dnl -dnl This program is free software: you can redistribute it and/or modify it -dnl under the terms of the GNU General Public License as published by -dnl the Free Software Foundation, either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with this program. If not, see . -# -# Generic macro, sets up all of the global packaging variables. -# The following environment variables may be set to override defaults: -# DEBUG OPTIMIZER MALLOCLIB PLATFORM DISTRIBUTION INSTALL_USER INSTALL_GROUP -# BUILD_VERSION -# -AC_DEFUN([AC_PACKAGE_GLOBALS], - [ pkg_name="$1" - AC_SUBST(pkg_name) - - AC_PROG_CC - - . ./VERSION - pkg_version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION} - AC_SUBST(pkg_version) - pkg_release=$PKG_BUILD - test -z "$BUILD_VERSION" || pkg_release="$BUILD_VERSION" - AC_SUBST(pkg_release) - - DEBUG=${DEBUG:-'-DDEBUG'} dnl -DNDEBUG - debug_build="$DEBUG" - AC_SUBST(debug_build) - - OPTIMIZER=${OPTIMIZER:-'-g -O2'} - opt_build="$OPTIMIZER" - AC_SUBST(opt_build) - - MALLOCLIB=${MALLOCLIB:-''} dnl /usr/lib/libefence.a - malloc_lib="$MALLOCLIB" - AC_SUBST(malloc_lib) - - pkg_user=`id -u -n` - test -z "$INSTALL_USER" || pkg_user="$INSTALL_USER" - AC_SUBST(pkg_user) - - pkg_group=`id -g -n` - test -z "$INSTALL_GROUP" || pkg_group="$INSTALL_GROUP" - AC_SUBST(pkg_group) - - pkg_distribution=`uname -s` - test -z "$DISTRIBUTION" || pkg_distribution="$DISTRIBUTION" - AC_SUBST(pkg_distribution) - - pkg_platform=`uname -s | tr 'A-Z' 'a-z' | sed -e 's/irix64/irix/'` - test -z "$PLATFORM" || pkg_platform="$PLATFORM" - AC_SUBST(pkg_platform) - ]) diff --git a/m4/package_utilies.m4 b/m4/package_utilies.m4 deleted file mode 100644 index e372a6b..0000000 --- a/m4/package_utilies.m4 +++ /dev/null @@ -1,95 +0,0 @@ -dnl Copyright (C) 2003, 2004, 2005, 2006, 2007 Silicon Graphics, Inc. -dnl -dnl This program is free software: you can redistribute it and/or modify it -dnl under the terms of the GNU General Public License as published by -dnl the Free Software Foundation, either version 2 of the License, or -dnl (at your option) any later version. -dnl -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with this program. If not, see . -# -# Check for specified utility (env var) - if unset, fail. -# -AC_DEFUN([AC_PACKAGE_NEED_UTILITY], - [ if test -z "$2"; then - echo - echo FATAL ERROR: $3 does not seem to be installed. - echo $1 cannot be built without a working $4 installation. - exit 1 - fi - ]) - -# -# Generic macro, sets up all of the global build variables. -# The following environment variables may be set to override defaults: -# CC MAKE LIBTOOL TAR ZIP MAKEDEPEND AWK SED ECHO SORT -# MSGFMT MSGMERGE XGETTEXT -# -AC_DEFUN([AC_PACKAGE_UTILITIES], - [ AC_PROG_CC - cc="$CC" - AC_SUBST(cc) - AC_PACKAGE_NEED_UTILITY($1, "$cc", cc, [C compiler]) - - search_path="$PATH$PATH_SEPARATOR/usr/freeware/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR/usr/local/bin" - - AC_PATH_PROGS(MAKE, gmake make,, $search_path) - make=$MAKE - AC_SUBST(make) - AC_PACKAGE_NEED_UTILITY($1, "$make", make, [GNU make]) - - AC_PATH_PROG(TAR, tar,, $search_path) - tar=$TAR - AC_SUBST(tar) - - AC_PATH_PROG(ZIP, gzip,, $search_path) - zip=$ZIP - AC_SUBST(zip) - - AC_PATH_PROG(MAKEDEPEND, makedepend, /bin/true) - makedepend=$MAKEDEPEND - AC_SUBST(makedepend) - - AC_PATH_PROG(AWK, awk,, $search_path) - awk=$AWK - AC_SUBST(awk) - - AC_PATH_PROG(SED, sed,, $search_path) - sed=$SED - AC_SUBST(sed) - - AC_PATH_PROG(ECHO, echo,, $search_path) - echo=$ECHO - AC_SUBST(echo) - - AC_PATH_PROG(SORT, sort,, $search_path) - sort=$SORT - AC_SUBST(sort) - - dnl check if symbolic links are supported - AC_PROG_LN_S - - if test "$enable_gettext" = yes; then - AC_PATH_PROG(MSGFMT, msgfmt,, $search_path) - msgfmt=$MSGFMT - AC_SUBST(msgfmt) - AC_PACKAGE_NEED_UTILITY($1, "$msgfmt", msgfmt, gettext) - - AC_PATH_PROG(MSGMERGE, msgmerge,, $search_path) - msgmerge=$MSGMERGE - AC_SUBST(msgmerge) - AC_PACKAGE_NEED_UTILITY($1, "$msgmerge", msgmerge, gettext) - - AC_PATH_PROG(XGETTEXT, xgettext,, $search_path) - xgettext=$XGETTEXT - AC_SUBST(xgettext) - AC_PACKAGE_NEED_UTILITY($1, "$xgettext", xgettext, gettext) - - AC_DEFINE([ENABLE_GETTEXT], 1, [enable gettext]) - fi - ]) diff --git a/man/Makefile b/man/Makefile deleted file mode 100644 index a2e7546..0000000 --- a/man/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -SUBDIRS = man1 man3 man5 - -default : $(SUBDIRS) - -install : $(addsuffix -install,$(SUBDIRS)) - -install-dev : $(addsuffix -install-dev,$(SUBDIRS)) - -install-lib: $(addsuffix -install-lib,$(SUBDIRS)) - -%-install: - $(MAKE) -C $* install - -%-install-dev: - $(MAKE) -C $* install-dev - -%-install-lib: - $(MAKE) -C $* install-lib - -include $(BUILDRULES) diff --git a/man/Makemodule.am b/man/Makemodule.am new file mode 100644 index 0000000..c18576c --- /dev/null +++ b/man/Makemodule.am @@ -0,0 +1,3 @@ +include man/man1/Makemodule.am +include man/man3/Makemodule.am +include man/man5/Makemodule.am diff --git a/man/man1/Makefile b/man/man1/Makefile deleted file mode 100644 index 2fd48eb..0000000 --- a/man/man1/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = ../.. -include $(TOPDIR)/include/builddefs - -MAN_SECTION = 1 - -MAN_PAGES = $(shell echo *.$(MAN_SECTION)) -MAN_DEST = $(PKG_MAN_DIR)/man$(MAN_SECTION) -LSRCFILES = $(MAN_PAGES) - -default : $(MAN_PAGES) - -include $(BUILDRULES) - -install : default - $(INSTALL) -m 755 -d $(MAN_DEST) - $(INSTALL_MAN) -install-dev install-lib: diff --git a/man/man1/Makemodule.am b/man/man1/Makemodule.am new file mode 100644 index 0000000..f80e26a --- /dev/null +++ b/man/man1/Makemodule.am @@ -0,0 +1,4 @@ +dist_man_MANS += \ + man/man1/chacl.1 \ + man/man1/getfacl.1 \ + man/man1/setfacl.1 diff --git a/man/man3/Makefile b/man/man3/Makefile deleted file mode 100644 index c00f02d..0000000 --- a/man/man3/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = ../.. -include $(TOPDIR)/include/builddefs - -MAN_SECTION = 3 - -MAN_PAGES = $(shell echo *.$(MAN_SECTION)) -MAN_DEST = $(PKG_MAN_DIR)/man$(MAN_SECTION) -LSRCFILES = $(MAN_PAGES) - -default : $(MAN_PAGES) - -include $(BUILDRULES) - -install-dev : default - $(INSTALL) -m 755 -d $(MAN_DEST) - $(INSTALL_MAN) -install install-lib: diff --git a/man/man3/Makemodule.am b/man/man3/Makemodule.am new file mode 100644 index 0000000..c0c4825 --- /dev/null +++ b/man/man3/Makemodule.am @@ -0,0 +1,40 @@ +dist_man_MANS += \ + man/man3/acl_add_perm.3 \ + man/man3/acl_calc_mask.3 \ + man/man3/acl_check.3 \ + man/man3/acl_clear_perms.3 \ + man/man3/acl_cmp.3 \ + man/man3/acl_copy_entry.3 \ + man/man3/acl_copy_ext.3 \ + man/man3/acl_copy_int.3 \ + man/man3/acl_create_entry.3 \ + man/man3/acl_delete_def_file.3 \ + man/man3/acl_delete_entry.3 \ + man/man3/acl_delete_perm.3 \ + man/man3/acl_dup.3 \ + man/man3/acl_entries.3 \ + man/man3/acl_equiv_mode.3 \ + man/man3/acl_error.3 \ + man/man3/acl_extended_fd.3 \ + man/man3/acl_extended_file.3 \ + man/man3/acl_extended_file_nofollow.3 \ + man/man3/acl_free.3 \ + man/man3/acl_from_mode.3 \ + man/man3/acl_from_text.3 \ + man/man3/acl_get_entry.3 \ + man/man3/acl_get_fd.3 \ + man/man3/acl_get_file.3 \ + man/man3/acl_get_perm.3 \ + man/man3/acl_get_permset.3 \ + man/man3/acl_get_qualifier.3 \ + man/man3/acl_get_tag_type.3 \ + man/man3/acl_init.3 \ + man/man3/acl_set_fd.3 \ + man/man3/acl_set_file.3 \ + man/man3/acl_set_permset.3 \ + man/man3/acl_set_qualifier.3 \ + man/man3/acl_set_tag_type.3 \ + man/man3/acl_size.3 \ + man/man3/acl_to_any_text.3 \ + man/man3/acl_to_text.3 \ + man/man3/acl_valid.3 diff --git a/man/man5/Makefile b/man/man5/Makefile deleted file mode 100644 index 51de8d9..0000000 --- a/man/man5/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = ../.. -include $(TOPDIR)/include/builddefs - -MAN_SECTION = 5 - -MAN_PAGES = $(shell echo *.$(MAN_SECTION)) -MAN_DEST = $(PKG_MAN_DIR)/man$(MAN_SECTION) -LSRCFILES = $(MAN_PAGES) - -default : $(MAN_PAGES) - -include $(BUILDRULES) - -install : default - $(INSTALL) -m 755 -d $(MAN_DEST) - $(INSTALL_MAN) -install-dev install-lib: diff --git a/man/man5/Makemodule.am b/man/man5/Makemodule.am new file mode 100644 index 0000000..7d053b8 --- /dev/null +++ b/man/man5/Makemodule.am @@ -0,0 +1,2 @@ +dist_man_MANS += \ + man/man5/acl.5 diff --git a/package/Makefile b/package/Makefile deleted file mode 100644 index 6f5aa69..0000000 --- a/package/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# -# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -MANIFEST=src-manifest -SRCTAR=$(PKG_NAME)-$(PKG_VERSION).src.tar.gz - -LDIRT = *-manifest *.gz $(TOPDIR)/$(PKG_NAME)-* - -# for clean and clobber -SUBDIRS = tar - -# nothing to build here (it's all packaging) -default install install-dev install-lib: - -include $(BUILDRULES) - -# Symlink in the TOPDIR is used to pack files relative to -# product-version directory. -$(MANIFEST) : $(_FORCE) - @if [ ! -L $(TOPDIR)/$(PKG_NAME)-$(PKG_VERSION) ] ; then \ - $(LN_S) . $(TOPDIR)/$(PKG_NAME)-$(PKG_VERSION) ; \ - fi - @CDIR=`pwd`; cd $(TOPDIR); \ - $(MAKE) --no-print-directory source | \ - sed -e 's/^\./$(PKG_NAME)-$(PKG_VERSION)/' > $$CDIR/$@ ;\ - if [ $$? -ne 0 ] ; then \ - exit 1; \ - else \ - unset TAPE; \ - $(TAR) -T $$CDIR/$@ -cf - | $(ZIP) --best > $$CDIR/$(SRCTAR); \ - echo Wrote: $$CDIR/$(SRCTAR); \ - fi - -dist : default $(MANIFEST) - @DIST_MANIFEST=`pwd`/bin-manifest; DIST_ROOT=/tmp/$$$$; \ - export DIST_MANIFEST DIST_ROOT; \ - rm -f $$DIST_MANIFEST; \ - echo === install === && $(MAKE) -C $(TOPDIR) install || exit $$?; \ - if [ -x $(TAR) ]; then \ - ( echo "=== tar ===" && $(MAKEF) -C tar $@ || exit $$? ); \ - fi; \ - test -z "$$KEEP_DIST_ROOT" || rm -rf $$DIST_ROOT; echo Done diff --git a/package/tar/Makefile b/package/tar/Makefile deleted file mode 100644 index 31c8f92..0000000 --- a/package/tar/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = ../.. -include $(TOPDIR)/include/builddefs - -BINTAR=$(PKG_NAME)-$(PKG_VERSION).tar.gz -LDIRT = *.gz - -default install install-dev install-lib: - -include $(BUILDRULES) - -dist : default - @HERE=`pwd`; cd $${DIST_ROOT:-/}; \ - $(SORT) -u $$HERE/../bin-manifest | $(AWK) ' \ - $$1 == "f" { printf (".%s\n", $$6); } \ - $$1 == "d" { next; } \ - $$1 == "l" { printf (".%s\n", $$3); }' \ - | $(TAR) -T - -cf - | $(ZIP) --best > $$HERE/$(BINTAR) - @echo Wrote: `pwd`/$(BINTAR) diff --git a/po/.gitignore b/po/.gitignore new file mode 100644 index 0000000..8fe225b --- /dev/null +++ b/po/.gitignore @@ -0,0 +1,12 @@ +*.gmo +*.sed +*.sin +acl.pot +Makefile.in.in +Makevars.template +POTFILES +POTFILES.in +Rules-quot +en@boldquot.* +en@quot.* +stamp-po diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..a1950c5 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,3 @@ +de es fr gl pl sv +en@boldquot +en@quot diff --git a/po/Makefile b/po/Makefile deleted file mode 100644 index 7cd5b61..0000000 --- a/po/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -POTHEAD = $(PKG_NAME).pot -LINGUAS ?= de es fr gl pl sv -LSRCFILES = $(LINGUAS:%=%.po) $(POTHEAD) -LDIRT = $(POTHEAD) - -XGETTEXTFILES = $(TOPDIR)/chacl/chacl.c \ - $(TOPDIR)/setfacl/do_set.c \ - $(TOPDIR)/setfacl/setfacl.c \ - $(TOPDIR)/getfacl/getfacl.c \ - $(TOPDIR)/libacl/acl_error.c \ - $(TOPDIR)/libacl/perm_copy_fd.c \ - $(TOPDIR)/libacl/perm_copy_file.c - -default: $(POTHEAD) $(LINGUAS:%=%.mo) - -include $(BUILDRULES) - -install: default - $(INSTALL_LINGUAS) - -install-dev install-lib: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..4b17ab3 --- /dev/null +++ b/po/Makevars @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Silicon Graphics, Inc. + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = $(PACKAGE_BUGREPORT) + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/update-potfiles b/po/update-potfiles new file mode 100755 index 0000000..271da7e --- /dev/null +++ b/po/update-potfiles @@ -0,0 +1,13 @@ +#!/bin/sh -e + +( +echo "# updated automatically by $0" +echo +find \ + include \ + libacl \ + libmisc \ + tools \ + -name '*.[ch]' \ + | grep -v include/config.h +) > po/POTFILES.in diff --git a/setfacl/Makefile b/setfacl/Makefile deleted file mode 100644 index c44e7c0..0000000 --- a/setfacl/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (c) 2000, 2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -LTCOMMAND = setfacl -CFILES = setfacl.c do_set.c sequence.c parse.c -HFILES = sequence.h parse.h do_set.h - -LLDLIBS = $(LIBMISC) $(LIBACL) $(LIBATTR) -LTDEPENDENCIES = $(LIBMISC) $(LIBACL) - -default: $(LTCOMMAND) - -include $(BUILDRULES) - -install: default - $(INSTALL) -m 755 -d $(PKG_BIN_DIR) - $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_BIN_DIR) -install-dev install-lib: diff --git a/setfacl/do_set.c b/setfacl/do_set.c deleted file mode 100644 index 60da837..0000000 --- a/setfacl/do_set.c +++ /dev/null @@ -1,528 +0,0 @@ -/* - File: do_set.c - (Linux Access Control List Management) - - Copyright (C) 1999, 2000 - Andreas Gruenbacher, - - This program 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 program 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. -*/ - -#include "config.h" -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include "misc.h" -#include "sequence.h" -#include "do_set.h" -#include "parse.h" -#include "walk_tree.h" - - -extern const char *progname; -extern int opt_recalculate; -extern int opt_test; -extern int print_options; - -acl_entry_t -find_entry( - acl_t acl, - acl_tag_t type, - id_t id) -{ - acl_entry_t ent; - acl_tag_t e_type; - id_t *e_id_p; - - if (acl_get_entry(acl, ACL_FIRST_ENTRY, &ent) != 1) - return NULL; - - for(;;) { - acl_get_tag_type(ent, &e_type); - if (type == e_type) { - if (id != ACL_UNDEFINED_ID) { - e_id_p = acl_get_qualifier(ent); - if (e_id_p == NULL) - return NULL; - if (*e_id_p == id) { - acl_free(e_id_p); - return ent; - } - acl_free(e_id_p); - } else { - return ent; - } - } - if (acl_get_entry(acl, ACL_NEXT_ENTRY, &ent) != 1) - return NULL; - } -} - -int -has_execute_perms( - acl_t acl) -{ - acl_entry_t ent; - - if (acl_get_entry(acl, ACL_FIRST_ENTRY, &ent) != 1) - return 0; - - for(;;) { - acl_permset_t permset; - - acl_get_permset(ent, &permset); - if (acl_get_perm(permset, ACL_EXECUTE) != 0) - return 1; - - if (acl_get_entry(acl, ACL_NEXT_ENTRY, &ent) != 1) - return 0; - } -} - -int -clone_entry( - acl_t from_acl, - acl_tag_t from_type, - acl_t *to_acl, - acl_tag_t to_type) -{ - acl_entry_t from_entry, to_entry; - from_entry = find_entry(from_acl, from_type, ACL_UNDEFINED_ID); - if (from_entry) { - if (acl_create_entry(to_acl, &to_entry) != 0) - return -1; - acl_copy_entry(to_entry, from_entry); - acl_set_tag_type(to_entry, to_type); - return 0; - } else { - return 1; - } -} - - -void -print_test( - FILE *file, - const char *path_p, - const struct stat *st, - const acl_t acl, - const acl_t default_acl) -{ - char *acl_text, *default_acl_text; - - acl_text = acl_to_any_text(acl, NULL, ',', TEXT_ABBREVIATE); - default_acl_text = - acl_to_any_text(default_acl, "d:", ',', TEXT_ABBREVIATE); - fprintf(file, "%s: %s,%s\n", path_p, - acl_text ? acl_text : "*", - default_acl_text ? default_acl_text : "*"); - acl_free(acl_text); - acl_free(default_acl_text); -} - - -static void -set_perm( - acl_entry_t ent, - mode_t perm) -{ - acl_permset_t set; - - acl_get_permset(ent, &set); - if (perm & CMD_PERM_READ) - acl_add_perm(set, ACL_READ); - else - acl_delete_perm(set, ACL_READ); - if (perm & CMD_PERM_WRITE) - acl_add_perm(set, ACL_WRITE); - else - acl_delete_perm(set, ACL_WRITE); - if (perm & CMD_PERM_EXECUTE) - acl_add_perm(set, ACL_EXECUTE); - else - acl_delete_perm(set, ACL_EXECUTE); -} - - -static int -retrieve_acl( - const char *path_p, - acl_type_t type, - const struct stat *st, - acl_t *old_acl, - acl_t *acl) -{ - if (*acl) - return 0; - *acl = NULL; - if (type == ACL_TYPE_ACCESS || S_ISDIR(st->st_mode)) { - *old_acl = acl_get_file(path_p, type); - if (*old_acl == NULL && (errno == ENOSYS || errno == ENOTSUP)) { - if (type == ACL_TYPE_DEFAULT) - *old_acl = acl_init(0); - else - *old_acl = acl_from_mode(st->st_mode); - } - } else - *old_acl = acl_init(0); - if (*old_acl == NULL) - return -1; - *acl = acl_dup(*old_acl); - if (*acl == NULL) - return -1; - return 0; -} - - -static int -remove_extended_entries( - acl_t acl) -{ - acl_entry_t ent, group_obj; - acl_permset_t mask_permset, group_obj_permset; - acl_tag_t tag; - int error; - - /* - * Removing the ACL_MASK entry from the ACL results in - * increased permissions for the owning group if the - * ACL_GROUP_OBJ entry contains permissions not contained - * in the ACL_MASK entry. We remove these permissions from - * the ACL_GROUP_OBJ entry to avoid that. - * - * After removing the ACL, the file owner and the owning group - * therefore have the same permissions as before. - */ - - ent = find_entry(acl, ACL_MASK, ACL_UNDEFINED_ID); - group_obj = find_entry(acl, ACL_GROUP_OBJ, ACL_UNDEFINED_ID); - if (ent && group_obj) { - if (!acl_get_permset(ent, &mask_permset) && - !acl_get_permset(group_obj, &group_obj_permset)) { - if (!acl_get_perm(mask_permset, ACL_READ)) - acl_delete_perm(group_obj_permset, ACL_READ); - if (!acl_get_perm(mask_permset, ACL_WRITE)) - acl_delete_perm(group_obj_permset, ACL_WRITE); - if (!acl_get_perm(mask_permset, ACL_EXECUTE)) - acl_delete_perm(group_obj_permset, ACL_EXECUTE); - } - } - - error = acl_get_entry(acl, ACL_FIRST_ENTRY, &ent); - while (error == 1) { - acl_get_tag_type(ent, &tag); - switch(tag) { - case ACL_USER: - case ACL_GROUP: - case ACL_MASK: - acl_delete_entry(acl, ent); - break; - default: - break; - } - - error = acl_get_entry(acl, ACL_NEXT_ENTRY, &ent); - } - if (error < 0) - return -1; - return 0; -} - - -#define RETRIEVE_ACL(type) do { \ - error = retrieve_acl(path_p, type, st, old_xacl, xacl); \ - if (error) \ - goto fail; \ - } while(0) - -int -do_set( - const char *path_p, - const struct stat *st, - int walk_flags, - void *arg) -{ - struct do_set_args *args = arg; - acl_t old_acl = NULL, old_default_acl = NULL; - acl_t acl = NULL, default_acl = NULL; - acl_t *xacl, *old_xacl; - acl_entry_t ent; - cmd_t cmd; - int which_entry; - int errors = 0, error; - char *acl_text; - int acl_modified = 0, default_acl_modified = 0; - int acl_mask_provided = 0, default_acl_mask_provided = 0; - - if (walk_flags & WALK_TREE_FAILED) { - fprintf(stderr, "%s: %s: %s\n", progname, path_p, strerror(errno)); - return 1; - } - - /* - * Symlinks can never have ACLs, so when doing a physical walk, we - * skip symlinks altogether, and when doing a half-logical walk, we - * skip all non-toplevel symlinks. - */ - if ((walk_flags & WALK_TREE_SYMLINK) && - ((walk_flags & WALK_TREE_PHYSICAL) || - !(walk_flags & (WALK_TREE_TOPLEVEL | WALK_TREE_LOGICAL)))) - return 0; - - /* Execute the commands in seq (read ACLs on demand) */ - error = seq_get_cmd(args->seq, SEQ_FIRST_CMD, &cmd); - if (error == 0) - return 0; - while (error == 1) { - mode_t perm = cmd->c_perm; - - if (cmd->c_type == ACL_TYPE_ACCESS) { - xacl = &acl; - old_xacl = &old_acl; - acl_modified = 1; - if (cmd->c_tag == ACL_MASK) - acl_mask_provided = 1; - } else { - xacl = &default_acl; - old_xacl = &old_default_acl; - default_acl_modified = 1; - if (cmd->c_tag == ACL_MASK) - default_acl_mask_provided = 1; - } - - RETRIEVE_ACL(cmd->c_type); - - /* Check for `X', and replace with `x' as appropriate. */ - if (perm & CMD_PERM_COND_EXECUTE) { - perm &= ~CMD_PERM_COND_EXECUTE; - if (S_ISDIR(st->st_mode) || has_execute_perms(*xacl)) - perm |= CMD_PERM_EXECUTE; - } - - switch(cmd->c_cmd) { - case CMD_ENTRY_REPLACE: - ent = find_entry(*xacl, cmd->c_tag, cmd->c_id); - if (!ent) { - if (acl_create_entry(xacl, &ent) != 0) - goto fail; - acl_set_tag_type(ent, cmd->c_tag); - if (cmd->c_id != ACL_UNDEFINED_ID) - acl_set_qualifier(ent, - &cmd->c_id); - } - set_perm(ent, perm); - break; - - case CMD_REMOVE_ENTRY: - ent = find_entry(*xacl, cmd->c_tag, cmd->c_id); - if (ent) - acl_delete_entry(*xacl, ent); - else - /* ignore */; - break; - - case CMD_REMOVE_EXTENDED_ACL: - remove_extended_entries(acl); - break; - - case CMD_REMOVE_ACL: - acl_free(*xacl); - *xacl = acl_init(5); - if (!*xacl) - goto fail; - break; - - default: - errno = EINVAL; - goto fail; - } - - error = seq_get_cmd(args->seq, SEQ_NEXT_CMD, &cmd); - } - - if (error < 0) - goto fail; - - /* Try to fill in missing entries */ - if (default_acl && acl_entries(default_acl) != 0) { - xacl = &acl; - old_xacl = &old_acl; - - if (!find_entry(default_acl, ACL_USER_OBJ, ACL_UNDEFINED_ID)) { - if (!acl) - RETRIEVE_ACL(ACL_TYPE_ACCESS); - clone_entry(acl, ACL_USER_OBJ, - &default_acl, ACL_USER_OBJ); - } - if (!find_entry(default_acl, ACL_GROUP_OBJ, ACL_UNDEFINED_ID)) { - if (!acl) - RETRIEVE_ACL(ACL_TYPE_ACCESS); - clone_entry(acl, ACL_GROUP_OBJ, - &default_acl, ACL_GROUP_OBJ); - } - if (!find_entry(default_acl, ACL_OTHER, ACL_UNDEFINED_ID)) { - if (!acl) - RETRIEVE_ACL(ACL_TYPE_ACCESS); - clone_entry(acl, ACL_OTHER, - &default_acl, ACL_OTHER); - } - } - - /* update mask entries and check if ACLs are valid */ - if (acl && acl_modified) { - if (acl_equiv_mode(acl, NULL) != 0) { - if (!acl_mask_provided && - !find_entry(acl, ACL_MASK, ACL_UNDEFINED_ID)) - clone_entry(acl, ACL_GROUP_OBJ, - &acl, ACL_MASK); - if (opt_recalculate != -1 && - (!acl_mask_provided || opt_recalculate == 1)) - acl_calc_mask(&acl); - } - - error = acl_check(acl, &which_entry); - if (error < 0) - goto fail; - if (error > 0) { - acl_text = acl_to_any_text(acl, NULL, ',', 0); - fprintf(stderr, _("%s: %s: Malformed access ACL " - "`%s': %s at entry %d\n"), progname, path_p, - acl_text, acl_error(error), which_entry+1); - acl_free(acl_text); - errors++; - goto cleanup; - } - } - - if (default_acl && acl_entries(default_acl) != 0 && - default_acl_modified) { - if (acl_equiv_mode(default_acl, NULL) != 0) { - if (!default_acl_mask_provided && - !find_entry(default_acl,ACL_MASK,ACL_UNDEFINED_ID)) - clone_entry(default_acl, ACL_GROUP_OBJ, - &default_acl, ACL_MASK); - if (opt_recalculate != -1 && - (!default_acl_mask_provided || - opt_recalculate == 1)) - acl_calc_mask(&default_acl); - } - - error = acl_check(default_acl, &which_entry); - if (error < 0) - goto fail; - if (error > 0) { - acl_text = acl_to_any_text(default_acl, NULL, ',', 0); - fprintf(stderr, _("%s: %s: Malformed default ACL " - "`%s': %s at entry %d\n"), - progname, path_p, acl_text, - acl_error(error), which_entry+1); - acl_free(acl_text); - errors++; - goto cleanup; - } - } - - /* Only directores can have default ACLs */ - if (default_acl && !S_ISDIR(st->st_mode) && (walk_flags & WALK_TREE_RECURSIVE)) { - /* In recursive mode, ignore default ACLs for files */ - acl_free(default_acl); - default_acl = NULL; - } - - /* check which ACLs have changed */ - if (acl && old_acl && acl_cmp(old_acl, acl) == 0) { - acl_free(acl); - acl = NULL; - } - if ((default_acl && old_default_acl && - acl_cmp(old_default_acl, default_acl) == 0)) { - acl_free(default_acl); - default_acl = NULL; - } - - /* update the file system */ - if (opt_test) { - print_test(stdout, path_p, st, - acl, default_acl); - goto cleanup; - } - if (acl) { - int equiv_mode; - mode_t mode = 0; - - equiv_mode = acl_equiv_mode(acl, &mode); - - if (acl_set_file(path_p, ACL_TYPE_ACCESS, acl) != 0) { - if (errno == ENOSYS || errno == ENOTSUP) { - if (equiv_mode != 0) - goto fail; - else if (chmod(path_p, mode) != 0) - goto fail; - } else - goto fail; - } - args->mode = mode; - } - if (default_acl) { - if (S_ISDIR(st->st_mode)) { - if (acl_entries(default_acl) == 0) { - if (acl_delete_def_file(path_p) != 0 && - errno != ENOSYS && errno != ENOTSUP) - goto fail; - } else { - if (acl_set_file(path_p, ACL_TYPE_DEFAULT, - default_acl) != 0) - goto fail; - } - } else { - if (acl_entries(default_acl) != 0) { - fprintf(stderr, _("%s: %s: Only directories " - "can have default ACLs\n"), - progname, path_p); - errors++; - goto cleanup; - } - } - } - - error = 0; - -cleanup: - if (acl) - acl_free(acl); - if (old_acl) - acl_free(old_acl); - if (default_acl) - acl_free(default_acl); - if (old_default_acl) - acl_free(old_default_acl); - return errors; - -fail: - fprintf(stderr, "%s: %s: %s\n", progname, path_p, strerror(errno)); - errors++; - goto cleanup; -} - diff --git a/setfacl/do_set.h b/setfacl/do_set.h deleted file mode 100644 index 2ea25a8..0000000 --- a/setfacl/do_set.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - File: do_set.h - (Linux Access Control List Management) - - Copyright (C) 2009 by Andreas Gruenbacher - - - This program 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 program 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. -*/ - -#ifndef __DO_SET_H -#define __DO_SET_H - -#include "sequence.h" - -struct do_set_args { - seq_t seq; - mode_t mode; -}; - -extern int do_set(const char *path_p, const struct stat *stat_p, int flags, - void *arg); - -#endif /* __DO_SET_H */ diff --git a/setfacl/parse.c b/setfacl/parse.c deleted file mode 100644 index e7e6add..0000000 --- a/setfacl/parse.c +++ /dev/null @@ -1,594 +0,0 @@ -/* - File: parse.c - (Linux Access Control List Management) - - Copyright (C) 1999, 2000 - Andreas Gruenbacher, - - This program 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 program 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. -*/ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "sys/acl.h" - -#include "sequence.h" -#include "parse.h" -#include "misc.h" - -#define SKIP_WS(x) ({ \ - while (*(x)==' ' || *(x)=='\t' || *(x)=='\n' || *(x)=='\r') \ - (x)++; \ - }) - - -static int -skip_tag_name( - const char **text_p, - const char *token) -{ - size_t len = strlen(token); - const char *text = *text_p; - - SKIP_WS(text); - if (strncmp(text, token, len) == 0) { - text += len; - goto delimiter; - } - if (*text == *token) { - text++; - goto delimiter; - } - return 0; - -delimiter: - SKIP_WS(text); - if (*text == ':') { - *text_p = text+1; - return 1; - } - if (*text == ',' || *text == '\0') { - *text_p = text; - return 1; - } - return 0; -} - - -static char * -get_token( - const char **text_p) -{ - char *token = NULL, *t; - const char *bp, *ep; - - bp = *text_p; - SKIP_WS(bp); - ep = bp; - - while (*ep!='\0' && *ep!='\r' && *ep!='\n' && *ep!=':' && *ep!=',') - ep++; - if (ep == bp) - goto after_token; - token = (char*)malloc(ep - bp + 1); - if (token == NULL) - goto after_token; - memcpy(token, bp, ep - bp); - - /* Trim trailing whitespace */ - t = token + (ep - bp - 1); - while (t >= token && - (*t==' ' || *t=='\t' || *t=='\n' || *t=='\r')) - t--; - *(t+1) = '\0'; - -after_token: - if (*ep == ':') - ep++; - *text_p = ep; - return token; -} - - -static int -get_id( - const char *token, - id_t *id_p) -{ - char *ep; - long l; - l = strtol(token, &ep, 0); - if (*ep != '\0') - return -1; - if (l < 0) { - /* - Negative values are interpreted as 16-bit numbers, - so that id -2 maps to 65534 (nobody/nogroup), etc. - */ - l &= 0xFFFF; - } - *id_p = l; - return 0; -} - - -static int -get_uid( - const char *token, - uid_t *uid_p) -{ - struct passwd *passwd; - - if (get_id(token, (id_t *)uid_p) == 0) - goto accept; - passwd = getpwnam(token); - if (passwd) { - *uid_p = passwd->pw_uid; - goto accept; - } - return -1; - -accept: - return 0; -} - - -static int -get_gid( - const char *token, - gid_t *gid_p) -{ - struct group *group; - - if (get_id(token, (id_t *)gid_p) == 0) - goto accept; - group = getgrnam(token); - if (group) { - *gid_p = group->gr_gid; - goto accept; - } - return -1; - -accept: - return 0; -} - - -/* - Parses the next acl entry in text_p. - - Returns: - -1 on error, 0 on success. -*/ - -cmd_t -parse_acl_cmd( - const char **text_p, - int seq_cmd, - int parse_mode) -{ - cmd_t cmd = cmd_init(); - char *str; - const char *backup; - int error, perm_chars; - if (!cmd) - return NULL; - - cmd->c_cmd = seq_cmd; - if (parse_mode & SEQ_PROMOTE_ACL) - cmd->c_type = ACL_TYPE_DEFAULT; - else - cmd->c_type = ACL_TYPE_ACCESS; - cmd->c_id = ACL_UNDEFINED_ID; - cmd->c_perm = 0; - - if (parse_mode & SEQ_PARSE_DEFAULT) { - /* check for default acl entry */ - backup = *text_p; - if (skip_tag_name(text_p, "default")) { - if (parse_mode & SEQ_PROMOTE_ACL) { - /* if promoting from acl to default acl and - a default acl entry is found, fail. */ - *text_p = backup; - goto fail; - } - cmd->c_type = ACL_TYPE_DEFAULT; - } - } - - /* parse acl entry type */ - switch (**text_p) { - case 'u': /* user */ - skip_tag_name(text_p, "user"); - -user_entry: - backup = *text_p; - str = get_token(text_p); - if (str) { - cmd->c_tag = ACL_USER; - error = get_uid(unquote(str), &cmd->c_id); - free(str); - if (error) { - *text_p = backup; - goto fail; - } - } else { - cmd->c_tag = ACL_USER_OBJ; - } - break; - - case 'g': /* group */ - if (!skip_tag_name(text_p, "group")) - goto user_entry; - - backup = *text_p; - str = get_token(text_p); - if (str) { - cmd->c_tag = ACL_GROUP; - error = get_gid(unquote(str), &cmd->c_id); - free(str); - if (error) { - *text_p = backup; - goto fail; - } - } else { - cmd->c_tag = ACL_GROUP_OBJ; - } - break; - - case 'o': /* other */ - if (!skip_tag_name(text_p, "other")) - goto user_entry; - /* skip empty entry qualifier field (this field may - be missing for compatibility with Solaris.) */ - SKIP_WS(*text_p); - if (**text_p == ':') - (*text_p)++; - cmd->c_tag = ACL_OTHER; - break; - - case 'm': /* mask */ - if (!skip_tag_name(text_p, "mask")) - goto user_entry; - /* skip empty entry qualifier field (this field may - be missing for compatibility with Solaris.) */ - SKIP_WS(*text_p); - if (**text_p == ':') - (*text_p)++; - cmd->c_tag = ACL_MASK; - break; - - default: /* assume "user:" */ - goto user_entry; - } - - SKIP_WS(*text_p); - if (**text_p == ',' || **text_p == '\0') { - if (parse_mode & SEQ_PARSE_NO_PERM) - return cmd; - else - goto fail; - } - if (!(parse_mode & SEQ_PARSE_WITH_PERM)) - return cmd; - - /* parse permissions */ - SKIP_WS(*text_p); - if (**text_p >= '0' && **text_p <= '7') { - cmd->c_perm = 0; - while (**text_p == '0') - (*text_p)++; - if (**text_p >= '1' && **text_p <= '7') { - cmd->c_perm = (*(*text_p)++ - '0'); - } - - return cmd; - } - - for (perm_chars=0; perm_chars<3; perm_chars++, (*text_p)++) { - switch(**text_p) { - case 'r': /* read */ - if (cmd->c_perm & CMD_PERM_READ) - goto fail; - cmd->c_perm |= CMD_PERM_READ; - break; - - case 'w': /* write */ - if (cmd->c_perm & CMD_PERM_WRITE) - goto fail; - cmd->c_perm |= CMD_PERM_WRITE; - break; - - case 'x': /* execute */ - if (cmd->c_perm & CMD_PERM_EXECUTE) - goto fail; - cmd->c_perm |= CMD_PERM_EXECUTE; - break; - - case 'X': /* execute only if directory or some - entries already have execute permissions - set */ - if (cmd->c_perm & CMD_PERM_COND_EXECUTE) - goto fail; - cmd->c_perm |= CMD_PERM_COND_EXECUTE; - break; - - case '-': - /* ignore */ - break; - - default: - if (perm_chars == 0) - goto fail; - return cmd; - } - } - if (perm_chars != 3) - goto fail; - return cmd; - -fail: - cmd_free(cmd); - return NULL; -} - - -/* - Parse a comma-separated list of acl entries. - - which is set to the index of the first character that was not parsed, - or -1 in case of success. -*/ -int -parse_acl_seq( - seq_t seq, - const char *text_p, - int *which, - int seq_cmd, - int parse_mode) -{ - const char *initial_text_p = text_p; - cmd_t cmd; - - if (which) - *which = -1; - - while (*text_p != '\0') { - cmd = parse_acl_cmd(&text_p, seq_cmd, parse_mode); - if (cmd == NULL) { - errno = EINVAL; - goto fail; - } - if (seq_append(seq, cmd) != 0) { - cmd_free(cmd); - goto fail; - } - SKIP_WS(text_p); - if (*text_p != ',') - break; - text_p++; - } - - if (*text_p != '\0') { - errno = EINVAL; - goto fail; - } - - return 0; - -fail: - if (which) - *which = (text_p - initial_text_p); - return -1; -} - - - -int -read_acl_comments( - FILE *file, - int *line, - char **path_p, - uid_t *uid_p, - gid_t *gid_p, - mode_t *flags) -{ - int c; - /* - Max PATH_MAX bytes even for UTF-8 path names and additional 9 - bytes for "# file: ". Not a good solution but for now it is the - best I can do without too much impact on the code. [tw] - */ - char linebuf[(4*PATH_MAX)+9]; - char *cp; - char *p; - int comments_read = 0; - - if (path_p) - *path_p = NULL; - if (uid_p) - *uid_p = ACL_UNDEFINED_ID; - if (gid_p) - *gid_p = ACL_UNDEFINED_ID; - if (flags) - *flags = 0; - - for(;;) { - c = fgetc(file); - if (c == EOF) - break; - if (c==' ' || c=='\t' || c=='\r' || c=='\n') { - if (c=='\n') - (*line)++; - continue; - } - if (c != '#') { - ungetc(c, file); - break; - } - if (line) - (*line)++; - - if (fgets(linebuf, sizeof(linebuf), file) == NULL) - break; - - comments_read = 1; - - p = strrchr(linebuf, '\0'); - while (p > linebuf && - (*(p-1)=='\r' || *(p-1)=='\n')) { - p--; - *p = '\0'; - } - - cp = linebuf; - SKIP_WS(cp); - if (strncmp(cp, "file:", 5) == 0) { - cp += 5; - SKIP_WS(cp); - cp = unquote(cp); - - if (path_p) { - if (*path_p) - goto fail; - *path_p = (char*)malloc(strlen(cp)+1); - if (!*path_p) - return -1; - strcpy(*path_p, cp); - } - } else if (strncmp(cp, "owner:", 6) == 0) { - cp += 6; - SKIP_WS(cp); - - if (uid_p) { - if (*uid_p != ACL_UNDEFINED_ID) - goto fail; - if (get_uid(unquote(cp), uid_p) != 0) - continue; - } - } else if (strncmp(cp, "group:", 6) == 0) { - cp += 6; - SKIP_WS(cp); - - if (gid_p) { - if (*gid_p != ACL_UNDEFINED_ID) - goto fail; - if (get_gid(unquote(cp), gid_p) != 0) - continue; - } - } else if (strncmp(cp, "flags:", 6) == 0) { - mode_t f = 0; - - cp += 6; - SKIP_WS(cp); - - if (cp[0] == 's') - f |= S_ISUID; - else if (cp[0] != '-') - goto fail; - if (cp[1] == 's') - f |= S_ISGID; - else if (cp[1] != '-') - goto fail; - if (cp[2] == 't') - f |= S_ISVTX; - else if (cp[2] != '-') - goto fail; - if (cp[3] != '\0') - goto fail; - - if (flags) - *flags = f; - } - } - if (ferror(file)) - return -1; - return comments_read; -fail: - if (path_p && *path_p) { - free(*path_p); - *path_p = NULL; - } - return -EINVAL; -} - - -int -read_acl_seq( - FILE *file, - seq_t seq, - int seq_cmd, - int parse_mode, - int *line, - int *which) -{ - char linebuf[1024]; - const char *cp; - cmd_t cmd; - - if (which) - *which = -1; - - for(;;) { - if (fgets(linebuf, sizeof(linebuf), file) == NULL) - break; - if (line) - (*line)++; - - cp = linebuf; - SKIP_WS(cp); - if (*cp == '\0') { - if (!(parse_mode & SEQ_PARSE_MULTI)) - continue; - break; - } else if (*cp == '#') { - continue; - } - - cmd = parse_acl_cmd(&cp, seq_cmd, parse_mode); - if (cmd == NULL) { - errno = EINVAL; - goto fail; - } - if (seq_append(seq, cmd) != 0) { - cmd_free(cmd); - goto fail; - } - - SKIP_WS(cp); - if (*cp != '\0' && *cp != '#') { - errno = EINVAL; - goto fail; - } - } - - if (ferror(file)) - goto fail; - return 0; - -fail: - if (which) - *which = (cp - linebuf); - return -1; -} - diff --git a/setfacl/parse.h b/setfacl/parse.h deleted file mode 100644 index b2e68b4..0000000 --- a/setfacl/parse.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - File: parse.h - (Linux Access Control List Management) - - Copyright (C) 1999 by Andreas Gruenbacher - - - This program 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 program 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. -*/ - -#ifndef __PARSE_H -#define __PARSE_H - - -#include -#include -#include "sequence.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* parse options */ - -#define SEQ_PARSE_WITH_PERM (0x0001) -#define SEQ_PARSE_NO_PERM (0x0002) -#define SEQ_PARSE_ANY_PERM (0x0001|0x0002) - -#define SEQ_PARSE_MULTI (0x0010) -#define SEQ_PARSE_DEFAULT (0x0020) /* "default:" = default acl */ - -#define SEQ_PROMOTE_ACL (0x0040) /* promote from acl - to default acl */ - -cmd_t -parse_acl_cmd( - const char **text_p, - int seq_cmd, - int parse_mode); -int -parse_acl_seq( - seq_t seq, - const char *text_p, - int *which, - int seq_cmd, - int parse_mode); -int -read_acl_comments( - FILE *file, - int *line, - char **path_p, - uid_t *uid_p, - gid_t *gid_p, - mode_t *flags); -int -read_acl_seq( - FILE *file, - seq_t seq, - int seq_cmd, - int parse_mode, - int *line, - int *which); - - -#ifdef __cplusplus -} -#endif - - -#endif /* __PARSE_H */ - diff --git a/setfacl/sequence.c b/setfacl/sequence.c deleted file mode 100644 index a418b23..0000000 --- a/setfacl/sequence.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - File: sequence.c - (Linux Access Control List Management) - - Copyright (C) 1999, 2000 - Andreas Gruenbacher, - - This program 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 program 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. -*/ - - -#include -#include "sequence.h" - - -cmd_t -cmd_init( - void) -{ - return (cmd_t)malloc(sizeof(struct cmd_obj)); -} - - -void -cmd_free( - cmd_t cmd) -{ - free(cmd); -} - - -seq_t -seq_init( - void) -{ - seq_t seq = (seq_t)malloc(sizeof(struct seq_obj)); - if (seq == NULL) - return NULL; - seq->s_first = seq->s_last = NULL; - return seq; -} - - -int -seq_free( - seq_t seq) -{ - cmd_t cmd = seq->s_first; - while (cmd) { - seq->s_first = seq->s_first->c_next; - cmd_free(cmd); - cmd = seq->s_first; - } - free(seq); - return 0; -} - - -int -seq_empty( - seq_t seq) -{ - return (seq->s_first == NULL); -} - - -int -seq_append( - seq_t seq, - cmd_t cmd) -{ - cmd->c_next = NULL; - if (seq->s_first == NULL) { - seq->s_first = seq->s_last = cmd; - } else { - seq->s_last->c_next = cmd; - seq->s_last = cmd; - } - return 0; -} - - -int -seq_append_cmd( - seq_t seq, - cmd_tag_t cmd, - acl_type_t type) -{ - cmd_t cmd_d = cmd_init(); - if (cmd_d == NULL) - return -1; - cmd_d->c_cmd = cmd; - cmd_d->c_type = type; - if (seq_append(seq, cmd_d) != 0) { - cmd_free(cmd_d); - return -1; - } - return 0; -} - - -int -seq_get_cmd( - seq_t seq, - int which, - cmd_t *cmd) -{ - if (which == SEQ_FIRST_CMD) { - if (seq->s_first == NULL) - return 0; - if (cmd) - *cmd = seq->s_first; - return 1; - } else if (which == SEQ_NEXT_CMD) { - if (cmd == NULL) - return -1; - if (*cmd) { - *cmd = (*cmd)->c_next; - return (*cmd == NULL) ? 0 : 1; - } - return 0; - } else { - return -1; - } -} - - -int -seq_delete_cmd( - seq_t seq, - cmd_t cmd) -{ - cmd_t prev = seq->s_first; - - if (cmd == seq->s_first) { - seq->s_first = seq->s_first->c_next; - cmd_free(cmd); - return 0; - } - while (prev != NULL && prev->c_next != cmd) - prev = prev->c_next; - if (prev == NULL) - return -1; - if (cmd == seq->s_last) - seq->s_last = prev; - prev->c_next = cmd->c_next; - cmd_free(cmd); - return 0; -} - diff --git a/setfacl/sequence.h b/setfacl/sequence.h deleted file mode 100644 index c5d7403..0000000 --- a/setfacl/sequence.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - File: sequence.h - (Linux Access Control List Management) - - Copyright (C) 1999 by Andreas Gruenbacher - - - This program 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 program 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. -*/ - - -#ifndef __SEQUENCE_H -#define __SEQUENCE_H - - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef unsigned int cmd_tag_t; - -struct cmd_obj { - cmd_tag_t c_cmd; - acl_type_t c_type; - acl_tag_t c_tag; - uid_t c_id; - mode_t c_perm; - struct cmd_obj *c_next; -}; - -typedef struct cmd_obj *cmd_t; - -struct seq_obj { - cmd_t s_first; - cmd_t s_last; -}; - -typedef struct seq_obj *seq_t; - -/* command types */ -#define CMD_ENTRY_REPLACE (0) -#define CMD_REMOVE_ENTRY (3) -#define CMD_REMOVE_EXTENDED_ACL (4) -#define CMD_REMOVE_ACL (5) - -/* constants for permission specifiers */ -#define CMD_PERM_READ (4) -#define CMD_PERM_WRITE (2) -#define CMD_PERM_EXECUTE (1) -#define CMD_PERM_COND_EXECUTE (8) - -/* iteration over command sequence */ -#define SEQ_FIRST_CMD (0) -#define SEQ_NEXT_CMD (1) - -/* command sequence manipulation */ - -cmd_t -cmd_init( - void); -void -cmd_free( - cmd_t cmd); -seq_t -seq_init( - void); -int -seq_free( - seq_t seq); -int -seq_empty( - seq_t seq); -int -seq_append( - seq_t seq, - cmd_t cmd); -int -seq_append_cmd( - seq_t seq, - cmd_tag_t cmd, - acl_type_t type); -int -seq_get_cmd( - seq_t seq, - int which, - cmd_t *cmd); -int -seq_delete_cmd( - seq_t seq, - cmd_t cmd); - - -#ifdef __cplusplus -} -#endif - - -#endif /* __SEQUENCE_H */ - diff --git a/setfacl/setfacl.c b/setfacl/setfacl.c deleted file mode 100644 index f6135b7..0000000 --- a/setfacl/setfacl.c +++ /dev/null @@ -1,669 +0,0 @@ -/* - File: setfacl.c - (Linux Access Control List Management) - - Copyright (C) 1999-2002 - Andreas Gruenbacher, - - This program 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 program 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. -*/ - -#include "config.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "misc.h" -#include "sequence.h" -#include "parse.h" -#include "do_set.h" -#include "walk_tree.h" - -#define POSIXLY_CORRECT_STR "POSIXLY_CORRECT" - -/* '-' stands for `process non-option arguments in loop' */ -#if !POSIXLY_CORRECT -# define CMD_LINE_OPTIONS "-:bkndvhm:M:x:X:RLP" -# define CMD_LINE_SPEC "[-bkndRLP] { -m|-M|-x|-X ... } file ..." -#endif -#define POSIXLY_CMD_LINE_OPTIONS "-:bkndvhm:M:x:X:" -#define POSIXLY_CMD_LINE_SPEC "[-bknd] {-m|-M|-x|-X ... } file ..." - -struct option long_options[] = { -#if !POSIXLY_CORRECT - { "set", 1, 0, 's' }, - { "set-file", 1, 0, 'S' }, - - { "mask", 0, 0, 'r' }, - { "recursive", 0, 0, 'R' }, - { "logical", 0, 0, 'L' }, - { "physical", 0, 0, 'P' }, - { "restore", 1, 0, 'B' }, - { "test", 0, 0, 't' }, -#endif - { "modify", 1, 0, 'm' }, - { "modify-file", 1, 0, 'M' }, - { "remove", 1, 0, 'x' }, - { "remove-file", 1, 0, 'X' }, - - { "default", 0, 0, 'd' }, - { "no-mask", 0, 0, 'n' }, - { "remove-all", 0, 0, 'b' }, - { "remove-default", 0, 0, 'k' }, - { "version", 0, 0, 'v' }, - { "help", 0, 0, 'h' }, - { NULL, 0, 0, 0 }, -}; - -const char *progname; -const char *cmd_line_options, *cmd_line_spec; - -int walk_flags = WALK_TREE_DEREFERENCE_TOPLEVEL; -int opt_recalculate; /* recalculate mask entry (0=default, 1=yes, -1=no) */ -int opt_promote; /* promote access ACL to default ACL */ -int opt_test; /* do not write to the file system. - Print what would happen instead. */ -#if POSIXLY_CORRECT -const int posixly_correct = 1; /* Posix compatible behavior! */ -#else -int posixly_correct; /* Posix compatible behavior? */ -#endif -int chown_error; -int promote_warning; - - -static const char *xquote(const char *str, const char *quote_chars) -{ - const char *q = quote(str, quote_chars); - if (q == NULL) { - fprintf(stderr, "%s: %s\n", progname, strerror(errno)); - exit(1); - } - return q; -} - -int -has_any_of_type( - cmd_t cmd, - acl_type_t acl_type) -{ - while (cmd) { - if (cmd->c_type == acl_type) - return 1; - cmd = cmd->c_next; - } - return 0; -} - - -#if !POSIXLY_CORRECT -int -restore( - FILE *file, - const char *filename) -{ - char *path_p; - struct stat st; - uid_t uid; - gid_t gid; - mode_t mask, flags; - struct do_set_args args = { }; - int line = 0, backup_line; - int error, status = 0; - int chmod_required = 0; - - memset(&st, 0, sizeof(st)); - - for(;;) { - backup_line = line; - error = read_acl_comments(file, &line, &path_p, &uid, &gid, - &flags); - if (error < 0) { - error = -error; - goto fail; - } - if (error == 0) - return status; - - if (path_p == NULL) { - if (filename) { - fprintf(stderr, _("%s: %s: No filename found " - "in line %d, aborting\n"), - progname, xquote(filename, "\n\r"), - backup_line); - } else { - fprintf(stderr, _("%s: No filename found in " - "line %d of standard input, " - "aborting\n"), - progname, backup_line); - } - status = 1; - goto getout; - } - - if (!(args.seq = seq_init())) - goto fail_errno; - if (seq_append_cmd(args.seq, CMD_REMOVE_ACL, ACL_TYPE_ACCESS) || - seq_append_cmd(args.seq, CMD_REMOVE_ACL, ACL_TYPE_DEFAULT)) - goto fail_errno; - - error = read_acl_seq(file, args.seq, CMD_ENTRY_REPLACE, - SEQ_PARSE_WITH_PERM | - SEQ_PARSE_DEFAULT | - SEQ_PARSE_MULTI, - &line, NULL); - if (error != 0) { - fprintf(stderr, _("%s: %s: %s in line %d\n"), - progname, xquote(filename, "\n\r"), strerror(errno), - line); - status = 1; - goto getout; - } - - error = stat(path_p, &st); - if (opt_test && error != 0) { - fprintf(stderr, "%s: %s: %s\n", progname, - xquote(path_p, "\n\r"), strerror(errno)); - status = 1; - } - - args.mode = 0; - error = do_set(path_p, &st, 0, &args); - if (error != 0) { - status = 1; - goto resume; - } - - if (uid != ACL_UNDEFINED_ID && uid != st.st_uid) - st.st_uid = uid; - else - st.st_uid = -1; - if (gid != ACL_UNDEFINED_ID && gid != st.st_gid) - st.st_gid = gid; - else - st.st_gid = -1; - if (!opt_test && - (st.st_uid != -1 || st.st_gid != -1)) { - if (chown(path_p, st.st_uid, st.st_gid) != 0) { - fprintf(stderr, _("%s: %s: Cannot change " - "owner/group: %s\n"), - progname, xquote(path_p, "\n\r"), - strerror(errno)); - status = 1; - } - - /* chown() clears setuid/setgid so force a chmod if - * S_ISUID/S_ISGID was expected */ - if ((st.st_mode & flags) & (S_ISUID | S_ISGID)) - chmod_required = 1; - } - - mask = S_ISUID | S_ISGID | S_ISVTX; - if (chmod_required || ((st.st_mode & mask) != (flags & mask))) { - if (!args.mode) - args.mode = st.st_mode; - args.mode &= (S_IRWXU | S_IRWXG | S_IRWXO); - if (chmod(path_p, flags | args.mode) != 0) { - fprintf(stderr, _("%s: %s: Cannot change " - "mode: %s\n"), - progname, xquote(path_p, "\n\r"), - strerror(errno)); - status = 1; - } - } -resume: - if (path_p) { - free(path_p); - path_p = NULL; - } - if (args.seq) { - seq_free(args.seq); - args.seq = NULL; - } - } - -getout: - if (path_p) { - free(path_p); - path_p = NULL; - } - if (args.seq) { - seq_free(args.seq); - args.seq = NULL; - } - return status; - -fail_errno: - error = errno; -fail: - fprintf(stderr, "%s: %s: %s\n", progname, xquote(filename, "\n\r"), - strerror(error)); - status = 1; - goto getout; -} -#endif - - -void help(void) -{ - printf(_("%s %s -- set file access control lists\n"), - progname, VERSION); - printf(_("Usage: %s %s\n"), - progname, cmd_line_spec); - printf(_( -" -m, --modify=acl modify the current ACL(s) of file(s)\n" -" -M, --modify-file=file read ACL entries to modify from file\n" -" -x, --remove=acl remove entries from the ACL(s) of file(s)\n" -" -X, --remove-file=file read ACL entries to remove from file\n" -" -b, --remove-all remove all extended ACL entries\n" -" -k, --remove-default remove the default ACL\n")); -#if !POSIXLY_CORRECT - if (!posixly_correct) { - printf(_( -" --set=acl set the ACL of file(s), replacing the current ACL\n" -" --set-file=file read ACL entries to set from file\n" -" --mask do recalculate the effective rights mask\n")); - } -#endif - printf(_( -" -n, --no-mask don't recalculate the effective rights mask\n" -" -d, --default operations apply to the default ACL\n")); -#if !POSIXLY_CORRECT - if (!posixly_correct) { - printf(_( -" -R, --recursive recurse into subdirectories\n" -" -L, --logical logical walk, follow symbolic links\n" -" -P, --physical physical walk, do not follow symbolic links\n" -" --restore=file restore ACLs (inverse of `getfacl -R')\n" -" --test test mode (ACLs are not modified)\n")); - } -#endif - printf(_( -" -v, --version print version and exit\n" -" -h, --help this help text\n")); -} - - -int next_file(const char *arg, seq_t seq) -{ - char *line; - int errors = 0; - struct do_set_args args; - - args.seq = seq; - - if (strcmp(arg, "-") == 0) { - while ((line = next_line(stdin))) - errors = walk_tree(line, walk_flags, 0, do_set, &args); - if (!feof(stdin)) { - fprintf(stderr, _("%s: Standard input: %s\n"), - progname, strerror(errno)); - errors = 1; - } - } else { - errors = walk_tree(arg, walk_flags, 0, do_set, &args); - } - return errors ? 1 : 0; -} - - -#define ERRNO_ERROR(s) \ - ({status = (s); goto errno_error; }) - - -int main(int argc, char *argv[]) -{ - int opt; - int saw_files = 0; - int status = 0; - FILE *file; - int which; - int lineno; - int error; - seq_t seq; - int seq_cmd, parse_mode; - - progname = basename(argv[0]); - -#if POSIXLY_CORRECT - cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; - cmd_line_spec = _(POSIXLY_CMD_LINE_SPEC); -#else - if (getenv(POSIXLY_CORRECT_STR)) - posixly_correct = 1; - if (!posixly_correct) { - cmd_line_options = CMD_LINE_OPTIONS; - cmd_line_spec = _(CMD_LINE_SPEC); - } else { - cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; - cmd_line_spec = _(POSIXLY_CMD_LINE_SPEC); - } -#endif - - setlocale(LC_CTYPE, ""); - setlocale(LC_MESSAGES, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); - - seq = seq_init(); - if (!seq) - ERRNO_ERROR(1); - - while ((opt = getopt_long(argc, argv, cmd_line_options, - long_options, NULL)) != -1) { - /* we remember the two REMOVE_ACL commands of the set - operations because we may later need to delete them. */ - cmd_t seq_remove_default_acl_cmd = NULL; - cmd_t seq_remove_acl_cmd = NULL; - - if (opt != '\1' && saw_files) { - seq_free(seq); - seq = seq_init(); - if (!seq) - ERRNO_ERROR(1); - saw_files = 0; - } - - switch (opt) { - case 'b': /* remove all extended entries */ - if (seq_append_cmd(seq, CMD_REMOVE_EXTENDED_ACL, - ACL_TYPE_ACCESS) || - seq_append_cmd(seq, CMD_REMOVE_ACL, - ACL_TYPE_DEFAULT)) - ERRNO_ERROR(1); - break; - - case 'k': /* remove default ACL */ - if (seq_append_cmd(seq, CMD_REMOVE_ACL, - ACL_TYPE_DEFAULT)) - ERRNO_ERROR(1); - break; - - case 'n': /* do not recalculate mask */ - opt_recalculate = -1; - break; - - case 'r': /* force recalculate mask */ - opt_recalculate = 1; - break; - - case 'd': /* operations apply to default ACL */ - opt_promote = 1; - break; - - case 's': /* set */ - if (seq_append_cmd(seq, CMD_REMOVE_ACL, - ACL_TYPE_ACCESS)) - ERRNO_ERROR(1); - seq_remove_acl_cmd = seq->s_last; - if (seq_append_cmd(seq, CMD_REMOVE_ACL, - ACL_TYPE_DEFAULT)) - ERRNO_ERROR(1); - seq_remove_default_acl_cmd = seq->s_last; - - seq_cmd = CMD_ENTRY_REPLACE; - parse_mode = SEQ_PARSE_WITH_PERM; - goto set_modify_delete; - - case 'm': /* modify */ - seq_cmd = CMD_ENTRY_REPLACE; - parse_mode = SEQ_PARSE_WITH_PERM; - goto set_modify_delete; - - case 'x': /* delete */ - seq_cmd = CMD_REMOVE_ENTRY; -#if POSIXLY_CORRECT - parse_mode = SEQ_PARSE_ANY_PERM; -#else - if (posixly_correct) - parse_mode = SEQ_PARSE_ANY_PERM; - else - parse_mode = SEQ_PARSE_NO_PERM; -#endif - goto set_modify_delete; - - set_modify_delete: - if (!posixly_correct) - parse_mode |= SEQ_PARSE_DEFAULT; - if (opt_promote) - parse_mode |= SEQ_PROMOTE_ACL; - if (parse_acl_seq(seq, optarg, &which, - seq_cmd, parse_mode) != 0) { - if (which < 0 || - (size_t) which >= strlen(optarg)) { - fprintf(stderr, _( - "%s: Option " - "-%c incomplete\n"), - progname, opt); - } else { - fprintf(stderr, _( - "%s: Option " - "-%c: %s near " - "character %d\n"), - progname, opt, - strerror(errno), - which+1); - } - status = 2; - goto cleanup; - } - break; - - case 'S': /* set from file */ - if (seq_append_cmd(seq, CMD_REMOVE_ACL, - ACL_TYPE_ACCESS)) - ERRNO_ERROR(1); - seq_remove_acl_cmd = seq->s_last; - if (seq_append_cmd(seq, CMD_REMOVE_ACL, - ACL_TYPE_DEFAULT)) - ERRNO_ERROR(1); - seq_remove_default_acl_cmd = seq->s_last; - - seq_cmd = CMD_ENTRY_REPLACE; - parse_mode = SEQ_PARSE_WITH_PERM; - goto set_modify_delete_from_file; - - case 'M': /* modify from file */ - seq_cmd = CMD_ENTRY_REPLACE; - parse_mode = SEQ_PARSE_WITH_PERM; - goto set_modify_delete_from_file; - - case 'X': /* delete from file */ - seq_cmd = CMD_REMOVE_ENTRY; -#if POSIXLY_CORRECT - parse_mode = SEQ_PARSE_ANY_PERM; -#else - if (posixly_correct) - parse_mode = SEQ_PARSE_ANY_PERM; - else - parse_mode = SEQ_PARSE_NO_PERM; -#endif - goto set_modify_delete_from_file; - - set_modify_delete_from_file: - if (!posixly_correct) - parse_mode |= SEQ_PARSE_DEFAULT; - if (opt_promote) - parse_mode |= SEQ_PROMOTE_ACL; - if (strcmp(optarg, "-") == 0) { - file = stdin; - } else { - file = fopen(optarg, "r"); - if (file == NULL) { - fprintf(stderr, "%s: %s: %s\n", - progname, - xquote(optarg, "\n\r"), - strerror(errno)); - status = 2; - goto cleanup; - } - } - - lineno = 0; - error = read_acl_seq(file, seq, seq_cmd, - parse_mode, &lineno, NULL); - - if (file != stdin) { - fclose(file); - } - - if (error) { - if (!errno) - errno = EINVAL; - - if (file != stdin) { - fprintf(stderr, _( - "%s: %s in line " - "%d of file %s\n"), - progname, - strerror(errno), - lineno, - xquote(optarg, "\n\r")); - } else { - fprintf(stderr, _( - "%s: %s in line " - "%d of standard " - "input\n"), progname, - strerror(errno), - lineno); - } - status = 2; - goto cleanup; - } - break; - - - case '\1': /* file argument */ - if (seq_empty(seq)) - goto synopsis; - saw_files = 1; - - status = next_file(optarg, seq); - break; - - case 'B': /* restore ACL backup */ - saw_files = 1; - - if (strcmp(optarg, "-") == 0) - file = stdin; - else { - file = fopen(optarg, "r"); - if (file == NULL) { - fprintf(stderr, "%s: %s: %s\n", - progname, - xquote(optarg, "\n\r"), - strerror(errno)); - status = 2; - goto cleanup; - } - } - - status = restore(file, - (file == stdin) ? NULL : optarg); - - if (file != stdin) - fclose(file); - if (status != 0) - goto cleanup; - break; - - case 'R': /* recursive */ - walk_flags |= WALK_TREE_RECURSIVE; - break; - - case 'L': /* follow symlinks */ - walk_flags |= WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE; - walk_flags &= ~WALK_TREE_PHYSICAL; - break; - - case 'P': /* do not follow symlinks */ - walk_flags |= WALK_TREE_PHYSICAL; - walk_flags &= ~(WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE | - WALK_TREE_DEREFERENCE_TOPLEVEL); - break; - - case 't': /* test mode */ - opt_test = 1; - break; - - case 'v': /* print version and exit */ - printf("%s " VERSION "\n", progname); - status = 0; - goto cleanup; - - case 'h': /* help! */ - help(); - status = 0; - goto cleanup; - - case ':': /* option missing */ - case '?': /* unknown option */ - default: - goto synopsis; - } - if (seq_remove_acl_cmd) { - /* This was a set operation. Check if there are - actually entries of ACL_TYPE_ACCESS; if there - are none, we need to remove this command! */ - if (!has_any_of_type(seq_remove_acl_cmd->c_next, - ACL_TYPE_ACCESS)) - seq_delete_cmd(seq, seq_remove_acl_cmd); - } - if (seq_remove_default_acl_cmd) { - /* This was a set operation. Check if there are - actually entries of ACL_TYPE_DEFAULT; if there - are none, we need to remove this command! */ - if (!has_any_of_type(seq_remove_default_acl_cmd->c_next, - ACL_TYPE_DEFAULT)) - seq_delete_cmd(seq, seq_remove_default_acl_cmd); - } - } - while (optind < argc) { - if(!seq) - goto synopsis; - if (seq_empty(seq)) - goto synopsis; - saw_files = 1; - - status = next_file(argv[optind++], seq); - } - if (!saw_files) - goto synopsis; - - goto cleanup; - -synopsis: - fprintf(stderr, _("Usage: %s %s\n"), - progname, cmd_line_spec); - fprintf(stderr, _("Try `%s --help' for more information.\n"), - progname); - status = 2; - goto cleanup; - -errno_error: - fprintf(stderr, "%s: %s\n", progname, strerror(errno)); - goto cleanup; - -cleanup: - if (seq) - seq_free(seq); - return status; -} - diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..e6e5019 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +*.dir/ diff --git a/test/Makefile b/test/Makefile deleted file mode 100644 index d2baac8..0000000 --- a/test/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -TOPDIR = .. -include $(TOPDIR)/include/builddefs - -TESTS = $(wildcard *.test) -ROOT = $(wildcard root/*.test) -NFS = $(wildcard nfs/*.test) -LSRCFILES = sort-getfacl-output run make-tree $(TESTS) $(ROOT) $(NFS) \ - malformed-restore-double-owner.acl - -include $(BUILDRULES) - -default install install-dev install-lib: - -PATH := $(abspath ../getfacl/):$(abspath ../setfacl/):$(abspath ../chacl/):$(PATH) - -tests: $(TESTS) -root-tests: $(ROOT) -nfs-tests: $(NFS) - -$(TESTS): - @echo "*** $@ ***"; perl run $@ - -$(NFS): - @echo "NFS specific tests"; echo "*** $@ ***"; perl run $@ - -$(ROOT): - @echo "Note: Tests must run as root"; echo "*** $@ ***"; perl run $@ - -.PHONY: $(TESTS) $(NFS) $(ROOT) -.NOTPARALLEL: - - diff --git a/test/Makemodule.am b/test/Makemodule.am new file mode 100644 index 0000000..7b8dafe --- /dev/null +++ b/test/Makemodule.am @@ -0,0 +1,27 @@ +XFAIL_TESTS = \ + test/nfs/nfsacl.test \ + test/nfs/nfs-dir.test +TESTS = \ + test/cp.test \ + test/getfacl-noacl.test \ + test/getfacl-recursive.test \ + test/malformed-restore.test \ + test/misc.test \ + test/sbits-restore.test \ + test/setfacl-X.test \ + test/utf8-filenames.test \ + test/root/getfacl.test \ + test/root/permissions.test \ + test/root/restore.test \ + test/root/setfacl.test \ + $(XFAIL_TESTS) + +EXTRA_DIST += \ + test/make-tree \ + test/malformed-restore-double-owner.acl \ + test/run \ + test/sort-getfacl-output \ + $(TESTS) + +AM_TESTS_ENVIRONMENT = PATH="$(abs_top_builddir):$$PATH"; +TEST_LOG_COMPILER = $(srcdir)/test/run diff --git a/test/root/getfacl.test b/test/root/getfacl.test index f84e25d..649ebae 100644 --- a/test/root/getfacl.test +++ b/test/root/getfacl.test @@ -1,6 +1,10 @@ Make sure that getfacl always adds at least one space between the permissions in an acl entry and the effective permissions comment. +Cry immediately if we are not running as root. + + $ require_root + $ umask 022 $ mkdir d $ groupadd loooooooooooooooooooooooonggroup diff --git a/test/root/permissions.test b/test/root/permissions.test index afaf5f0..9b9e3de 100644 --- a/test/root/permissions.test +++ b/test/root/permissions.test @@ -9,8 +9,7 @@ listed in parentheses. Cry immediately if we are not running as root. - $ id -u - > 0 + $ require_root First, set up a temporary directory and create a regular file with diff --git a/test/root/restore.test b/test/root/restore.test index 6003cd4..63a9d01 100644 --- a/test/root/restore.test +++ b/test/root/restore.test @@ -1,6 +1,10 @@ Ensure setuid bit is restored when the owner changes https://bugzilla.redhat.com/show_bug.cgi?id=467936#c7 +Cry immediately if we are not running as root. + + $ require_root + $ touch passwd $ chmod 755 passwd $ chmod u+s passwd diff --git a/test/root/setfacl.test b/test/root/setfacl.test index 630e9fb..a46a9f4 100644 --- a/test/root/setfacl.test +++ b/test/root/setfacl.test @@ -1,5 +1,9 @@ Setfacl utility tests. Run these tests on a filesystem with ACL support. +Cry immediately if we are not running as root. + + $ require_root + $ mkdir d $ chown bin:bin d $ cd d diff --git a/test/run b/test/run index 0a12be6..fcbcf29 100755 --- a/test/run +++ b/test/run @@ -268,6 +268,14 @@ sub exec_test($$) { return su($prog->[1]); } elsif ($prog->[0] eq "sg") { return sg($prog->[1]); + } elsif ($prog->[0] eq "require_root") { + my $ret = su("root"); + if ($! != 0) { + print $ret->[0]; + warn "required root failed; skipping test"; + exit 77; + } + return []; } elsif ($prog->[0] eq "export") { my ($name, $value) = split /=/, $prog->[1]; # FIXME: need to evaluate $value, so that things like this will work: diff --git a/tools/Makemodule.am b/tools/Makemodule.am new file mode 100644 index 0000000..60a9a2d --- /dev/null +++ b/tools/Makemodule.am @@ -0,0 +1,23 @@ +tools_ldadd = $(LDADD) libacl.la libmisc.la + +bin_PROGRAMS += chacl +chacl_SOURCES = tools/chacl.c +chacl_LDADD = $(tools_ldadd) + +bin_PROGRAMS += getfacl +getfacl_SOURCES = \ + tools/getfacl.c \ + tools/user_group.c \ + tools/user_group.h +getfacl_LDADD = $(tools_ldadd) + +bin_PROGRAMS += setfacl +setfacl_SOURCES = \ + tools/do_set.c \ + tools/do_set.h \ + tools/parse.c \ + tools/parse.h \ + tools/sequence.c \ + tools/sequence.h \ + tools/setfacl.c +setfacl_LDADD = $(tools_ldadd) diff --git a/tools/chacl.c b/tools/chacl.c new file mode 100644 index 0000000..525a7ff --- /dev/null +++ b/tools/chacl.c @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2001-2002 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" + +static int acl_delete_file (const char * path, acl_type_t type); +static int list_acl(char *file); +static int set_acl(acl_t acl, acl_t dacl, const char *fname); +static int walk_dir(acl_t acl, acl_t dacl, const char *fname); + +static char *program; +static int rflag; + +static void +usage(void) +{ + fprintf(stderr, _("Usage:\n")); + fprintf(stderr, _("\t%s acl pathname...\n"), program); + fprintf(stderr, _("\t%s -b acl dacl pathname...\n"), program); + fprintf(stderr, _("\t%s -d dacl pathname...\n"), program); + fprintf(stderr, _("\t%s -R pathname...\n"), program); + fprintf(stderr, _("\t%s -D pathname...\n"), program); + fprintf(stderr, _("\t%s -B pathname...\n"), program); + fprintf(stderr, _("\t%s -l pathname...\t[not IRIX compatible]\n"), + program); + fprintf(stderr, _("\t%s -r pathname...\t[not IRIX compatible]\n"), + program); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + char *file; + int switch_flag = 0; /* ensure only one switch is used */ + int args_required = 2; + int failed = 0; /* exit status */ + int c; /* For use by getopt(3) */ + int dflag = 0; /* a Default ACL is desired */ + int bflag = 0; /* a both ACLs are desired */ + int Rflag = 0; /* set to true to remove an acl */ + int Dflag = 0; /* set to true to remove default acls */ + int Bflag = 0; /* set to true to remove both acls */ + int lflag = 0; /* set to true to list acls */ + acl_t acl = NULL; /* File ACL */ + acl_t dacl = NULL; /* Directory Default ACL */ + + program = basename(argv[0]); + + setlocale(LC_CTYPE, ""); + setlocale(LC_MESSAGES, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + /* parse arguments */ + while ((c = getopt(argc, argv, "bdlRDBr")) != -1) { + if (switch_flag) + usage(); + switch_flag = 1; + + switch (c) { + case 'b': + bflag = 1; + args_required = 3; + break; + case 'd': + dflag = 1; + args_required = 2; + break; + case 'R': + Rflag = 1; + args_required = 1; + break; + case 'D': + Dflag = 1; + args_required = 1; + break; + case 'B': + Bflag = 1; + args_required = 1; + break; + case 'l': + lflag = 1; + args_required = 1; + break; + case 'r': + rflag = 1; + args_required = 1; + break; + default: + usage(); + break; + } + } + + /* if not enough arguments quit */ + if ((argc - optind) < args_required) + usage(); + + /* list the acls */ + if (lflag) { + for (; optind < argc; optind++) { + file = argv[optind]; + if (!list_acl(file)) + failed++; + } + return(failed); + } + + /* remove the acls */ + if (Rflag || Dflag || Bflag) { + for (; optind < argc; optind++) { + file = argv[optind]; + if (!Dflag && + (acl_delete_file(file, ACL_TYPE_ACCESS) == -1)) { + fprintf(stderr, _( + "%s: error removing access acl on \"%s\": %s\n"), + program, file, strerror(errno)); + failed++; + } + if (!Rflag && + (acl_delete_file(file, ACL_TYPE_DEFAULT) == -1)) { + fprintf(stderr, _( + "%s: error removing default acl on \"%s\": %s\n"), + program, file, strerror(errno)); + failed++; + } + } + return(failed); + } + + /* file access acl */ + if (! dflag) { + acl = acl_from_text(argv[optind]); + failed = acl_check(acl, &c); + if (failed < 0) { + fprintf(stderr, "%s: %s - %s\n", + program, argv[optind], strerror(errno)); + return 1; + } + else if (failed > 0) { + fprintf(stderr, _( + "%s: access ACL '%s': %s at entry %d\n"), + program, argv[optind], acl_error(failed), c); + return 1; + } + optind++; + } + + + /* directory default acl */ + if (bflag || dflag) { + dacl = acl_from_text(argv[optind]); + failed = acl_check(dacl, &c); + if (failed < 0) { + fprintf(stderr, "%s: %s - %s\n", + program, argv[optind], strerror(errno)); + return 1; + } + else if (failed > 0) { + fprintf(stderr, _( + "%s: access ACL '%s': %s at entry %d\n"), + program, argv[optind], acl_error(failed), c); + return 1; + } + optind++; + } + + /* place acls on files */ + for (; optind < argc; optind++) + failed += set_acl(acl, dacl, argv[optind]); + + if (acl) + acl_free(acl); + if (dacl) + acl_free(dacl); + + return(failed); +} + +/* + * deletes an access acl or directory default acl if one exists + */ +static int +acl_delete_file(const char *path, acl_type_t type) +{ + int error = 0; + + /* converts access ACL to a minimal ACL */ + if (type == ACL_TYPE_ACCESS) { + acl_t acl; + acl_entry_t entry; + acl_tag_t tag; + + acl = acl_get_file(path, ACL_TYPE_ACCESS); + if (!acl) + return -1; + error = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); + while (error == 1) { + acl_get_tag_type(entry, &tag); + switch(tag) { + case ACL_USER: + case ACL_GROUP: + case ACL_MASK: + acl_delete_entry(acl, entry); + break; + } + error = acl_get_entry(acl, ACL_NEXT_ENTRY, &entry); + } + if (!error) + error = acl_set_file(path, ACL_TYPE_ACCESS, acl); + } else + error = acl_delete_def_file(path); + return(error); +} + +/* + * lists the acl for a file/dir in short text form + * return 0 on failure + * return 1 on success + */ +static int +list_acl(char *file) +{ + acl_t acl = NULL; + acl_t dacl = NULL; + char *acl_text, *dacl_text = NULL; + + if ((acl = acl_get_file(file, ACL_TYPE_ACCESS)) == NULL) { + fprintf(stderr, _("%s: cannot get access ACL on '%s': %s\n"), + program, file, strerror(errno)); + return 0; + } + if ((dacl = acl_get_file(file, ACL_TYPE_DEFAULT)) == NULL && + (errno != EACCES)) { /* EACCES given if not a directory */ + fprintf(stderr, _("%s: cannot get default ACL on '%s': %s\n"), + program, file, strerror(errno)); + return 0; + } + acl_text = acl_to_any_text(acl, NULL, ',', TEXT_ABBREVIATE); + if (acl_text == NULL) { + fprintf(stderr, _("%s: cannot get access ACL text on " + "'%s': %s\n"), program, file, strerror(errno)); + return 0; + } + if (acl_entries(dacl) > 0) { + dacl_text = acl_to_any_text(dacl, NULL, ',', TEXT_ABBREVIATE); + if (dacl_text == NULL) { + fprintf(stderr, _("%s: cannot get default ACL text on " + "'%s': %s\n"), program, file, strerror(errno)); + return 0; + } + } + if (dacl_text) { + printf("%s [%s/%s]\n", file, acl_text, dacl_text); + acl_free(dacl_text); + } else + printf("%s [%s]\n", file, acl_text); + acl_free(acl_text); + acl_free(acl); + acl_free(dacl); + return 1; +} + +static int +set_acl(acl_t acl, acl_t dacl, const char *fname) +{ + int failed = 0; + + if (rflag) + failed += walk_dir(acl, dacl, fname); + + /* set regular acl */ + if (acl && acl_set_file(fname, ACL_TYPE_ACCESS, acl) == -1) { + fprintf(stderr, _("%s: cannot set access acl on \"%s\": %s\n"), + program, fname, strerror(errno)); + failed++; + } + /* set default acl */ + if (dacl && acl_set_file(fname, ACL_TYPE_DEFAULT, dacl) == -1) { + fprintf(stderr, _("%s: cannot set default acl on \"%s\": %s\n"), + program, fname, strerror(errno)); + failed++; + } + + return(failed); +} + +static int +walk_dir(acl_t acl, acl_t dacl, const char *fname) +{ + int failed = 0; + DIR *dir; + struct dirent64 *d; + char *name; + + if ((dir = opendir(fname)) == NULL) { + if (errno != ENOTDIR) { + fprintf(stderr, _("%s: opendir failed: %s\n"), + program, strerror(errno)); + return(1); + } + return(0); /* got a file, not an error */ + } + + while ((d = readdir64(dir)) != NULL) { + /* skip "." and ".." entries */ + if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) + continue; + + name = malloc(strlen(fname) + strlen(d->d_name) + 2); + if (name == NULL) { + fprintf(stderr, _("%s: malloc failed: %s\n"), + program, strerror(errno)); + exit(1); + } + sprintf(name, "%s/%s", fname, d->d_name); + + failed += set_acl(acl, dacl, name); + free(name); + } + closedir(dir); + + return(failed); +} diff --git a/tools/do_set.c b/tools/do_set.c new file mode 100644 index 0000000..60da837 --- /dev/null +++ b/tools/do_set.c @@ -0,0 +1,528 @@ +/* + File: do_set.c + (Linux Access Control List Management) + + Copyright (C) 1999, 2000 + Andreas Gruenbacher, + + This program 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 program 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. +*/ + +#include "config.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" +#include "sequence.h" +#include "do_set.h" +#include "parse.h" +#include "walk_tree.h" + + +extern const char *progname; +extern int opt_recalculate; +extern int opt_test; +extern int print_options; + +acl_entry_t +find_entry( + acl_t acl, + acl_tag_t type, + id_t id) +{ + acl_entry_t ent; + acl_tag_t e_type; + id_t *e_id_p; + + if (acl_get_entry(acl, ACL_FIRST_ENTRY, &ent) != 1) + return NULL; + + for(;;) { + acl_get_tag_type(ent, &e_type); + if (type == e_type) { + if (id != ACL_UNDEFINED_ID) { + e_id_p = acl_get_qualifier(ent); + if (e_id_p == NULL) + return NULL; + if (*e_id_p == id) { + acl_free(e_id_p); + return ent; + } + acl_free(e_id_p); + } else { + return ent; + } + } + if (acl_get_entry(acl, ACL_NEXT_ENTRY, &ent) != 1) + return NULL; + } +} + +int +has_execute_perms( + acl_t acl) +{ + acl_entry_t ent; + + if (acl_get_entry(acl, ACL_FIRST_ENTRY, &ent) != 1) + return 0; + + for(;;) { + acl_permset_t permset; + + acl_get_permset(ent, &permset); + if (acl_get_perm(permset, ACL_EXECUTE) != 0) + return 1; + + if (acl_get_entry(acl, ACL_NEXT_ENTRY, &ent) != 1) + return 0; + } +} + +int +clone_entry( + acl_t from_acl, + acl_tag_t from_type, + acl_t *to_acl, + acl_tag_t to_type) +{ + acl_entry_t from_entry, to_entry; + from_entry = find_entry(from_acl, from_type, ACL_UNDEFINED_ID); + if (from_entry) { + if (acl_create_entry(to_acl, &to_entry) != 0) + return -1; + acl_copy_entry(to_entry, from_entry); + acl_set_tag_type(to_entry, to_type); + return 0; + } else { + return 1; + } +} + + +void +print_test( + FILE *file, + const char *path_p, + const struct stat *st, + const acl_t acl, + const acl_t default_acl) +{ + char *acl_text, *default_acl_text; + + acl_text = acl_to_any_text(acl, NULL, ',', TEXT_ABBREVIATE); + default_acl_text = + acl_to_any_text(default_acl, "d:", ',', TEXT_ABBREVIATE); + fprintf(file, "%s: %s,%s\n", path_p, + acl_text ? acl_text : "*", + default_acl_text ? default_acl_text : "*"); + acl_free(acl_text); + acl_free(default_acl_text); +} + + +static void +set_perm( + acl_entry_t ent, + mode_t perm) +{ + acl_permset_t set; + + acl_get_permset(ent, &set); + if (perm & CMD_PERM_READ) + acl_add_perm(set, ACL_READ); + else + acl_delete_perm(set, ACL_READ); + if (perm & CMD_PERM_WRITE) + acl_add_perm(set, ACL_WRITE); + else + acl_delete_perm(set, ACL_WRITE); + if (perm & CMD_PERM_EXECUTE) + acl_add_perm(set, ACL_EXECUTE); + else + acl_delete_perm(set, ACL_EXECUTE); +} + + +static int +retrieve_acl( + const char *path_p, + acl_type_t type, + const struct stat *st, + acl_t *old_acl, + acl_t *acl) +{ + if (*acl) + return 0; + *acl = NULL; + if (type == ACL_TYPE_ACCESS || S_ISDIR(st->st_mode)) { + *old_acl = acl_get_file(path_p, type); + if (*old_acl == NULL && (errno == ENOSYS || errno == ENOTSUP)) { + if (type == ACL_TYPE_DEFAULT) + *old_acl = acl_init(0); + else + *old_acl = acl_from_mode(st->st_mode); + } + } else + *old_acl = acl_init(0); + if (*old_acl == NULL) + return -1; + *acl = acl_dup(*old_acl); + if (*acl == NULL) + return -1; + return 0; +} + + +static int +remove_extended_entries( + acl_t acl) +{ + acl_entry_t ent, group_obj; + acl_permset_t mask_permset, group_obj_permset; + acl_tag_t tag; + int error; + + /* + * Removing the ACL_MASK entry from the ACL results in + * increased permissions for the owning group if the + * ACL_GROUP_OBJ entry contains permissions not contained + * in the ACL_MASK entry. We remove these permissions from + * the ACL_GROUP_OBJ entry to avoid that. + * + * After removing the ACL, the file owner and the owning group + * therefore have the same permissions as before. + */ + + ent = find_entry(acl, ACL_MASK, ACL_UNDEFINED_ID); + group_obj = find_entry(acl, ACL_GROUP_OBJ, ACL_UNDEFINED_ID); + if (ent && group_obj) { + if (!acl_get_permset(ent, &mask_permset) && + !acl_get_permset(group_obj, &group_obj_permset)) { + if (!acl_get_perm(mask_permset, ACL_READ)) + acl_delete_perm(group_obj_permset, ACL_READ); + if (!acl_get_perm(mask_permset, ACL_WRITE)) + acl_delete_perm(group_obj_permset, ACL_WRITE); + if (!acl_get_perm(mask_permset, ACL_EXECUTE)) + acl_delete_perm(group_obj_permset, ACL_EXECUTE); + } + } + + error = acl_get_entry(acl, ACL_FIRST_ENTRY, &ent); + while (error == 1) { + acl_get_tag_type(ent, &tag); + switch(tag) { + case ACL_USER: + case ACL_GROUP: + case ACL_MASK: + acl_delete_entry(acl, ent); + break; + default: + break; + } + + error = acl_get_entry(acl, ACL_NEXT_ENTRY, &ent); + } + if (error < 0) + return -1; + return 0; +} + + +#define RETRIEVE_ACL(type) do { \ + error = retrieve_acl(path_p, type, st, old_xacl, xacl); \ + if (error) \ + goto fail; \ + } while(0) + +int +do_set( + const char *path_p, + const struct stat *st, + int walk_flags, + void *arg) +{ + struct do_set_args *args = arg; + acl_t old_acl = NULL, old_default_acl = NULL; + acl_t acl = NULL, default_acl = NULL; + acl_t *xacl, *old_xacl; + acl_entry_t ent; + cmd_t cmd; + int which_entry; + int errors = 0, error; + char *acl_text; + int acl_modified = 0, default_acl_modified = 0; + int acl_mask_provided = 0, default_acl_mask_provided = 0; + + if (walk_flags & WALK_TREE_FAILED) { + fprintf(stderr, "%s: %s: %s\n", progname, path_p, strerror(errno)); + return 1; + } + + /* + * Symlinks can never have ACLs, so when doing a physical walk, we + * skip symlinks altogether, and when doing a half-logical walk, we + * skip all non-toplevel symlinks. + */ + if ((walk_flags & WALK_TREE_SYMLINK) && + ((walk_flags & WALK_TREE_PHYSICAL) || + !(walk_flags & (WALK_TREE_TOPLEVEL | WALK_TREE_LOGICAL)))) + return 0; + + /* Execute the commands in seq (read ACLs on demand) */ + error = seq_get_cmd(args->seq, SEQ_FIRST_CMD, &cmd); + if (error == 0) + return 0; + while (error == 1) { + mode_t perm = cmd->c_perm; + + if (cmd->c_type == ACL_TYPE_ACCESS) { + xacl = &acl; + old_xacl = &old_acl; + acl_modified = 1; + if (cmd->c_tag == ACL_MASK) + acl_mask_provided = 1; + } else { + xacl = &default_acl; + old_xacl = &old_default_acl; + default_acl_modified = 1; + if (cmd->c_tag == ACL_MASK) + default_acl_mask_provided = 1; + } + + RETRIEVE_ACL(cmd->c_type); + + /* Check for `X', and replace with `x' as appropriate. */ + if (perm & CMD_PERM_COND_EXECUTE) { + perm &= ~CMD_PERM_COND_EXECUTE; + if (S_ISDIR(st->st_mode) || has_execute_perms(*xacl)) + perm |= CMD_PERM_EXECUTE; + } + + switch(cmd->c_cmd) { + case CMD_ENTRY_REPLACE: + ent = find_entry(*xacl, cmd->c_tag, cmd->c_id); + if (!ent) { + if (acl_create_entry(xacl, &ent) != 0) + goto fail; + acl_set_tag_type(ent, cmd->c_tag); + if (cmd->c_id != ACL_UNDEFINED_ID) + acl_set_qualifier(ent, + &cmd->c_id); + } + set_perm(ent, perm); + break; + + case CMD_REMOVE_ENTRY: + ent = find_entry(*xacl, cmd->c_tag, cmd->c_id); + if (ent) + acl_delete_entry(*xacl, ent); + else + /* ignore */; + break; + + case CMD_REMOVE_EXTENDED_ACL: + remove_extended_entries(acl); + break; + + case CMD_REMOVE_ACL: + acl_free(*xacl); + *xacl = acl_init(5); + if (!*xacl) + goto fail; + break; + + default: + errno = EINVAL; + goto fail; + } + + error = seq_get_cmd(args->seq, SEQ_NEXT_CMD, &cmd); + } + + if (error < 0) + goto fail; + + /* Try to fill in missing entries */ + if (default_acl && acl_entries(default_acl) != 0) { + xacl = &acl; + old_xacl = &old_acl; + + if (!find_entry(default_acl, ACL_USER_OBJ, ACL_UNDEFINED_ID)) { + if (!acl) + RETRIEVE_ACL(ACL_TYPE_ACCESS); + clone_entry(acl, ACL_USER_OBJ, + &default_acl, ACL_USER_OBJ); + } + if (!find_entry(default_acl, ACL_GROUP_OBJ, ACL_UNDEFINED_ID)) { + if (!acl) + RETRIEVE_ACL(ACL_TYPE_ACCESS); + clone_entry(acl, ACL_GROUP_OBJ, + &default_acl, ACL_GROUP_OBJ); + } + if (!find_entry(default_acl, ACL_OTHER, ACL_UNDEFINED_ID)) { + if (!acl) + RETRIEVE_ACL(ACL_TYPE_ACCESS); + clone_entry(acl, ACL_OTHER, + &default_acl, ACL_OTHER); + } + } + + /* update mask entries and check if ACLs are valid */ + if (acl && acl_modified) { + if (acl_equiv_mode(acl, NULL) != 0) { + if (!acl_mask_provided && + !find_entry(acl, ACL_MASK, ACL_UNDEFINED_ID)) + clone_entry(acl, ACL_GROUP_OBJ, + &acl, ACL_MASK); + if (opt_recalculate != -1 && + (!acl_mask_provided || opt_recalculate == 1)) + acl_calc_mask(&acl); + } + + error = acl_check(acl, &which_entry); + if (error < 0) + goto fail; + if (error > 0) { + acl_text = acl_to_any_text(acl, NULL, ',', 0); + fprintf(stderr, _("%s: %s: Malformed access ACL " + "`%s': %s at entry %d\n"), progname, path_p, + acl_text, acl_error(error), which_entry+1); + acl_free(acl_text); + errors++; + goto cleanup; + } + } + + if (default_acl && acl_entries(default_acl) != 0 && + default_acl_modified) { + if (acl_equiv_mode(default_acl, NULL) != 0) { + if (!default_acl_mask_provided && + !find_entry(default_acl,ACL_MASK,ACL_UNDEFINED_ID)) + clone_entry(default_acl, ACL_GROUP_OBJ, + &default_acl, ACL_MASK); + if (opt_recalculate != -1 && + (!default_acl_mask_provided || + opt_recalculate == 1)) + acl_calc_mask(&default_acl); + } + + error = acl_check(default_acl, &which_entry); + if (error < 0) + goto fail; + if (error > 0) { + acl_text = acl_to_any_text(default_acl, NULL, ',', 0); + fprintf(stderr, _("%s: %s: Malformed default ACL " + "`%s': %s at entry %d\n"), + progname, path_p, acl_text, + acl_error(error), which_entry+1); + acl_free(acl_text); + errors++; + goto cleanup; + } + } + + /* Only directores can have default ACLs */ + if (default_acl && !S_ISDIR(st->st_mode) && (walk_flags & WALK_TREE_RECURSIVE)) { + /* In recursive mode, ignore default ACLs for files */ + acl_free(default_acl); + default_acl = NULL; + } + + /* check which ACLs have changed */ + if (acl && old_acl && acl_cmp(old_acl, acl) == 0) { + acl_free(acl); + acl = NULL; + } + if ((default_acl && old_default_acl && + acl_cmp(old_default_acl, default_acl) == 0)) { + acl_free(default_acl); + default_acl = NULL; + } + + /* update the file system */ + if (opt_test) { + print_test(stdout, path_p, st, + acl, default_acl); + goto cleanup; + } + if (acl) { + int equiv_mode; + mode_t mode = 0; + + equiv_mode = acl_equiv_mode(acl, &mode); + + if (acl_set_file(path_p, ACL_TYPE_ACCESS, acl) != 0) { + if (errno == ENOSYS || errno == ENOTSUP) { + if (equiv_mode != 0) + goto fail; + else if (chmod(path_p, mode) != 0) + goto fail; + } else + goto fail; + } + args->mode = mode; + } + if (default_acl) { + if (S_ISDIR(st->st_mode)) { + if (acl_entries(default_acl) == 0) { + if (acl_delete_def_file(path_p) != 0 && + errno != ENOSYS && errno != ENOTSUP) + goto fail; + } else { + if (acl_set_file(path_p, ACL_TYPE_DEFAULT, + default_acl) != 0) + goto fail; + } + } else { + if (acl_entries(default_acl) != 0) { + fprintf(stderr, _("%s: %s: Only directories " + "can have default ACLs\n"), + progname, path_p); + errors++; + goto cleanup; + } + } + } + + error = 0; + +cleanup: + if (acl) + acl_free(acl); + if (old_acl) + acl_free(old_acl); + if (default_acl) + acl_free(default_acl); + if (old_default_acl) + acl_free(old_default_acl); + return errors; + +fail: + fprintf(stderr, "%s: %s: %s\n", progname, path_p, strerror(errno)); + errors++; + goto cleanup; +} + diff --git a/tools/do_set.h b/tools/do_set.h new file mode 100644 index 0000000..2ea25a8 --- /dev/null +++ b/tools/do_set.h @@ -0,0 +1,36 @@ +/* + File: do_set.h + (Linux Access Control List Management) + + Copyright (C) 2009 by Andreas Gruenbacher + + + This program 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 program 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. +*/ + +#ifndef __DO_SET_H +#define __DO_SET_H + +#include "sequence.h" + +struct do_set_args { + seq_t seq; + mode_t mode; +}; + +extern int do_set(const char *path_p, const struct stat *stat_p, int flags, + void *arg); + +#endif /* __DO_SET_H */ diff --git a/tools/getfacl.c b/tools/getfacl.c new file mode 100644 index 0000000..22cc1c7 --- /dev/null +++ b/tools/getfacl.c @@ -0,0 +1,747 @@ +/* + File: getfacl.c + (Linux Access Control List Management) + + Copyright (C) 1999-2002 + Andreas Gruenbacher, + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU 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. +*/ + +#include "config.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" +#include "user_group.h" +#include "walk_tree.h" + +#define POSIXLY_CORRECT_STR "POSIXLY_CORRECT" + +#if !POSIXLY_CORRECT +# define CMD_LINE_OPTIONS "aceEsRLPtpndvh" +#endif +#define POSIXLY_CMD_LINE_OPTIONS "d" + +struct option long_options[] = { +#if !POSIXLY_CORRECT + { "access", 0, 0, 'a' }, + { "omit-header", 0, 0, 'c' }, + { "all-effective", 0, 0, 'e' }, + { "no-effective", 0, 0, 'E' }, + { "skip-base", 0, 0, 's' }, + { "recursive", 0, 0, 'R' }, + { "logical", 0, 0, 'L' }, + { "physical", 0, 0, 'P' }, + { "tabular", 0, 0, 't' }, + { "absolute-names", 0, 0, 'p' }, + { "numeric", 0, 0, 'n' }, +#endif + { "default", 0, 0, 'd' }, + { "version", 0, 0, 'v' }, + { "help", 0, 0, 'h' }, + { NULL, 0, 0, 0 } +}; + +const char *progname; +const char *cmd_line_options; + +int walk_flags = WALK_TREE_DEREFERENCE_TOPLEVEL; +int opt_print_acl; +int opt_print_default_acl; +int opt_strip_leading_slash = 1; +int opt_comments = 1; /* include comments */ +int opt_skip_base; /* skip files that only have the base entries */ +int opt_tabular; /* tabular output format (alias `showacl') */ +#if POSIXLY_CORRECT +const int posixly_correct = 1; /* Posix compatible behavior! */ +#else +int posixly_correct; /* Posix compatible behavior? */ +#endif +int had_errors; +int absolute_warning; /* Absolute path warning was issued */ +int print_options = TEXT_SOME_EFFECTIVE; +int opt_numeric; /* don't convert id's to symbolic names */ + + +static const char *xquote(const char *str, const char *quote_chars) +{ + const char *q = quote(str, quote_chars); + if (q == NULL) { + fprintf(stderr, "%s: %s\n", progname, strerror(errno)); + exit(1); + } + return q; +} + +struct name_list { + struct name_list *next; + char name[0]; +}; + +void free_list(struct name_list *names) +{ + struct name_list *next; + + while (names) { + next = names->next; + free(names); + names = next; + } +} + +struct name_list *get_list(const struct stat *st, acl_t acl) +{ + struct name_list *first = NULL, *last = NULL; + acl_entry_t ent; + int ret = 0; + + if (acl != NULL) + ret = acl_get_entry(acl, ACL_FIRST_ENTRY, &ent); + if (ret != 1) + return NULL; + while (ret > 0) { + acl_tag_t e_type; + const id_t *id_p; + const char *name = ""; + int len; + + acl_get_tag_type(ent, &e_type); + switch(e_type) { + case ACL_USER_OBJ: + name = user_name(st->st_uid, opt_numeric); + break; + + case ACL_USER: + id_p = acl_get_qualifier(ent); + if (id_p != NULL) + name = user_name(*id_p, opt_numeric); + break; + + case ACL_GROUP_OBJ: + name = group_name(st->st_gid, opt_numeric); + break; + + case ACL_GROUP: + id_p = acl_get_qualifier(ent); + if (id_p != NULL) + name = group_name(*id_p, opt_numeric); + break; + } + name = xquote(name, "\t\n\r"); + len = strlen(name); + if (last == NULL) { + first = last = (struct name_list *) + malloc(sizeof(struct name_list) + len + 1); + } else { + last->next = (struct name_list *) + malloc(sizeof(struct name_list) + len + 1); + last = last->next; + } + if (last == NULL) { + free_list(first); + return NULL; + } + last->next = NULL; + strcpy(last->name, name); + + ret = acl_get_entry(acl, ACL_NEXT_ENTRY, &ent); + } + return first; +} + +int max_name_length(struct name_list *names) +{ + int max_len = 0; + while (names != NULL) { + struct name_list *next = names->next; + int len = strlen(names->name); + + if (len > max_len) + max_len = len; + names = next; + } + return max_len; +} + +int names_width; + +struct acl_perm_def { + acl_tag_t tag; + char c; +}; + +struct acl_perm_def acl_perm_defs[] = { + { ACL_READ, 'r' }, + { ACL_WRITE, 'w' }, + { ACL_EXECUTE, 'x' }, + { 0, 0 } +}; + +#define ACL_PERMS (sizeof(acl_perm_defs) / sizeof(struct acl_perm_def) - 1) + +void acl_perm_str(acl_entry_t entry, char *str) +{ + acl_permset_t permset; + int n; + + acl_get_permset(entry, &permset); + for (n = 0; n < (int) ACL_PERMS; n++) { + str[n] = (acl_get_perm(permset, acl_perm_defs[n].tag) ? + acl_perm_defs[n].c : '-'); + } + str[n] = '\0'; +} + +void acl_mask_perm_str(acl_t acl, char *str) +{ + acl_entry_t entry; + + str[0] = '\0'; + if (acl_get_entry(acl, ACL_FIRST_ENTRY, &entry) != 1) + return; + for(;;) { + acl_tag_t tag; + + acl_get_tag_type(entry, &tag); + if (tag == ACL_MASK) { + acl_perm_str(entry, str); + return; + } + if (acl_get_entry(acl, ACL_NEXT_ENTRY, &entry) != 1) + return; + } +} + +void apply_mask(char *perm, const char *mask) +{ + while (*perm) { + if (*mask == '-' && *perm >= 'a' && *perm <= 'z') + *perm = *perm - 'a' + 'A'; + perm++; + if (*mask) + mask++; + } +} + +int show_line(FILE *stream, struct name_list **acl_names, acl_t acl, + acl_entry_t *acl_ent, const char *acl_mask, + struct name_list **dacl_names, acl_t dacl, + acl_entry_t *dacl_ent, const char *dacl_mask) +{ + acl_tag_t tag_type; + const char *tag, *name; + char acl_perm[ACL_PERMS+1], dacl_perm[ACL_PERMS+1]; + + if (acl) { + acl_get_tag_type(*acl_ent, &tag_type); + name = (*acl_names)->name; + } else { + acl_get_tag_type(*dacl_ent, &tag_type); + name = (*dacl_names)->name; + } + + switch(tag_type) { + case ACL_USER_OBJ: + tag = "USER"; + break; + case ACL_USER: + tag = "user"; + break; + case ACL_GROUP_OBJ: + tag = "GROUP"; + break; + case ACL_GROUP: + tag = "group"; + break; + case ACL_MASK: + tag = "mask"; + break; + case ACL_OTHER: + tag = "other"; + break; + default: + return -1; + } + + memset(acl_perm, ' ', ACL_PERMS); + acl_perm[ACL_PERMS] = '\0'; + if (acl_ent) { + acl_perm_str(*acl_ent, acl_perm); + if (tag_type != ACL_USER_OBJ && tag_type != ACL_OTHER && + tag_type != ACL_MASK) + apply_mask(acl_perm, acl_mask); + } + memset(dacl_perm, ' ', ACL_PERMS); + dacl_perm[ACL_PERMS] = '\0'; + if (dacl_ent) { + acl_perm_str(*dacl_ent, dacl_perm); + if (tag_type != ACL_USER_OBJ && tag_type != ACL_OTHER && + tag_type != ACL_MASK) + apply_mask(dacl_perm, dacl_mask); + } + + fprintf(stream, "%-5s %*s %*s %*s\n", + tag, -names_width, name, + -(int)ACL_PERMS, acl_perm, + -(int)ACL_PERMS, dacl_perm); + + if (acl_names) { + acl_get_entry(acl, ACL_NEXT_ENTRY, acl_ent); + (*acl_names) = (*acl_names)->next; + } + if (dacl_names) { + acl_get_entry(dacl, ACL_NEXT_ENTRY, dacl_ent); + (*dacl_names) = (*dacl_names)->next; + } + return 0; +} + +int do_show(FILE *stream, const char *path_p, const struct stat *st, + acl_t acl, acl_t dacl) +{ + struct name_list *acl_names = get_list(st, acl), + *first_acl_name = acl_names; + struct name_list *dacl_names = get_list(st, dacl), + *first_dacl_name = dacl_names; + + int acl_names_width = max_name_length(acl_names); + int dacl_names_width = max_name_length(dacl_names); + acl_entry_t acl_ent; + acl_entry_t dacl_ent; + char acl_mask[ACL_PERMS+1], dacl_mask[ACL_PERMS+1]; + int ret; + + names_width = 8; + if (acl_names_width > names_width) + names_width = acl_names_width; + if (dacl_names_width > names_width) + names_width = dacl_names_width; + + acl_mask[0] = '\0'; + if (acl) { + acl_mask_perm_str(acl, acl_mask); + ret = acl_get_entry(acl, ACL_FIRST_ENTRY, &acl_ent); + if (ret == 0) + acl = NULL; + if (ret < 0) + return ret; + } + dacl_mask[0] = '\0'; + if (dacl) { + acl_mask_perm_str(dacl, dacl_mask); + ret = acl_get_entry(dacl, ACL_FIRST_ENTRY, &dacl_ent); + if (ret == 0) + dacl = NULL; + if (ret < 0) + return ret; + } + fprintf(stream, "# file: %s\n", xquote(path_p, "\n\r")); + while (acl_names != NULL || dacl_names != NULL) { + acl_tag_t acl_tag, dacl_tag; + + if (acl) + acl_get_tag_type(acl_ent, &acl_tag); + if (dacl) + acl_get_tag_type(dacl_ent, &dacl_tag); + + if (acl && (!dacl || acl_tag < dacl_tag)) { + show_line(stream, &acl_names, acl, &acl_ent, acl_mask, + NULL, NULL, NULL, NULL); + continue; + } else if (dacl && (!acl || dacl_tag < acl_tag)) { + show_line(stream, NULL, NULL, NULL, NULL, + &dacl_names, dacl, &dacl_ent, dacl_mask); + continue; + } else { + if (acl_tag == ACL_USER || acl_tag == ACL_GROUP) { + id_t *acl_id_p = NULL, *dacl_id_p = NULL; + if (acl_ent) + acl_id_p = acl_get_qualifier(acl_ent); + if (dacl_ent) + dacl_id_p = acl_get_qualifier(dacl_ent); + + if (acl && (!dacl || *acl_id_p < *dacl_id_p)) { + show_line(stream, &acl_names, acl, + &acl_ent, acl_mask, + NULL, NULL, NULL, NULL); + continue; + } else if (dacl && + (!acl || *dacl_id_p < *acl_id_p)) { + show_line(stream, NULL, NULL, NULL, + NULL, &dacl_names, dacl, + &dacl_ent, dacl_mask); + continue; + } + } + show_line(stream, &acl_names, acl, &acl_ent, acl_mask, + &dacl_names, dacl, &dacl_ent, dacl_mask); + } + } + + free_list(first_acl_name); + free_list(first_dacl_name); + + return 0; +} + +/* + * Create an ACL from the file permission bits + * of the file PATH_P. + */ +static acl_t +acl_get_file_mode(const char *path_p) +{ + struct stat st; + + if (stat(path_p, &st) != 0) + return NULL; + return acl_from_mode(st.st_mode); +} + +static const char * +flagstr(mode_t mode) +{ + static char str[4]; + + str[0] = (mode & S_ISUID) ? 's' : '-'; + str[1] = (mode & S_ISGID) ? 's' : '-'; + str[2] = (mode & S_ISVTX) ? 't' : '-'; + str[3] = '\0'; + return str; +} + +int do_print(const char *path_p, const struct stat *st, int walk_flags, void *unused) +{ + const char *default_prefix = NULL; + acl_t acl = NULL, default_acl = NULL; + int error = 0; + + if (walk_flags & WALK_TREE_FAILED) { + fprintf(stderr, "%s: %s: %s\n", progname, xquote(path_p, "\n\r"), + strerror(errno)); + return 1; + } + + /* + * Symlinks can never have ACLs, so when doing a physical walk, we + * skip symlinks altogether, and when doing a half-logical walk, we + * skip all non-toplevel symlinks. + */ + if ((walk_flags & WALK_TREE_SYMLINK) && + ((walk_flags & WALK_TREE_PHYSICAL) || + !(walk_flags & (WALK_TREE_TOPLEVEL | WALK_TREE_LOGICAL)))) + return 0; + + if (opt_print_acl) { + acl = acl_get_file(path_p, ACL_TYPE_ACCESS); + if (acl == NULL && (errno == ENOSYS || errno == ENOTSUP)) + acl = acl_get_file_mode(path_p); + if (acl == NULL) + goto fail; + } + + if (opt_print_default_acl && S_ISDIR(st->st_mode)) { + default_acl = acl_get_file(path_p, ACL_TYPE_DEFAULT); + if (default_acl == NULL) { + if (errno != ENOSYS && errno != ENOTSUP) + goto fail; + } else if (acl_entries(default_acl) == 0) { + acl_free(default_acl); + default_acl = NULL; + } + } + + if (opt_skip_base && + (!acl || acl_equiv_mode(acl, NULL) == 0) && !default_acl) + return 0; + + if (opt_print_acl && opt_print_default_acl) + default_prefix = "default:"; + + if (opt_strip_leading_slash) { + if (*path_p == '/') { + if (!absolute_warning) { + fprintf(stderr, _("%s: Removing leading " + "'/' from absolute path names\n"), + progname); + absolute_warning = 1; + } + while (*path_p == '/') + path_p++; + } else if (*path_p == '.' && *(path_p+1) == '/') + while (*++path_p == '/') + /* nothing */ ; + if (*path_p == '\0') + path_p = "."; + } + + if (opt_tabular) { + if (do_show(stdout, path_p, st, acl, default_acl) != 0) + goto fail; + } else { + if (opt_comments) { + printf("# file: %s\n", xquote(path_p, "\n\r")); + printf("# owner: %s\n", + xquote(user_name(st->st_uid, opt_numeric), " \t\n\r")); + printf("# group: %s\n", + xquote(group_name(st->st_gid, opt_numeric), " \t\n\r")); + if ((st->st_mode & (S_ISVTX | S_ISUID | S_ISGID)) && !posixly_correct) + printf("# flags: %s\n", flagstr(st->st_mode)); + } + if (acl != NULL) { + char *acl_text = acl_to_any_text(acl, NULL, '\n', + print_options); + if (!acl_text) + goto fail; + if (puts(acl_text) < 0) { + acl_free(acl_text); + goto fail; + } + acl_free(acl_text); + } + if (default_acl != NULL) { + char *acl_text = acl_to_any_text(default_acl, + default_prefix, '\n', + print_options); + if (!acl_text) + goto fail; + if (puts(acl_text) < 0) { + acl_free(acl_text); + goto fail; + } + acl_free(acl_text); + } + } + if (acl || default_acl || opt_comments) + printf("\n"); + +cleanup: + if (acl) + acl_free(acl); + if (default_acl) + acl_free(default_acl); + return error; + +fail: + fprintf(stderr, "%s: %s: %s\n", progname, xquote(path_p, "\n\r"), + strerror(errno)); + error = -1; + goto cleanup; +} + + +void help(void) +{ + printf(_("%s %s -- get file access control lists\n"), + progname, VERSION); + printf(_("Usage: %s [-%s] file ...\n"), + progname, cmd_line_options); +#if !POSIXLY_CORRECT + if (posixly_correct) { +#endif + printf(_( +" -d, --default display the default access control list\n")); +#if !POSIXLY_CORRECT + } else { + printf(_( +" -a, --access display the file access control list only\n" +" -d, --default display the default access control list only\n" +" -c, --omit-header do not display the comment header\n" +" -e, --all-effective print all effective rights\n" +" -E, --no-effective print no effective rights\n" +" -s, --skip-base skip files that only have the base entries\n" +" -R, --recursive recurse into subdirectories\n" +" -L, --logical logical walk, follow symbolic links\n" +" -P, --physical physical walk, do not follow symbolic links\n" +" -t, --tabular use tabular output format\n" +" -n, --numeric print numeric user/group identifiers\n" +" -p, --absolute-names don't strip leading '/' in pathnames\n")); + } +#endif + printf(_( +" -v, --version print version and exit\n" +" -h, --help this help text\n")); +} + +int main(int argc, char *argv[]) +{ + int opt; + char *line; + + progname = basename(argv[0]); + +#if POSIXLY_CORRECT + cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; +#else + if (getenv(POSIXLY_CORRECT_STR)) + posixly_correct = 1; + if (!posixly_correct) + cmd_line_options = CMD_LINE_OPTIONS; + else + cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; +#endif + + setlocale(LC_CTYPE, ""); + setlocale(LC_MESSAGES, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + /* Align `#effective:' comments to column 40 for tty's */ + if (!posixly_correct && isatty(fileno(stdout))) + print_options |= TEXT_SMART_INDENT; + + while ((opt = getopt_long(argc, argv, cmd_line_options, + long_options, NULL)) != -1) { + switch (opt) { + case 'a': /* acl only */ + if (posixly_correct) + goto synopsis; + opt_print_acl = 1; + break; + + case 'd': /* default acl only */ + opt_print_default_acl = 1; + break; + + case 'c': /* no comments */ + if (posixly_correct) + goto synopsis; + opt_comments = 0; + break; + + case 'e': /* all #effective comments */ + if (posixly_correct) + goto synopsis; + print_options |= TEXT_ALL_EFFECTIVE; + break; + + case 'E': /* no #effective comments */ + if (posixly_correct) + goto synopsis; + print_options &= ~(TEXT_SOME_EFFECTIVE | + TEXT_ALL_EFFECTIVE); + break; + + case 'R': /* recursive */ + if (posixly_correct) + goto synopsis; + walk_flags |= WALK_TREE_RECURSIVE; + break; + + case 'L': /* follow all symlinks */ + if (posixly_correct) + goto synopsis; + walk_flags |= WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE; + walk_flags &= ~WALK_TREE_PHYSICAL; + break; + + case 'P': /* skip all symlinks */ + if (posixly_correct) + goto synopsis; + walk_flags |= WALK_TREE_PHYSICAL; + walk_flags &= ~(WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE | + WALK_TREE_DEREFERENCE_TOPLEVEL); + break; + + case 's': /* skip files with only base entries */ + if (posixly_correct) + goto synopsis; + opt_skip_base = 1; + break; + + case 'p': + if (posixly_correct) + goto synopsis; + opt_strip_leading_slash = 0; + break; + + case 't': + if (posixly_correct) + goto synopsis; + opt_tabular = 1; + break; + + case 'n': /* numeric */ + opt_numeric = 1; + print_options |= TEXT_NUMERIC_IDS; + break; + + case 'v': /* print version */ + printf("%s " VERSION "\n", progname); + return 0; + + case 'h': /* help */ + help(); + return 0; + + case ':': /* option missing */ + case '?': /* unknown option */ + default: + goto synopsis; + } + } + + if (!(opt_print_acl || opt_print_default_acl)) { + opt_print_acl = 1; + if (!posixly_correct) + opt_print_default_acl = 1; + } + + if ((optind == argc) && !posixly_correct) + goto synopsis; + + do { + if (optind == argc || + strcmp(argv[optind], "-") == 0) { + while ((line = next_line(stdin)) != NULL) { + if (*line == '\0') + continue; + + had_errors += walk_tree(line, walk_flags, 0, + do_print, NULL); + } + if (!feof(stdin)) { + fprintf(stderr, _("%s: Standard input: %s\n"), + progname, strerror(errno)); + had_errors++; + } + } else + had_errors += walk_tree(argv[optind], walk_flags, 0, + do_print, NULL); + optind++; + } while (optind < argc); + + return had_errors ? 1 : 0; + +synopsis: + fprintf(stderr, _("Usage: %s [-%s] file ...\n"), + progname, cmd_line_options); + fprintf(stderr, _("Try `%s --help' for more information.\n"), + progname); + return 2; +} + diff --git a/tools/parse.c b/tools/parse.c new file mode 100644 index 0000000..e7e6add --- /dev/null +++ b/tools/parse.c @@ -0,0 +1,594 @@ +/* + File: parse.c + (Linux Access Control List Management) + + Copyright (C) 1999, 2000 + Andreas Gruenbacher, + + This program 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 program 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. +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "sys/acl.h" + +#include "sequence.h" +#include "parse.h" +#include "misc.h" + +#define SKIP_WS(x) ({ \ + while (*(x)==' ' || *(x)=='\t' || *(x)=='\n' || *(x)=='\r') \ + (x)++; \ + }) + + +static int +skip_tag_name( + const char **text_p, + const char *token) +{ + size_t len = strlen(token); + const char *text = *text_p; + + SKIP_WS(text); + if (strncmp(text, token, len) == 0) { + text += len; + goto delimiter; + } + if (*text == *token) { + text++; + goto delimiter; + } + return 0; + +delimiter: + SKIP_WS(text); + if (*text == ':') { + *text_p = text+1; + return 1; + } + if (*text == ',' || *text == '\0') { + *text_p = text; + return 1; + } + return 0; +} + + +static char * +get_token( + const char **text_p) +{ + char *token = NULL, *t; + const char *bp, *ep; + + bp = *text_p; + SKIP_WS(bp); + ep = bp; + + while (*ep!='\0' && *ep!='\r' && *ep!='\n' && *ep!=':' && *ep!=',') + ep++; + if (ep == bp) + goto after_token; + token = (char*)malloc(ep - bp + 1); + if (token == NULL) + goto after_token; + memcpy(token, bp, ep - bp); + + /* Trim trailing whitespace */ + t = token + (ep - bp - 1); + while (t >= token && + (*t==' ' || *t=='\t' || *t=='\n' || *t=='\r')) + t--; + *(t+1) = '\0'; + +after_token: + if (*ep == ':') + ep++; + *text_p = ep; + return token; +} + + +static int +get_id( + const char *token, + id_t *id_p) +{ + char *ep; + long l; + l = strtol(token, &ep, 0); + if (*ep != '\0') + return -1; + if (l < 0) { + /* + Negative values are interpreted as 16-bit numbers, + so that id -2 maps to 65534 (nobody/nogroup), etc. + */ + l &= 0xFFFF; + } + *id_p = l; + return 0; +} + + +static int +get_uid( + const char *token, + uid_t *uid_p) +{ + struct passwd *passwd; + + if (get_id(token, (id_t *)uid_p) == 0) + goto accept; + passwd = getpwnam(token); + if (passwd) { + *uid_p = passwd->pw_uid; + goto accept; + } + return -1; + +accept: + return 0; +} + + +static int +get_gid( + const char *token, + gid_t *gid_p) +{ + struct group *group; + + if (get_id(token, (id_t *)gid_p) == 0) + goto accept; + group = getgrnam(token); + if (group) { + *gid_p = group->gr_gid; + goto accept; + } + return -1; + +accept: + return 0; +} + + +/* + Parses the next acl entry in text_p. + + Returns: + -1 on error, 0 on success. +*/ + +cmd_t +parse_acl_cmd( + const char **text_p, + int seq_cmd, + int parse_mode) +{ + cmd_t cmd = cmd_init(); + char *str; + const char *backup; + int error, perm_chars; + if (!cmd) + return NULL; + + cmd->c_cmd = seq_cmd; + if (parse_mode & SEQ_PROMOTE_ACL) + cmd->c_type = ACL_TYPE_DEFAULT; + else + cmd->c_type = ACL_TYPE_ACCESS; + cmd->c_id = ACL_UNDEFINED_ID; + cmd->c_perm = 0; + + if (parse_mode & SEQ_PARSE_DEFAULT) { + /* check for default acl entry */ + backup = *text_p; + if (skip_tag_name(text_p, "default")) { + if (parse_mode & SEQ_PROMOTE_ACL) { + /* if promoting from acl to default acl and + a default acl entry is found, fail. */ + *text_p = backup; + goto fail; + } + cmd->c_type = ACL_TYPE_DEFAULT; + } + } + + /* parse acl entry type */ + switch (**text_p) { + case 'u': /* user */ + skip_tag_name(text_p, "user"); + +user_entry: + backup = *text_p; + str = get_token(text_p); + if (str) { + cmd->c_tag = ACL_USER; + error = get_uid(unquote(str), &cmd->c_id); + free(str); + if (error) { + *text_p = backup; + goto fail; + } + } else { + cmd->c_tag = ACL_USER_OBJ; + } + break; + + case 'g': /* group */ + if (!skip_tag_name(text_p, "group")) + goto user_entry; + + backup = *text_p; + str = get_token(text_p); + if (str) { + cmd->c_tag = ACL_GROUP; + error = get_gid(unquote(str), &cmd->c_id); + free(str); + if (error) { + *text_p = backup; + goto fail; + } + } else { + cmd->c_tag = ACL_GROUP_OBJ; + } + break; + + case 'o': /* other */ + if (!skip_tag_name(text_p, "other")) + goto user_entry; + /* skip empty entry qualifier field (this field may + be missing for compatibility with Solaris.) */ + SKIP_WS(*text_p); + if (**text_p == ':') + (*text_p)++; + cmd->c_tag = ACL_OTHER; + break; + + case 'm': /* mask */ + if (!skip_tag_name(text_p, "mask")) + goto user_entry; + /* skip empty entry qualifier field (this field may + be missing for compatibility with Solaris.) */ + SKIP_WS(*text_p); + if (**text_p == ':') + (*text_p)++; + cmd->c_tag = ACL_MASK; + break; + + default: /* assume "user:" */ + goto user_entry; + } + + SKIP_WS(*text_p); + if (**text_p == ',' || **text_p == '\0') { + if (parse_mode & SEQ_PARSE_NO_PERM) + return cmd; + else + goto fail; + } + if (!(parse_mode & SEQ_PARSE_WITH_PERM)) + return cmd; + + /* parse permissions */ + SKIP_WS(*text_p); + if (**text_p >= '0' && **text_p <= '7') { + cmd->c_perm = 0; + while (**text_p == '0') + (*text_p)++; + if (**text_p >= '1' && **text_p <= '7') { + cmd->c_perm = (*(*text_p)++ - '0'); + } + + return cmd; + } + + for (perm_chars=0; perm_chars<3; perm_chars++, (*text_p)++) { + switch(**text_p) { + case 'r': /* read */ + if (cmd->c_perm & CMD_PERM_READ) + goto fail; + cmd->c_perm |= CMD_PERM_READ; + break; + + case 'w': /* write */ + if (cmd->c_perm & CMD_PERM_WRITE) + goto fail; + cmd->c_perm |= CMD_PERM_WRITE; + break; + + case 'x': /* execute */ + if (cmd->c_perm & CMD_PERM_EXECUTE) + goto fail; + cmd->c_perm |= CMD_PERM_EXECUTE; + break; + + case 'X': /* execute only if directory or some + entries already have execute permissions + set */ + if (cmd->c_perm & CMD_PERM_COND_EXECUTE) + goto fail; + cmd->c_perm |= CMD_PERM_COND_EXECUTE; + break; + + case '-': + /* ignore */ + break; + + default: + if (perm_chars == 0) + goto fail; + return cmd; + } + } + if (perm_chars != 3) + goto fail; + return cmd; + +fail: + cmd_free(cmd); + return NULL; +} + + +/* + Parse a comma-separated list of acl entries. + + which is set to the index of the first character that was not parsed, + or -1 in case of success. +*/ +int +parse_acl_seq( + seq_t seq, + const char *text_p, + int *which, + int seq_cmd, + int parse_mode) +{ + const char *initial_text_p = text_p; + cmd_t cmd; + + if (which) + *which = -1; + + while (*text_p != '\0') { + cmd = parse_acl_cmd(&text_p, seq_cmd, parse_mode); + if (cmd == NULL) { + errno = EINVAL; + goto fail; + } + if (seq_append(seq, cmd) != 0) { + cmd_free(cmd); + goto fail; + } + SKIP_WS(text_p); + if (*text_p != ',') + break; + text_p++; + } + + if (*text_p != '\0') { + errno = EINVAL; + goto fail; + } + + return 0; + +fail: + if (which) + *which = (text_p - initial_text_p); + return -1; +} + + + +int +read_acl_comments( + FILE *file, + int *line, + char **path_p, + uid_t *uid_p, + gid_t *gid_p, + mode_t *flags) +{ + int c; + /* + Max PATH_MAX bytes even for UTF-8 path names and additional 9 + bytes for "# file: ". Not a good solution but for now it is the + best I can do without too much impact on the code. [tw] + */ + char linebuf[(4*PATH_MAX)+9]; + char *cp; + char *p; + int comments_read = 0; + + if (path_p) + *path_p = NULL; + if (uid_p) + *uid_p = ACL_UNDEFINED_ID; + if (gid_p) + *gid_p = ACL_UNDEFINED_ID; + if (flags) + *flags = 0; + + for(;;) { + c = fgetc(file); + if (c == EOF) + break; + if (c==' ' || c=='\t' || c=='\r' || c=='\n') { + if (c=='\n') + (*line)++; + continue; + } + if (c != '#') { + ungetc(c, file); + break; + } + if (line) + (*line)++; + + if (fgets(linebuf, sizeof(linebuf), file) == NULL) + break; + + comments_read = 1; + + p = strrchr(linebuf, '\0'); + while (p > linebuf && + (*(p-1)=='\r' || *(p-1)=='\n')) { + p--; + *p = '\0'; + } + + cp = linebuf; + SKIP_WS(cp); + if (strncmp(cp, "file:", 5) == 0) { + cp += 5; + SKIP_WS(cp); + cp = unquote(cp); + + if (path_p) { + if (*path_p) + goto fail; + *path_p = (char*)malloc(strlen(cp)+1); + if (!*path_p) + return -1; + strcpy(*path_p, cp); + } + } else if (strncmp(cp, "owner:", 6) == 0) { + cp += 6; + SKIP_WS(cp); + + if (uid_p) { + if (*uid_p != ACL_UNDEFINED_ID) + goto fail; + if (get_uid(unquote(cp), uid_p) != 0) + continue; + } + } else if (strncmp(cp, "group:", 6) == 0) { + cp += 6; + SKIP_WS(cp); + + if (gid_p) { + if (*gid_p != ACL_UNDEFINED_ID) + goto fail; + if (get_gid(unquote(cp), gid_p) != 0) + continue; + } + } else if (strncmp(cp, "flags:", 6) == 0) { + mode_t f = 0; + + cp += 6; + SKIP_WS(cp); + + if (cp[0] == 's') + f |= S_ISUID; + else if (cp[0] != '-') + goto fail; + if (cp[1] == 's') + f |= S_ISGID; + else if (cp[1] != '-') + goto fail; + if (cp[2] == 't') + f |= S_ISVTX; + else if (cp[2] != '-') + goto fail; + if (cp[3] != '\0') + goto fail; + + if (flags) + *flags = f; + } + } + if (ferror(file)) + return -1; + return comments_read; +fail: + if (path_p && *path_p) { + free(*path_p); + *path_p = NULL; + } + return -EINVAL; +} + + +int +read_acl_seq( + FILE *file, + seq_t seq, + int seq_cmd, + int parse_mode, + int *line, + int *which) +{ + char linebuf[1024]; + const char *cp; + cmd_t cmd; + + if (which) + *which = -1; + + for(;;) { + if (fgets(linebuf, sizeof(linebuf), file) == NULL) + break; + if (line) + (*line)++; + + cp = linebuf; + SKIP_WS(cp); + if (*cp == '\0') { + if (!(parse_mode & SEQ_PARSE_MULTI)) + continue; + break; + } else if (*cp == '#') { + continue; + } + + cmd = parse_acl_cmd(&cp, seq_cmd, parse_mode); + if (cmd == NULL) { + errno = EINVAL; + goto fail; + } + if (seq_append(seq, cmd) != 0) { + cmd_free(cmd); + goto fail; + } + + SKIP_WS(cp); + if (*cp != '\0' && *cp != '#') { + errno = EINVAL; + goto fail; + } + } + + if (ferror(file)) + goto fail; + return 0; + +fail: + if (which) + *which = (cp - linebuf); + return -1; +} + diff --git a/tools/parse.h b/tools/parse.h new file mode 100644 index 0000000..b2e68b4 --- /dev/null +++ b/tools/parse.h @@ -0,0 +1,85 @@ +/* + File: parse.h + (Linux Access Control List Management) + + Copyright (C) 1999 by Andreas Gruenbacher + + + This program 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 program 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. +*/ + +#ifndef __PARSE_H +#define __PARSE_H + + +#include +#include +#include "sequence.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* parse options */ + +#define SEQ_PARSE_WITH_PERM (0x0001) +#define SEQ_PARSE_NO_PERM (0x0002) +#define SEQ_PARSE_ANY_PERM (0x0001|0x0002) + +#define SEQ_PARSE_MULTI (0x0010) +#define SEQ_PARSE_DEFAULT (0x0020) /* "default:" = default acl */ + +#define SEQ_PROMOTE_ACL (0x0040) /* promote from acl + to default acl */ + +cmd_t +parse_acl_cmd( + const char **text_p, + int seq_cmd, + int parse_mode); +int +parse_acl_seq( + seq_t seq, + const char *text_p, + int *which, + int seq_cmd, + int parse_mode); +int +read_acl_comments( + FILE *file, + int *line, + char **path_p, + uid_t *uid_p, + gid_t *gid_p, + mode_t *flags); +int +read_acl_seq( + FILE *file, + seq_t seq, + int seq_cmd, + int parse_mode, + int *line, + int *which); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __PARSE_H */ + diff --git a/tools/sequence.c b/tools/sequence.c new file mode 100644 index 0000000..a418b23 --- /dev/null +++ b/tools/sequence.c @@ -0,0 +1,162 @@ +/* + File: sequence.c + (Linux Access Control List Management) + + Copyright (C) 1999, 2000 + Andreas Gruenbacher, + + This program 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 program 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. +*/ + + +#include +#include "sequence.h" + + +cmd_t +cmd_init( + void) +{ + return (cmd_t)malloc(sizeof(struct cmd_obj)); +} + + +void +cmd_free( + cmd_t cmd) +{ + free(cmd); +} + + +seq_t +seq_init( + void) +{ + seq_t seq = (seq_t)malloc(sizeof(struct seq_obj)); + if (seq == NULL) + return NULL; + seq->s_first = seq->s_last = NULL; + return seq; +} + + +int +seq_free( + seq_t seq) +{ + cmd_t cmd = seq->s_first; + while (cmd) { + seq->s_first = seq->s_first->c_next; + cmd_free(cmd); + cmd = seq->s_first; + } + free(seq); + return 0; +} + + +int +seq_empty( + seq_t seq) +{ + return (seq->s_first == NULL); +} + + +int +seq_append( + seq_t seq, + cmd_t cmd) +{ + cmd->c_next = NULL; + if (seq->s_first == NULL) { + seq->s_first = seq->s_last = cmd; + } else { + seq->s_last->c_next = cmd; + seq->s_last = cmd; + } + return 0; +} + + +int +seq_append_cmd( + seq_t seq, + cmd_tag_t cmd, + acl_type_t type) +{ + cmd_t cmd_d = cmd_init(); + if (cmd_d == NULL) + return -1; + cmd_d->c_cmd = cmd; + cmd_d->c_type = type; + if (seq_append(seq, cmd_d) != 0) { + cmd_free(cmd_d); + return -1; + } + return 0; +} + + +int +seq_get_cmd( + seq_t seq, + int which, + cmd_t *cmd) +{ + if (which == SEQ_FIRST_CMD) { + if (seq->s_first == NULL) + return 0; + if (cmd) + *cmd = seq->s_first; + return 1; + } else if (which == SEQ_NEXT_CMD) { + if (cmd == NULL) + return -1; + if (*cmd) { + *cmd = (*cmd)->c_next; + return (*cmd == NULL) ? 0 : 1; + } + return 0; + } else { + return -1; + } +} + + +int +seq_delete_cmd( + seq_t seq, + cmd_t cmd) +{ + cmd_t prev = seq->s_first; + + if (cmd == seq->s_first) { + seq->s_first = seq->s_first->c_next; + cmd_free(cmd); + return 0; + } + while (prev != NULL && prev->c_next != cmd) + prev = prev->c_next; + if (prev == NULL) + return -1; + if (cmd == seq->s_last) + seq->s_last = prev; + prev->c_next = cmd->c_next; + cmd_free(cmd); + return 0; +} + diff --git a/tools/sequence.h b/tools/sequence.h new file mode 100644 index 0000000..c5d7403 --- /dev/null +++ b/tools/sequence.h @@ -0,0 +1,115 @@ +/* + File: sequence.h + (Linux Access Control List Management) + + Copyright (C) 1999 by Andreas Gruenbacher + + + This program 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 program 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. +*/ + + +#ifndef __SEQUENCE_H +#define __SEQUENCE_H + + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef unsigned int cmd_tag_t; + +struct cmd_obj { + cmd_tag_t c_cmd; + acl_type_t c_type; + acl_tag_t c_tag; + uid_t c_id; + mode_t c_perm; + struct cmd_obj *c_next; +}; + +typedef struct cmd_obj *cmd_t; + +struct seq_obj { + cmd_t s_first; + cmd_t s_last; +}; + +typedef struct seq_obj *seq_t; + +/* command types */ +#define CMD_ENTRY_REPLACE (0) +#define CMD_REMOVE_ENTRY (3) +#define CMD_REMOVE_EXTENDED_ACL (4) +#define CMD_REMOVE_ACL (5) + +/* constants for permission specifiers */ +#define CMD_PERM_READ (4) +#define CMD_PERM_WRITE (2) +#define CMD_PERM_EXECUTE (1) +#define CMD_PERM_COND_EXECUTE (8) + +/* iteration over command sequence */ +#define SEQ_FIRST_CMD (0) +#define SEQ_NEXT_CMD (1) + +/* command sequence manipulation */ + +cmd_t +cmd_init( + void); +void +cmd_free( + cmd_t cmd); +seq_t +seq_init( + void); +int +seq_free( + seq_t seq); +int +seq_empty( + seq_t seq); +int +seq_append( + seq_t seq, + cmd_t cmd); +int +seq_append_cmd( + seq_t seq, + cmd_tag_t cmd, + acl_type_t type); +int +seq_get_cmd( + seq_t seq, + int which, + cmd_t *cmd); +int +seq_delete_cmd( + seq_t seq, + cmd_t cmd); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __SEQUENCE_H */ + diff --git a/tools/setfacl.c b/tools/setfacl.c new file mode 100644 index 0000000..f6135b7 --- /dev/null +++ b/tools/setfacl.c @@ -0,0 +1,669 @@ +/* + File: setfacl.c + (Linux Access Control List Management) + + Copyright (C) 1999-2002 + Andreas Gruenbacher, + + This program 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 program 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. +*/ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "misc.h" +#include "sequence.h" +#include "parse.h" +#include "do_set.h" +#include "walk_tree.h" + +#define POSIXLY_CORRECT_STR "POSIXLY_CORRECT" + +/* '-' stands for `process non-option arguments in loop' */ +#if !POSIXLY_CORRECT +# define CMD_LINE_OPTIONS "-:bkndvhm:M:x:X:RLP" +# define CMD_LINE_SPEC "[-bkndRLP] { -m|-M|-x|-X ... } file ..." +#endif +#define POSIXLY_CMD_LINE_OPTIONS "-:bkndvhm:M:x:X:" +#define POSIXLY_CMD_LINE_SPEC "[-bknd] {-m|-M|-x|-X ... } file ..." + +struct option long_options[] = { +#if !POSIXLY_CORRECT + { "set", 1, 0, 's' }, + { "set-file", 1, 0, 'S' }, + + { "mask", 0, 0, 'r' }, + { "recursive", 0, 0, 'R' }, + { "logical", 0, 0, 'L' }, + { "physical", 0, 0, 'P' }, + { "restore", 1, 0, 'B' }, + { "test", 0, 0, 't' }, +#endif + { "modify", 1, 0, 'm' }, + { "modify-file", 1, 0, 'M' }, + { "remove", 1, 0, 'x' }, + { "remove-file", 1, 0, 'X' }, + + { "default", 0, 0, 'd' }, + { "no-mask", 0, 0, 'n' }, + { "remove-all", 0, 0, 'b' }, + { "remove-default", 0, 0, 'k' }, + { "version", 0, 0, 'v' }, + { "help", 0, 0, 'h' }, + { NULL, 0, 0, 0 }, +}; + +const char *progname; +const char *cmd_line_options, *cmd_line_spec; + +int walk_flags = WALK_TREE_DEREFERENCE_TOPLEVEL; +int opt_recalculate; /* recalculate mask entry (0=default, 1=yes, -1=no) */ +int opt_promote; /* promote access ACL to default ACL */ +int opt_test; /* do not write to the file system. + Print what would happen instead. */ +#if POSIXLY_CORRECT +const int posixly_correct = 1; /* Posix compatible behavior! */ +#else +int posixly_correct; /* Posix compatible behavior? */ +#endif +int chown_error; +int promote_warning; + + +static const char *xquote(const char *str, const char *quote_chars) +{ + const char *q = quote(str, quote_chars); + if (q == NULL) { + fprintf(stderr, "%s: %s\n", progname, strerror(errno)); + exit(1); + } + return q; +} + +int +has_any_of_type( + cmd_t cmd, + acl_type_t acl_type) +{ + while (cmd) { + if (cmd->c_type == acl_type) + return 1; + cmd = cmd->c_next; + } + return 0; +} + + +#if !POSIXLY_CORRECT +int +restore( + FILE *file, + const char *filename) +{ + char *path_p; + struct stat st; + uid_t uid; + gid_t gid; + mode_t mask, flags; + struct do_set_args args = { }; + int line = 0, backup_line; + int error, status = 0; + int chmod_required = 0; + + memset(&st, 0, sizeof(st)); + + for(;;) { + backup_line = line; + error = read_acl_comments(file, &line, &path_p, &uid, &gid, + &flags); + if (error < 0) { + error = -error; + goto fail; + } + if (error == 0) + return status; + + if (path_p == NULL) { + if (filename) { + fprintf(stderr, _("%s: %s: No filename found " + "in line %d, aborting\n"), + progname, xquote(filename, "\n\r"), + backup_line); + } else { + fprintf(stderr, _("%s: No filename found in " + "line %d of standard input, " + "aborting\n"), + progname, backup_line); + } + status = 1; + goto getout; + } + + if (!(args.seq = seq_init())) + goto fail_errno; + if (seq_append_cmd(args.seq, CMD_REMOVE_ACL, ACL_TYPE_ACCESS) || + seq_append_cmd(args.seq, CMD_REMOVE_ACL, ACL_TYPE_DEFAULT)) + goto fail_errno; + + error = read_acl_seq(file, args.seq, CMD_ENTRY_REPLACE, + SEQ_PARSE_WITH_PERM | + SEQ_PARSE_DEFAULT | + SEQ_PARSE_MULTI, + &line, NULL); + if (error != 0) { + fprintf(stderr, _("%s: %s: %s in line %d\n"), + progname, xquote(filename, "\n\r"), strerror(errno), + line); + status = 1; + goto getout; + } + + error = stat(path_p, &st); + if (opt_test && error != 0) { + fprintf(stderr, "%s: %s: %s\n", progname, + xquote(path_p, "\n\r"), strerror(errno)); + status = 1; + } + + args.mode = 0; + error = do_set(path_p, &st, 0, &args); + if (error != 0) { + status = 1; + goto resume; + } + + if (uid != ACL_UNDEFINED_ID && uid != st.st_uid) + st.st_uid = uid; + else + st.st_uid = -1; + if (gid != ACL_UNDEFINED_ID && gid != st.st_gid) + st.st_gid = gid; + else + st.st_gid = -1; + if (!opt_test && + (st.st_uid != -1 || st.st_gid != -1)) { + if (chown(path_p, st.st_uid, st.st_gid) != 0) { + fprintf(stderr, _("%s: %s: Cannot change " + "owner/group: %s\n"), + progname, xquote(path_p, "\n\r"), + strerror(errno)); + status = 1; + } + + /* chown() clears setuid/setgid so force a chmod if + * S_ISUID/S_ISGID was expected */ + if ((st.st_mode & flags) & (S_ISUID | S_ISGID)) + chmod_required = 1; + } + + mask = S_ISUID | S_ISGID | S_ISVTX; + if (chmod_required || ((st.st_mode & mask) != (flags & mask))) { + if (!args.mode) + args.mode = st.st_mode; + args.mode &= (S_IRWXU | S_IRWXG | S_IRWXO); + if (chmod(path_p, flags | args.mode) != 0) { + fprintf(stderr, _("%s: %s: Cannot change " + "mode: %s\n"), + progname, xquote(path_p, "\n\r"), + strerror(errno)); + status = 1; + } + } +resume: + if (path_p) { + free(path_p); + path_p = NULL; + } + if (args.seq) { + seq_free(args.seq); + args.seq = NULL; + } + } + +getout: + if (path_p) { + free(path_p); + path_p = NULL; + } + if (args.seq) { + seq_free(args.seq); + args.seq = NULL; + } + return status; + +fail_errno: + error = errno; +fail: + fprintf(stderr, "%s: %s: %s\n", progname, xquote(filename, "\n\r"), + strerror(error)); + status = 1; + goto getout; +} +#endif + + +void help(void) +{ + printf(_("%s %s -- set file access control lists\n"), + progname, VERSION); + printf(_("Usage: %s %s\n"), + progname, cmd_line_spec); + printf(_( +" -m, --modify=acl modify the current ACL(s) of file(s)\n" +" -M, --modify-file=file read ACL entries to modify from file\n" +" -x, --remove=acl remove entries from the ACL(s) of file(s)\n" +" -X, --remove-file=file read ACL entries to remove from file\n" +" -b, --remove-all remove all extended ACL entries\n" +" -k, --remove-default remove the default ACL\n")); +#if !POSIXLY_CORRECT + if (!posixly_correct) { + printf(_( +" --set=acl set the ACL of file(s), replacing the current ACL\n" +" --set-file=file read ACL entries to set from file\n" +" --mask do recalculate the effective rights mask\n")); + } +#endif + printf(_( +" -n, --no-mask don't recalculate the effective rights mask\n" +" -d, --default operations apply to the default ACL\n")); +#if !POSIXLY_CORRECT + if (!posixly_correct) { + printf(_( +" -R, --recursive recurse into subdirectories\n" +" -L, --logical logical walk, follow symbolic links\n" +" -P, --physical physical walk, do not follow symbolic links\n" +" --restore=file restore ACLs (inverse of `getfacl -R')\n" +" --test test mode (ACLs are not modified)\n")); + } +#endif + printf(_( +" -v, --version print version and exit\n" +" -h, --help this help text\n")); +} + + +int next_file(const char *arg, seq_t seq) +{ + char *line; + int errors = 0; + struct do_set_args args; + + args.seq = seq; + + if (strcmp(arg, "-") == 0) { + while ((line = next_line(stdin))) + errors = walk_tree(line, walk_flags, 0, do_set, &args); + if (!feof(stdin)) { + fprintf(stderr, _("%s: Standard input: %s\n"), + progname, strerror(errno)); + errors = 1; + } + } else { + errors = walk_tree(arg, walk_flags, 0, do_set, &args); + } + return errors ? 1 : 0; +} + + +#define ERRNO_ERROR(s) \ + ({status = (s); goto errno_error; }) + + +int main(int argc, char *argv[]) +{ + int opt; + int saw_files = 0; + int status = 0; + FILE *file; + int which; + int lineno; + int error; + seq_t seq; + int seq_cmd, parse_mode; + + progname = basename(argv[0]); + +#if POSIXLY_CORRECT + cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; + cmd_line_spec = _(POSIXLY_CMD_LINE_SPEC); +#else + if (getenv(POSIXLY_CORRECT_STR)) + posixly_correct = 1; + if (!posixly_correct) { + cmd_line_options = CMD_LINE_OPTIONS; + cmd_line_spec = _(CMD_LINE_SPEC); + } else { + cmd_line_options = POSIXLY_CMD_LINE_OPTIONS; + cmd_line_spec = _(POSIXLY_CMD_LINE_SPEC); + } +#endif + + setlocale(LC_CTYPE, ""); + setlocale(LC_MESSAGES, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + seq = seq_init(); + if (!seq) + ERRNO_ERROR(1); + + while ((opt = getopt_long(argc, argv, cmd_line_options, + long_options, NULL)) != -1) { + /* we remember the two REMOVE_ACL commands of the set + operations because we may later need to delete them. */ + cmd_t seq_remove_default_acl_cmd = NULL; + cmd_t seq_remove_acl_cmd = NULL; + + if (opt != '\1' && saw_files) { + seq_free(seq); + seq = seq_init(); + if (!seq) + ERRNO_ERROR(1); + saw_files = 0; + } + + switch (opt) { + case 'b': /* remove all extended entries */ + if (seq_append_cmd(seq, CMD_REMOVE_EXTENDED_ACL, + ACL_TYPE_ACCESS) || + seq_append_cmd(seq, CMD_REMOVE_ACL, + ACL_TYPE_DEFAULT)) + ERRNO_ERROR(1); + break; + + case 'k': /* remove default ACL */ + if (seq_append_cmd(seq, CMD_REMOVE_ACL, + ACL_TYPE_DEFAULT)) + ERRNO_ERROR(1); + break; + + case 'n': /* do not recalculate mask */ + opt_recalculate = -1; + break; + + case 'r': /* force recalculate mask */ + opt_recalculate = 1; + break; + + case 'd': /* operations apply to default ACL */ + opt_promote = 1; + break; + + case 's': /* set */ + if (seq_append_cmd(seq, CMD_REMOVE_ACL, + ACL_TYPE_ACCESS)) + ERRNO_ERROR(1); + seq_remove_acl_cmd = seq->s_last; + if (seq_append_cmd(seq, CMD_REMOVE_ACL, + ACL_TYPE_DEFAULT)) + ERRNO_ERROR(1); + seq_remove_default_acl_cmd = seq->s_last; + + seq_cmd = CMD_ENTRY_REPLACE; + parse_mode = SEQ_PARSE_WITH_PERM; + goto set_modify_delete; + + case 'm': /* modify */ + seq_cmd = CMD_ENTRY_REPLACE; + parse_mode = SEQ_PARSE_WITH_PERM; + goto set_modify_delete; + + case 'x': /* delete */ + seq_cmd = CMD_REMOVE_ENTRY; +#if POSIXLY_CORRECT + parse_mode = SEQ_PARSE_ANY_PERM; +#else + if (posixly_correct) + parse_mode = SEQ_PARSE_ANY_PERM; + else + parse_mode = SEQ_PARSE_NO_PERM; +#endif + goto set_modify_delete; + + set_modify_delete: + if (!posixly_correct) + parse_mode |= SEQ_PARSE_DEFAULT; + if (opt_promote) + parse_mode |= SEQ_PROMOTE_ACL; + if (parse_acl_seq(seq, optarg, &which, + seq_cmd, parse_mode) != 0) { + if (which < 0 || + (size_t) which >= strlen(optarg)) { + fprintf(stderr, _( + "%s: Option " + "-%c incomplete\n"), + progname, opt); + } else { + fprintf(stderr, _( + "%s: Option " + "-%c: %s near " + "character %d\n"), + progname, opt, + strerror(errno), + which+1); + } + status = 2; + goto cleanup; + } + break; + + case 'S': /* set from file */ + if (seq_append_cmd(seq, CMD_REMOVE_ACL, + ACL_TYPE_ACCESS)) + ERRNO_ERROR(1); + seq_remove_acl_cmd = seq->s_last; + if (seq_append_cmd(seq, CMD_REMOVE_ACL, + ACL_TYPE_DEFAULT)) + ERRNO_ERROR(1); + seq_remove_default_acl_cmd = seq->s_last; + + seq_cmd = CMD_ENTRY_REPLACE; + parse_mode = SEQ_PARSE_WITH_PERM; + goto set_modify_delete_from_file; + + case 'M': /* modify from file */ + seq_cmd = CMD_ENTRY_REPLACE; + parse_mode = SEQ_PARSE_WITH_PERM; + goto set_modify_delete_from_file; + + case 'X': /* delete from file */ + seq_cmd = CMD_REMOVE_ENTRY; +#if POSIXLY_CORRECT + parse_mode = SEQ_PARSE_ANY_PERM; +#else + if (posixly_correct) + parse_mode = SEQ_PARSE_ANY_PERM; + else + parse_mode = SEQ_PARSE_NO_PERM; +#endif + goto set_modify_delete_from_file; + + set_modify_delete_from_file: + if (!posixly_correct) + parse_mode |= SEQ_PARSE_DEFAULT; + if (opt_promote) + parse_mode |= SEQ_PROMOTE_ACL; + if (strcmp(optarg, "-") == 0) { + file = stdin; + } else { + file = fopen(optarg, "r"); + if (file == NULL) { + fprintf(stderr, "%s: %s: %s\n", + progname, + xquote(optarg, "\n\r"), + strerror(errno)); + status = 2; + goto cleanup; + } + } + + lineno = 0; + error = read_acl_seq(file, seq, seq_cmd, + parse_mode, &lineno, NULL); + + if (file != stdin) { + fclose(file); + } + + if (error) { + if (!errno) + errno = EINVAL; + + if (file != stdin) { + fprintf(stderr, _( + "%s: %s in line " + "%d of file %s\n"), + progname, + strerror(errno), + lineno, + xquote(optarg, "\n\r")); + } else { + fprintf(stderr, _( + "%s: %s in line " + "%d of standard " + "input\n"), progname, + strerror(errno), + lineno); + } + status = 2; + goto cleanup; + } + break; + + + case '\1': /* file argument */ + if (seq_empty(seq)) + goto synopsis; + saw_files = 1; + + status = next_file(optarg, seq); + break; + + case 'B': /* restore ACL backup */ + saw_files = 1; + + if (strcmp(optarg, "-") == 0) + file = stdin; + else { + file = fopen(optarg, "r"); + if (file == NULL) { + fprintf(stderr, "%s: %s: %s\n", + progname, + xquote(optarg, "\n\r"), + strerror(errno)); + status = 2; + goto cleanup; + } + } + + status = restore(file, + (file == stdin) ? NULL : optarg); + + if (file != stdin) + fclose(file); + if (status != 0) + goto cleanup; + break; + + case 'R': /* recursive */ + walk_flags |= WALK_TREE_RECURSIVE; + break; + + case 'L': /* follow symlinks */ + walk_flags |= WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE; + walk_flags &= ~WALK_TREE_PHYSICAL; + break; + + case 'P': /* do not follow symlinks */ + walk_flags |= WALK_TREE_PHYSICAL; + walk_flags &= ~(WALK_TREE_LOGICAL | WALK_TREE_DEREFERENCE | + WALK_TREE_DEREFERENCE_TOPLEVEL); + break; + + case 't': /* test mode */ + opt_test = 1; + break; + + case 'v': /* print version and exit */ + printf("%s " VERSION "\n", progname); + status = 0; + goto cleanup; + + case 'h': /* help! */ + help(); + status = 0; + goto cleanup; + + case ':': /* option missing */ + case '?': /* unknown option */ + default: + goto synopsis; + } + if (seq_remove_acl_cmd) { + /* This was a set operation. Check if there are + actually entries of ACL_TYPE_ACCESS; if there + are none, we need to remove this command! */ + if (!has_any_of_type(seq_remove_acl_cmd->c_next, + ACL_TYPE_ACCESS)) + seq_delete_cmd(seq, seq_remove_acl_cmd); + } + if (seq_remove_default_acl_cmd) { + /* This was a set operation. Check if there are + actually entries of ACL_TYPE_DEFAULT; if there + are none, we need to remove this command! */ + if (!has_any_of_type(seq_remove_default_acl_cmd->c_next, + ACL_TYPE_DEFAULT)) + seq_delete_cmd(seq, seq_remove_default_acl_cmd); + } + } + while (optind < argc) { + if(!seq) + goto synopsis; + if (seq_empty(seq)) + goto synopsis; + saw_files = 1; + + status = next_file(argv[optind++], seq); + } + if (!saw_files) + goto synopsis; + + goto cleanup; + +synopsis: + fprintf(stderr, _("Usage: %s %s\n"), + progname, cmd_line_spec); + fprintf(stderr, _("Try `%s --help' for more information.\n"), + progname); + status = 2; + goto cleanup; + +errno_error: + fprintf(stderr, "%s: %s\n", progname, strerror(errno)); + goto cleanup; + +cleanup: + if (seq) + seq_free(seq); + return status; +} + diff --git a/tools/user_group.c b/tools/user_group.c new file mode 100644 index 0000000..61fa0c3 --- /dev/null +++ b/tools/user_group.c @@ -0,0 +1,59 @@ +/* + File: user_group.c + (Linux Access Control List Management) + + Copyright (C) 1999, 2000 + Andreas Gruenbacher, + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU 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. +*/ + +#include +#include +#include "user_group.h" + + +const char * +user_name(uid_t uid, int numeric) +{ + struct passwd *passwd = numeric ? NULL : getpwuid(uid); + static char uid_str[22]; + int ret; + + if (passwd != NULL) + return passwd->pw_name; + ret = snprintf(uid_str, sizeof(uid_str), "%ld", (long)uid); + if (ret < 1 || (size_t)ret >= sizeof(uid_str)) + return "?"; + return uid_str; +} + + +const char * +group_name(gid_t gid, int numeric) +{ + struct group *group = numeric ? NULL : getgrgid(gid); + static char gid_str[22]; + int ret; + + if (group != NULL) + return group->gr_name; + ret = snprintf(gid_str, sizeof(gid_str), "%ld", (long)gid); + if (ret < 1 || (size_t)ret >= sizeof(gid_str)) + return "?"; + return gid_str; +} + diff --git a/tools/user_group.h b/tools/user_group.h new file mode 100644 index 0000000..aad5846 --- /dev/null +++ b/tools/user_group.h @@ -0,0 +1,31 @@ +/* + File: user_group.h + (Linux Access Control List Management) + + Copyright (C) 1999 by Andreas Gruenbacher + + + This program 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 program 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. +*/ + +#include +#include +#include + +const char * +user_name(uid_t uid, int numeric); +const char * +group_name(gid_t uid, int numeric); + -- 2.5.2