diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2007-12-11 21:16:24 +0100 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2007-12-11 21:16:24 +0100 |
commit | 4245876e23866a198b92ed5c371658d8428d89ac (patch) | |
tree | ca6e8943577ba81af2b2bab031def90533a044f3 /src | |
parent | 291eb90a0a5515680a78a64fe8ddef4f417bd0f7 (diff) | |
download | coreutils-4245876e23866a198b92ed5c371658d8428d89ac.tar.xz |
"ls -l" wouldn't output "+" on SELinux hosts unless -Z was also given.
* src/ls.c (gobble_file): Also get the file context if -l is specified.
Treat getfilecon failures like file_has_acl failures.
(UNKNOWN_SECURITY_CONTEXT): New constant.
(clear_files): Don't free it.
(gobble_file): Set unknown security contexts to it; that way, we
don't have to have special cases for unknown contexts.
(print_long_format, print_file_name_and_frills): Don't worry
about scontext being null, since it's always some string now.
Diffstat (limited to 'src')
-rw-r--r-- | src/ls.c | 72 |
1 files changed, 38 insertions, 34 deletions
@@ -315,6 +315,7 @@ static time_t current_time = TYPE_MINIMUM (time_t); static int current_time_ns = -1; static bool print_scontext; +static char UNKNOWN_SECURITY_CONTEXT[] = "?"; /* Whether any of the files has an ACL. This affects the width of the mode column. */ @@ -2516,11 +2517,8 @@ clear_files (void) struct fileinfo *f = sorted_file[i]; free (f->name); free (f->linkname); - if (f->scontext) - { - freecon (f->scontext); - f->scontext = NULL; - } + if (f->scontext != UNKNOWN_SECURITY_CONTEXT) + freecon (f->scontext); } cwd_n_used = 0; @@ -2594,8 +2592,6 @@ gobble_file (char const *name, enum filetype type, ino_t inode, ))))) { - /* FIXME-c99: move this decl "down", once ls.c stabilizes. */ - bool file_has_security_context = false; /* Absolute name of this file. */ char *absolute_name; bool do_deref; @@ -2645,23 +2641,6 @@ gobble_file (char const *name, enum filetype type, ino_t inode, break; } - if (err == 0 && print_scontext) - { - int attr_len = (do_deref - ? getfilecon (absolute_name, &f->scontext) - : lgetfilecon (absolute_name, &f->scontext)); - err = (attr_len < 0); - file_has_security_context = - (err == 0 && ! STREQ ("unlabeled", f->scontext)); - - /* When requesting security context information, don't make - ls fail just because the file (even a command line argument) - isn't on the right type of file system. I.e., a getfilecon - failure isn't in the same class as a stat failure. */ - if (err && (errno == ENOTSUP || errno == ENODATA)) - err = 0; - } - if (err != 0) { /* Failure to stat a command line argument leads to @@ -2680,12 +2659,39 @@ gobble_file (char const *name, enum filetype type, ino_t inode, f->stat_ok = true; - if (format == long_format) + if (format == long_format || print_scontext) { - int n = file_has_acl (absolute_name, &f->stat); - f->have_acl = (0 < n || file_has_security_context); - any_has_acl |= f->have_acl; - if (n < 0) + bool have_acl = false; + int attr_len = (do_deref + ? getfilecon (absolute_name, &f->scontext) + : lgetfilecon (absolute_name, &f->scontext)); + err = (attr_len < 0); + + if (err == 0) + have_acl = ! STREQ ("unlabeled", f->scontext); + else + { + f->scontext = UNKNOWN_SECURITY_CONTEXT; + + /* When requesting security context information, don't make + ls fail just because the file (even a command line argument) + isn't on the right type of file system. I.e., a getfilecon + failure isn't in the same class as a stat failure. */ + if (errno == ENOTSUP || errno == ENODATA) + err = 0; + } + + if (err == 0 && ! have_acl && format == long_format) + { + int n = file_has_acl (absolute_name, &f->stat); + err = (n < 0); + have_acl = (0 < n); + } + + f->have_acl = have_acl; + any_has_acl |= have_acl; + + if (err) error (0, errno, "%s", quotearg_colon (absolute_name)); } @@ -2775,7 +2781,7 @@ gobble_file (char const *name, enum filetype type, ino_t inode, if (print_scontext) { - int len = f->scontext ? strlen (f->scontext) : 0; + int len = strlen (f->scontext); if (scontext_width < len) scontext_width = len; } @@ -3520,8 +3526,7 @@ print_long_format (const struct fileinfo *f) format_user (f->stat.st_author, author_width, f->stat_ok); if (print_scontext) - format_user_or_group ((f->scontext ? f->scontext : "?"), - 0, scontext_width); + format_user_or_group (f->scontext, 0, scontext_width); p = buf; } @@ -3860,8 +3865,7 @@ print_file_name_and_frills (const struct fileinfo *f) ST_NBLOCKSIZE, output_block_size)); if (print_scontext) - printf ("%*s ", format == with_commas ? 0 : scontext_width, - (f->scontext ? f->scontext : "?")); + printf ("%*s ", format == with_commas ? 0 : scontext_width, f->scontext); print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok, f->stat_ok, f->filetype, NULL); |