[apparmor] aa-enabled

John Johansen john.johansen at canonical.com
Wed Nov 25 00:14:27 UTC 2015


>> Nice trick - you are using libapparmor to hide most of the code ;-)
>> (that's not really bad because it avoids code duplication, but makes the 
>> comparison a bit unfair ;-)
>>
>> Oh, and the C code has a bug - like aa-status --enabled, aa-enabled 
>> should only set the exitcode, but not print anything.
>>
>> Anyway, I can live with both solutions as long as we get aa-enabled 
>> added ;-)
>>
> hrmmm, I think I'd rather leaving human readable output as the default
> and having a quiet flag for just the error code.
> 
> since we are replacing
>   aa-status --enabled
> I don't see how
>   aa-enabled --quiet
> is any worse, and then a user can also easily use the tool
> 
> 
and along those lines, here is a v2

---


#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libintl.h>
#define _(s) gettext(s)

#include <sys/apparmor.h>
void print_help(const char *command)
{
	printf(_("%s: [options]\n"
		 "  options:\n"
		 "  -q | --quiet		don't print out any messages\n"
		 "  -h | --help		print help\n"),
	       command);
	exit(1);
}

int main(int argc, char **argv)
{
	int quiet = 0;
	
	if (argc > 2) {
		printf(_("unknown options\n"));
		print_help(argv[0]);
		return 1;
	} else if (argc == 2) {
		if (strcmp(argv[1], "--quiet") == 0 ||
		    strcmp(argv[1], "-q") == 0) {
			quiet = 1;
		} else if (strcmp(argv[1], "--help") == 0 ||
			   strcmp(argv[1], "-h") == 0) {
			print_help(argv[0]);
		} else {
			printf(_("unknown option '%s'\n"), argv[1]);
			print_help(argv[0]);
		}
	}

	if (aa_is_enabled()) {
		if (!quiet)
			printf(_("Yes\n"));
		return 0;
	}

	if (!quiet) {
		switch(errno) {
		case ENOSYS:
			printf(_("No - not available on this system.\n"));
			break;
		case ECANCELED:
			printf(_("No - disabled at boot.\n"));
			break;
		case ENOENT:
			printf(_("Maybe - policy interface not available.\n"));
			break;
		case EPERM:
		case EACCES:
			printf(_("Maybe - insufficient permissions to determine availability.\n"));
			break;
		default:
			printf(_("No\n"));
		}
	}

	return errno;
}



More information about the AppArmor mailing list