File: acl.c

package info (click to toggle)
libexplain 1.4.D001-17
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 42,248 kB
  • sloc: ansic: 156,043; makefile: 47,892; sh: 16,304; yacc: 1,898; awk: 245
file content (75 lines) | stat: -rw-r--r-- 2,036 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
 * libexplain - a library of system-call-specific strerror replacements
 * Copyright (C) 2013 Peter Miller
 *
 * 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 3 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 program. If not, see <http://www.gnu.org/licenses/>.
 */

#include <libexplain/ac/acl/libacl.h>
#include <libexplain/ac/errno.h>

#include <libexplain/buffer/acl.h>
#include <libexplain/buffer/pointer.h>
#include <libexplain/is_efault.h>


void
explain_buffer_acl(explain_string_buffer_t *sb, acl_t acl)
{
    const char      *text = 0;
    int             errno_hold;

    if (acl == (acl_t)NULL)
    {
        explain_string_buffer_puts(sb, "NULL");
        return;
    }

    /*
     * The acl_to_any_text and the acl_to_text functions will
     * frequently clobber errno, because it uses numerous system
     * calls (e.g. looking up user names and group names).
     */
    errno_hold = errno;

    if (explain_is_efault_pointer(acl, sizeof(void *)))
    {
        barf:
        explain_buffer_pointer(sb, acl);
        errno = errno_hold;
        return;
    }
    if (acl_valid(acl) < 0)
        goto barf;

#ifdef HAVE_ACL_TO_ANY_TEXT
    {
        int options = TEXT_ABBREVIATE;
        text = acl_to_any_text(acl, NULL, ' ', options);
    }
#else
    {
        ssize_t len = 0;
        text = acl_to_text(acl, &len);
    }
#endif
    if (!text)
        goto barf;
    explain_string_buffer_puts_quoted(sb, text);
    acl_free((void *)text);
    errno = errno_hold;
}


/* vim: set ts=8 sw=4 et : */