libexplain  1.4.D001
libexplain/iocontrol/parse_request_or_die.c
Go to the documentation of this file.
00001 /*
00002  * libexplain - Explain errno values returned by libc functions
00003  * Copyright (C) 2009, 2013 Peter Miller
00004  * Written by Peter Miller <pmiller@opensource.org.au>
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU Lesser General Public License as
00008  * published by the Free Software Foundation; either version 3 of the
00009  * License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public License
00017  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00018  */
00019 
00020 #include <libexplain/ac/stdlib.h>
00021 #include <libexplain/ac/sys/ioctl.h>
00022 
00023 #include <libexplain/iocontrol/table.h>
00024 #include <libexplain/parse_bits.h>
00025 
00026 
00027 int
00028 explain_parse_ioctl_request_or_die(const char *text)
00029 {
00030     explain_parse_bits_table_t *tokens;
00031     size_t          size;
00032     int             result;
00033 
00034     /*
00035      * We must build a parse_bits table to pass to the parser.
00036      */
00037     tokens = malloc(sizeof(tokens[0]) * (explain_iocontrol_table_size + 2));
00038     size = 0;
00039     if (tokens)
00040     {
00041         explain_parse_bits_table_t *p;
00042         const explain_iocontrol_t *const *tpp;
00043         const explain_iocontrol_t *const *end;
00044 
00045         end = explain_iocontrol_table + explain_iocontrol_table_size;
00046         p = tokens;
00047         for (tpp = explain_iocontrol_table; tpp < end; ++tpp)
00048         {
00049             const explain_iocontrol_t *tp;
00050 
00051             tp = *tpp;
00052             if (tp->name && tp->number != -1)
00053             {
00054                 p->name = tp->name;
00055                 p->value = tp->number;
00056                 ++p;
00057             }
00058         }
00059 
00060 #ifdef SIOCDEVPRIVATE
00061         p->name = "SIOCDEVPRIVATE";
00062         p->value = SIOCDEVPRIVATE;
00063         ++p;
00064 #endif
00065 
00066 #ifdef SIOCPROTOPRIVATE
00067         p->name = "SIOCPROTOPRIVATE";
00068         p->value = SIOCPROTOPRIVATE;
00069         ++p;
00070 #endif
00071 
00072         size = p - tokens;
00073     }
00074     result = explain_parse_bits_or_die(text, tokens, size, "ioctl request");
00075     if (tokens)
00076         free(tokens);
00077     return result;
00078 }
00079 
00080 
00081 /* vim: set ts=8 sw=4 et : */