libexplain
1.4.D001
|
00001 /* 00002 * libexplain - Explain errno values returned by libc functions 00003 * Copyright (C) 2013 Peter Miller 00004 * 00005 * This program is free software; you can redistribute it and/or modify it 00006 * under the terms of the GNU Lesser General Public License as published by 00007 * the Free Software Foundation; either version 3 of the License, or (at 00008 * your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, but 00011 * WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 00013 * General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Lesser General Public License 00016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00017 */ 00018 00019 #include <libexplain/ac/errno.h> 00020 00021 #include <libexplain/buffer/acl.h> 00022 #include <libexplain/buffer/einval.h> 00023 #include <libexplain/buffer/enomem.h> 00024 #include <libexplain/buffer/errno/acl_to_text.h> 00025 #include <libexplain/buffer/errno/generic.h> 00026 #include <libexplain/buffer/pointer.h> 00027 #include <libexplain/buffer/is_the_null_pointer.h> 00028 #include <libexplain/explanation.h> 00029 00030 00031 static void 00032 explain_buffer_errno_acl_to_text_system_call(explain_string_buffer_t *sb, 00033 int errnum, acl_t acl, ssize_t *len_p) 00034 { 00035 (void)errnum; 00036 explain_string_buffer_puts(sb, "acl_to_text(acl = "); 00037 explain_buffer_acl(sb, acl); 00038 explain_string_buffer_puts(sb, ", len_p = "); 00039 explain_buffer_pointer(sb, len_p); 00040 explain_string_buffer_putc(sb, ')'); 00041 } 00042 00043 00044 void 00045 explain_buffer_errno_acl_to_text_explanation(explain_string_buffer_t *sb, 00046 int errnum, const char *syscall_name, acl_t acl, ssize_t *len_p) 00047 { 00048 /* 00049 * http://www.opengroup.org/onlinepubs/009695399/functions/acl_to_text.html 00050 */ 00051 (void)len_p; 00052 switch (errnum) 00053 { 00054 case EINVAL: 00055 if (!acl) 00056 { 00057 explain_buffer_is_the_null_pointer(sb, "acl"); 00058 break; 00059 } 00060 /* 00061 * The argument acl is not a valid pointer to an ACL. 00062 * The ACL referenced by acl contains one or more improp‐ 00063 * erly formed ACL entries, or for some other reason can‐ 00064 * not be translated into a text form of an ACL. 00065 */ 00066 if (acl_valid(acl) < 0) 00067 { 00068 explain_string_buffer_puts 00069 ( 00070 sb, 00071 /* FIXME: i18n */ 00072 "the acl argument does not point to a valid ACL" 00073 ); 00074 break; 00075 } 00076 00077 explain_buffer_einval_vague(sb, "acl"); 00078 break; 00079 00080 case ENOMEM: 00081 /* 00082 * The character string to be returned requires more mem‐ 00083 * ory than is allowed by the hardware or system-imposed 00084 * memory management constraints. 00085 */ 00086 explain_buffer_enomem_user(sb, 0); 00087 break; 00088 00089 default: 00090 explain_buffer_errno_generic(sb, errnum, syscall_name); 00091 break; 00092 } 00093 } 00094 00095 00096 void 00097 explain_buffer_errno_acl_to_text(explain_string_buffer_t *sb, int errnum, 00098 acl_t acl, ssize_t *len_p) 00099 { 00100 explain_explanation_t exp; 00101 00102 explain_explanation_init(&exp, errnum); 00103 explain_buffer_errno_acl_to_text_system_call(&exp.system_call_sb, errnum, 00104 acl, len_p); 00105 explain_buffer_errno_acl_to_text_explanation(&exp.explanation_sb, errnum, 00106 "acl_to_text", acl, len_p); 00107 explain_explanation_assemble(&exp, sb); 00108 } 00109 00110 00111 /* vim: set ts=8 sw=4 et : */