LCOV - code coverage report
Current view: top level - util - util.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 5 5 100.0 %
Date: 2012-11-29 Functions: 1 1 100.0 %
Branches: 1 2 50.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :     Authors:
       3                 :            :         Simo Sorce <ssorce@redhat.com>
       4                 :            : 
       5                 :            :     Copyright (C) 2009 Red Hat
       6                 :            : 
       7                 :            :     This program is free software; you can redistribute it and/or modify
       8                 :            :     it under the terms of the GNU General Public License as published by
       9                 :            :     the Free Software Foundation; either version 3 of the License, or
      10                 :            :     (at your option) any later version.
      11                 :            : 
      12                 :            :     This program is distributed in the hope that it will be useful,
      13                 :            :     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14                 :            :     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15                 :            :     GNU General Public License for more details.
      16                 :            : 
      17                 :            :     You should have received a copy of the GNU General Public License
      18                 :            :     along with this program.  If not, see <http://www.gnu.org/licenses/>.
      19                 :            : */
      20                 :            : 
      21                 :            : #ifndef __SSSD_UTIL_H__
      22                 :            : #define __SSSD_UTIL_H__
      23                 :            : 
      24                 :            : #include "config.h"
      25                 :            : #include <stdio.h>
      26                 :            : #include <stdint.h>
      27                 :            : #include <stdbool.h>
      28                 :            : #include <unistd.h>
      29                 :            : #include <string.h>
      30                 :            : #include <strings.h>
      31                 :            : #include <ctype.h>
      32                 :            : #include <errno.h>
      33                 :            : #include <libintl.h>
      34                 :            : #include <limits.h>
      35                 :            : #include <locale.h>
      36                 :            : #include <time.h>
      37                 :            : #include <pcre.h>
      38                 :            : #include <sys/types.h>
      39                 :            : #include <sys/stat.h>
      40                 :            : 
      41                 :            : #include <talloc.h>
      42                 :            : #include <tevent.h>
      43                 :            : #include <ldb.h>
      44                 :            : #include <dhash.h>
      45                 :            : 
      46                 :            : #include "util/atomic_io.h"
      47                 :            : 
      48                 :            : #ifndef HAVE_ERRNO_T
      49                 :            : #define HAVE_ERRNO_T
      50                 :            : typedef int errno_t;
      51                 :            : #endif
      52                 :            : 
      53                 :            : #define _(STRING) gettext (STRING)
      54                 :            : 
      55                 :            : #define ENUM_INDICATOR "*"
      56                 :            : 
      57                 :            : #define CLEAR_MC_FLAG "clear_mc_flag"
      58                 :            : 
      59                 :            : extern const char *debug_prg_name;
      60                 :            : extern int debug_level;
      61                 :            : extern int debug_timestamps;
      62                 :            : extern int debug_microseconds;
      63                 :            : extern int debug_to_file;
      64                 :            : extern const char *debug_log_file;
      65                 :            : void debug_fn(const char *format, ...);
      66                 :            : int debug_get_level(int old_level);
      67                 :            : int debug_convert_old_level(int old_level);
      68                 :            : errno_t set_debug_file_from_fd(const int fd);
      69                 :            : 
      70                 :            : #define SSSDBG_FATAL_FAILURE  0x0010   /* level 0 */
      71                 :            : #define SSSDBG_CRIT_FAILURE   0x0020   /* level 1 */
      72                 :            : #define SSSDBG_OP_FAILURE     0x0040   /* level 2 */
      73                 :            : #define SSSDBG_MINOR_FAILURE  0x0080   /* level 3 */
      74                 :            : #define SSSDBG_CONF_SETTINGS  0x0100   /* level 4 */
      75                 :            : #define SSSDBG_FUNC_DATA      0x0200   /* level 5 */
      76                 :            : #define SSSDBG_TRACE_FUNC     0x0400   /* level 6 */
      77                 :            : #define SSSDBG_TRACE_LIBS     0x1000   /* level 7 */
      78                 :            : #define SSSDBG_TRACE_INTERNAL 0x2000   /* level 8 */
      79                 :            : #define SSSDBG_TRACE_ALL      0x4000   /* level 9 */
      80                 :            : #define SSSDBG_IMPORTANT_INFO SSSDBG_OP_FAILURE
      81                 :            : 
      82                 :            : #define SSSDBG_INVALID        -1
      83                 :            : #define SSSDBG_UNRESOLVED     0
      84                 :            : #define SSSDBG_MASK_ALL       0xFFF0   /* enable all debug levels */
      85                 :            : #define SSSDBG_DEFAULT        SSSDBG_FATAL_FAILURE
      86                 :            : 
      87                 :            : #define SSSDBG_TIMESTAMP_UNRESOLVED   -1
      88                 :            : #define SSSDBG_TIMESTAMP_DEFAULT       1
      89                 :            : 
      90                 :            : #define SSSDBG_MICROSECONDS_UNRESOLVED   -1
      91                 :            : #define SSSDBG_MICROSECONDS_DEFAULT       0
      92                 :            : 
      93                 :            : #define SSSD_DEBUG_OPTS \
      94                 :            :         {"debug-level", 'd', POPT_ARG_INT, &debug_level, 0, \
      95                 :            :          _("Debug level"), NULL}, \
      96                 :            :         {"debug-to-files", 'f', POPT_ARG_NONE, &debug_to_file, 0, \
      97                 :            :          _("Send the debug output to files instead of stderr"), NULL }, \
      98                 :            :         {"debug-timestamps", 0, POPT_ARG_INT, &debug_timestamps, 0, \
      99                 :            :          _("Add debug timestamps"), NULL}, \
     100                 :            :          {"debug-microseconds", 0, POPT_ARG_INT, &debug_microseconds, 0, \
     101                 :            :           _("Show timestamps with microseconds"), NULL},
     102                 :            : 
     103                 :            : /** \def DEBUG(level, body)
     104                 :            :     \brief macro to generate debug messages
     105                 :            : 
     106                 :            :     \param level the debug level, please use one of the SSSDBG_* macros
     107                 :            :       Old format:
     108                 :            :       - 1 is for critical errors users may find it difficult to understand but
     109                 :            :         are still quite clear
     110                 :            :       - 2-4 is for stuff developers are interested in in general, but
     111                 :            :         shouldn't fill the screen with useless low level verbose stuff
     112                 :            :       - 5-6 is for errors you may want to track, but only if you explicitly
     113                 :            :         looking for additional clues
     114                 :            :       - 7-10 is for informational stuff
     115                 :            : 
     116                 :            :     \param body the debug message you want to send, should end with \n
     117                 :            : */
     118                 :            : #define DEBUG(level, body) do { \
     119                 :            :     int __debug_macro_newlevel = debug_get_level(level); \
     120                 :            :     if (DEBUG_IS_SET(__debug_macro_newlevel)) { \
     121                 :            :         if (debug_timestamps) { \
     122                 :            :             struct timeval __debug_macro_tv; \
     123                 :            :             struct tm *__debug_macro_tm; \
     124                 :            :             char __debug_macro_datetime[20]; \
     125                 :            :             int __debug_macro_year; \
     126                 :            :             gettimeofday(&__debug_macro_tv, NULL); \
     127                 :            :             __debug_macro_tm = localtime(&__debug_macro_tv.tv_sec); \
     128                 :            :             __debug_macro_year = __debug_macro_tm->tm_year + 1900; \
     129                 :            :             /* get date time without year */ \
     130                 :            :             memcpy(__debug_macro_datetime, ctime(&__debug_macro_tv.tv_sec), 19); \
     131                 :            :             __debug_macro_datetime[19] = '\0'; \
     132                 :            :             if (debug_microseconds) { \
     133                 :            :                 debug_fn("(%s:%.6d %d) [%s] [%s] (%#.4x): ", \
     134                 :            :                          __debug_macro_datetime, __debug_macro_tv.tv_usec, \
     135                 :            :                          __debug_macro_year, debug_prg_name, \
     136                 :            :                          __FUNCTION__, __debug_macro_newlevel); \
     137                 :            :             } else { \
     138                 :            :                 debug_fn("(%s %d) [%s] [%s] (%#.4x): ", \
     139                 :            :                          __debug_macro_datetime, __debug_macro_year, \
     140                 :            :                          debug_prg_name, __FUNCTION__, __debug_macro_newlevel); \
     141                 :            :             } \
     142                 :            :         } else { \
     143                 :            :             debug_fn("[%s] [%s] (%#.4x): ", \
     144                 :            :                      debug_prg_name, __FUNCTION__, __debug_macro_newlevel); \
     145                 :            :         } \
     146                 :            :         debug_fn body; \
     147                 :            :     } \
     148                 :            : } while(0)
     149                 :            : 
     150                 :            : /** \def DEBUG_MSG(level, function, message)
     151                 :            :     \brief macro to generate debug messages with message from variable
     152                 :            : 
     153                 :            :     \param level the debug level, please use one of the SSSDBG_* macros
     154                 :            : 
     155                 :            :     \param function name of the function where DEBUG_MSG is called
     156                 :            : 
     157                 :            :     \param message message to be send (should not end with \n)
     158                 :            : */
     159                 :            : #define DEBUG_MSG(level, function, message) do { \
     160                 :            :     int __debug_macro_newlevel = debug_get_level(level); \
     161                 :            :     if (DEBUG_IS_SET(__debug_macro_newlevel)) { \
     162                 :            :         if (debug_timestamps) { \
     163                 :            :             struct timeval __debug_macro_tv; \
     164                 :            :             struct tm *__debug_macro_tm; \
     165                 :            :             char __debug_macro_datetime[20]; \
     166                 :            :             int __debug_macro_year; \
     167                 :            :             gettimeofday(&__debug_macro_tv, NULL); \
     168                 :            :             __debug_macro_tm = localtime(&__debug_macro_tv.tv_sec); \
     169                 :            :             __debug_macro_year = __debug_macro_tm->tm_year + 1900; \
     170                 :            :             /* get date time without year */ \
     171                 :            :             memcpy(__debug_macro_datetime, ctime(&__debug_macro_tv.tv_sec), 19); \
     172                 :            :             __debug_macro_datetime[19] = '\0'; \
     173                 :            :             if (debug_microseconds) { \
     174                 :            :                 debug_fn("(%s:%.6d %d) [%s] [%s] (%#.4x): %s\n", \
     175                 :            :                          __debug_macro_datetime, __debug_macro_tv.tv_usec, \
     176                 :            :                          __debug_macro_year, debug_prg_name, \
     177                 :            :                          function, __debug_macro_newlevel, message); \
     178                 :            :             } else { \
     179                 :            :                 debug_fn("(%s %d) [%s] [%s] (%#.4x): %s\n", \
     180                 :            :                          __debug_macro_datetime, __debug_macro_year, \
     181                 :            :                          debug_prg_name, function, __debug_macro_newlevel, \
     182                 :            :                          message); \
     183                 :            :             } \
     184                 :            :         } else { \
     185                 :            :             debug_fn("[%s] [%s] (%#.4x): %s\n", \
     186                 :            :                      debug_prg_name, function, __debug_macro_newlevel, message); \
     187                 :            :         } \
     188                 :            :     } \
     189                 :            : } while(0)
     190                 :            : 
     191                 :            : /** \def DEBUG_IS_SET(level)
     192                 :            :     \brief checks whether level (must be in new format) is set in debug_level
     193                 :            : 
     194                 :            :     \param level the debug level, please use one of the SSSDBG*_ macros
     195                 :            : */
     196                 :            : #define DEBUG_IS_SET(level) (debug_level & (level) || \
     197                 :            :                             (debug_level == SSSDBG_UNRESOLVED && \
     198                 :            :                                             (level & (SSSDBG_FATAL_FAILURE | \
     199                 :            :                                                       SSSDBG_CRIT_FAILURE))))
     200                 :            : 
     201                 :            : #define DEBUG_INIT(dbg_lvl) do { \
     202                 :            :     if (dbg_lvl != SSSDBG_INVALID) { \
     203                 :            :         debug_level = debug_convert_old_level(dbg_lvl); \
     204                 :            :     } else { \
     205                 :            :         debug_level = SSSDBG_UNRESOLVED; \
     206                 :            :     } \
     207                 :            : \
     208                 :            :     talloc_set_log_fn(talloc_log_fn); \
     209                 :            : } while (0)
     210                 :            : 
     211                 :            : #define PRINT(fmt, ...) fprintf(stdout, gettext(fmt), ##__VA_ARGS__)
     212                 :            : #define ERROR(fmt, ...) fprintf(stderr, gettext(fmt), ##__VA_ARGS__)
     213                 :            : 
     214                 :            : #ifndef discard_const
     215                 :            : #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
     216                 :            : #endif
     217                 :            : 
     218                 :            : #ifndef NULL
     219                 :            : #define NULL 0
     220                 :            : #endif
     221                 :            : 
     222                 :            : #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
     223                 :            : 
     224                 :            : #define EOK 0
     225                 :            : 
     226                 :            : #define SSSD_MAIN_OPTS SSSD_DEBUG_OPTS
     227                 :            : 
     228                 :            : #define FLAGS_NONE 0x0000
     229                 :            : #define FLAGS_DAEMON 0x0001
     230                 :            : #define FLAGS_INTERACTIVE 0x0002
     231                 :            : #define FLAGS_PID_FILE 0x0004
     232                 :            : 
     233                 :            : #ifndef talloc_zfree
     234                 :            : #define talloc_zfree(ptr) do { talloc_free(discard_const(ptr)); ptr = NULL; } while(0)
     235                 :            : #endif
     236                 :            : 
     237                 :            : #ifndef discard_const_p
     238                 :            : #if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T)
     239                 :            : # define discard_const_p(type, ptr) ((type *)((intptr_t)(ptr)))
     240                 :            : #else
     241                 :            : # define discard_const_p(type, ptr) ((type *)(ptr))
     242                 :            : #endif
     243                 :            : #endif
     244                 :            : 
     245                 :            : /* TODO: remove later
     246                 :            :  * These functions are available in the latest tevent and are the ones that
     247                 :            :  * should be used as tevent_req is rightfully opaque there */
     248                 :            : #ifndef tevent_req_data
     249                 :            : #define tevent_req_data(req, type) ((type *)req->private_state)
     250                 :            : #define tevent_req_set_callback(req, func, data) \
     251                 :            :     do { req->async.fn = func; req->async.private_data = data; } while(0)
     252                 :            : #define tevent_req_callback_data(req, type) ((type *)req->async.private_data)
     253                 :            : #define tevent_req_notify_callback(req) \
     254                 :            :     do { \
     255                 :            :         if (req->async.fn != NULL) { \
     256                 :            :             req->async.fn(req); \
     257                 :            :         } \
     258                 :            :     } while(0)
     259                 :            : 
     260                 :            : /* noop */
     261                 :            : #define tevent_loop_allow_nesting(x)
     262                 :            : #endif
     263                 :            : 
     264                 :            : #define TEVENT_REQ_RETURN_ON_ERROR(req) do { \
     265                 :            :     enum tevent_req_state TRROEstate; \
     266                 :            :     uint64_t TRROEerr; \
     267                 :            :     \
     268                 :            :     if (tevent_req_is_error(req, &TRROEstate, &TRROEerr)) { \
     269                 :            :         if (TRROEstate == TEVENT_REQ_USER_ERROR) { \
     270                 :            :             return TRROEerr; \
     271                 :            :         } \
     272                 :            :         return EIO; \
     273                 :            :     } \
     274                 :            : } while (0)
     275                 :            : 
     276                 :            : #define OUT_OF_ID_RANGE(id, min, max) \
     277                 :            :     (id == 0 || (min && (id < min)) || (max && (id > max)))
     278                 :            : 
     279                 :            : #define SIZE_T_MAX ((size_t) -1)
     280                 :            : 
     281                 :            : #define SIZE_T_OVERFLOW(current, add) \
     282                 :            :                         (((size_t)(add)) > (SIZE_T_MAX - ((size_t)(current))))
     283                 :            : 
     284                 :            : static inline void
     285                 :         83 : safealign_memcpy(void *dest, const void *src, size_t n, size_t *counter)
     286                 :            : {
     287                 :         83 :     memcpy(dest, src, n);
     288         [ +  - ]:         83 :     if (counter) {
     289                 :         83 :         *counter += n;
     290                 :            :     }
     291                 :         83 : }
     292                 :            : 
     293                 :            : #define SAFEALIGN_SET_VALUE(dest, value, type, pctr) do { \
     294                 :            :     type CV_MACRO_val = (type)(value); \
     295                 :            :     safealign_memcpy(dest, &CV_MACRO_val, sizeof(type), pctr); \
     296                 :            : } while(0)
     297                 :            : 
     298                 :            : #define SAFEALIGN_COPY_INT64(dest, src, pctr) \
     299                 :            :     safealign_memcpy(dest, src, sizeof(int64_t), pctr)
     300                 :            : 
     301                 :            : #define SAFEALIGN_SET_INT64(dest, value, pctr) \
     302                 :            :     SAFEALIGN_SET_VALUE(dest, value, int64_t, pctr)
     303                 :            : 
     304                 :            : #define SAFEALIGN_COPY_UINT32(dest, src, pctr) \
     305                 :            :     safealign_memcpy(dest, src, sizeof(uint32_t), pctr)
     306                 :            : 
     307                 :            : #define SAFEALIGN_SET_UINT32(dest, value, pctr) \
     308                 :            :     SAFEALIGN_SET_VALUE(dest, value, uint32_t, pctr)
     309                 :            : 
     310                 :            : #define SAFEALIGN_COPY_INT32(dest, src, pctr) \
     311                 :            :     safealign_memcpy(dest, src, sizeof(int32_t), pctr)
     312                 :            : 
     313                 :            : #define SAFEALIGN_SET_INT32(dest, value, pctr) \
     314                 :            :     SAFEALIGN_SET_VALUE(dest, value, int32_t, pctr)
     315                 :            : 
     316                 :            : #define SAFEALIGN_COPY_UINT16(dest, src, pctr) \
     317                 :            :     safealign_memcpy(dest, src, sizeof(uint16_t), pctr)
     318                 :            : 
     319                 :            : #define SAFEALIGN_SET_UINT16(dest, value, pctr) \
     320                 :            :     SAFEALIGN_SET_VALUE(dest, value, uint16_t, pctr)
     321                 :            : 
     322                 :            : #define SAFEALIGN_COPY_UINT32_CHECK(dest, src, len, pctr) do { \
     323                 :            :     if ((*(pctr) + sizeof(uint32_t)) > (len) || \
     324                 :            :         SIZE_T_OVERFLOW(*(pctr), sizeof(uint32_t))) return EINVAL; \
     325                 :            :     safealign_memcpy(dest, src, sizeof(uint32_t), pctr); \
     326                 :            : } while(0)
     327                 :            : 
     328                 :            : #define SAFEALIGN_COPY_INT32_CHECK(dest, src, len, pctr) do { \
     329                 :            :     if ((*(pctr) + sizeof(int32_t)) > (len) || \
     330                 :            :         SIZE_T_OVERFLOW(*(pctr), sizeof(int32_t))) return EINVAL; \
     331                 :            :     safealign_memcpy(dest, src, sizeof(int32_t), pctr); \
     332                 :            : } while(0)
     333                 :            : 
     334                 :            : #define SAFEALIGN_COPY_UINT16_CHECK(dest, src, len, pctr) do { \
     335                 :            :     if ((*(pctr) + sizeof(uint16_t)) > (len) || \
     336                 :            :         SIZE_T_OVERFLOW(*(pctr), sizeof(uint16_t))) return EINVAL; \
     337                 :            :     safealign_memcpy(dest, src, sizeof(uint16_t), pctr); \
     338                 :            : } while(0)
     339                 :            : 
     340                 :            : #include "util/dlinklist.h"
     341                 :            : 
     342                 :            : /* From debug.c */
     343                 :            : void ldb_debug_messages(void *context, enum ldb_debug_level level,
     344                 :            :                         const char *fmt, va_list ap);
     345                 :            : int open_debug_file_ex(const char *filename, FILE **filep);
     346                 :            : int open_debug_file(void);
     347                 :            : int rotate_debug_files(void);
     348                 :            : void talloc_log_fn(const char *msg);
     349                 :            : 
     350                 :            : /* From sss_log.c */
     351                 :            : #define SSS_LOG_EMERG   0   /* system is unusable */
     352                 :            : #define SSS_LOG_ALERT   1   /* action must be taken immediately */
     353                 :            : #define SSS_LOG_CRIT    2   /* critical conditions */
     354                 :            : #define SSS_LOG_ERR     3   /* error conditions */
     355                 :            : #define SSS_LOG_WARNING 4   /* warning conditions */
     356                 :            : #define SSS_LOG_NOTICE  5   /* normal but significant condition */
     357                 :            : #define SSS_LOG_INFO    6   /* informational */
     358                 :            : #define SSS_LOG_DEBUG   7   /* debug-level messages */
     359                 :            : 
     360                 :            : void sss_log(int priority, const char *format, ...);
     361                 :            : 
     362                 :            : /* from server.c */
     363                 :            : struct main_context {
     364                 :            :     struct tevent_context *event_ctx;
     365                 :            :     struct confdb_ctx *confdb_ctx;
     366                 :            :     pid_t parent_pid;
     367                 :            : };
     368                 :            : 
     369                 :            : int die_if_parent_died(void);
     370                 :            : int pidfile(const char *path, const char *name);
     371                 :            : int server_setup(const char *name, int flags,
     372                 :            :                  const char *conf_entry,
     373                 :            :                  struct main_context **main_ctx);
     374                 :            : void server_loop(struct main_context *main_ctx);
     375                 :            : void sig_term(int sig);
     376                 :            : 
     377                 :            : /* from signal.c */
     378                 :            : #include <signal.h>
     379                 :            : void BlockSignals(bool block, int signum);
     380                 :            : void (*CatchSignal(int signum,void (*handler)(int )))(int);
     381                 :            : void CatchChild(void);
     382                 :            : void CatchChildLeaveStatus(void);
     383                 :            : 
     384                 :            : /* from memory.c */
     385                 :            : typedef int (void_destructor_fn_t)(void *);
     386                 :            : 
     387                 :            : struct mem_holder {
     388                 :            :     void *mem;
     389                 :            :     void_destructor_fn_t *fn;
     390                 :            : };
     391                 :            : 
     392                 :            : void *sss_mem_attach(TALLOC_CTX *mem_ctx,
     393                 :            :                      void *ptr,
     394                 :            :                      void_destructor_fn_t *fn);
     395                 :            : 
     396                 :            : int password_destructor(void *memctx);
     397                 :            : 
     398                 :            : /* from usertools.c */
     399                 :            : char *get_username_from_uid(TALLOC_CTX *mem_ctx, uid_t uid);
     400                 :            : 
     401                 :            : char *get_uppercase_realm(TALLOC_CTX *memctx, const char *name);
     402                 :            : 
     403                 :            : struct sss_names_ctx {
     404                 :            :     char *re_pattern;
     405                 :            :     char *fq_fmt;
     406                 :            : 
     407                 :            :     pcre *re;
     408                 :            : };
     409                 :            : 
     410                 :            : int sss_names_init(TALLOC_CTX *mem_ctx,
     411                 :            :                    struct confdb_ctx *cdb,
     412                 :            :                    const char *domain,
     413                 :            :                    struct sss_names_ctx **out);
     414                 :            : 
     415                 :            : int sss_parse_name(TALLOC_CTX *memctx,
     416                 :            :                    struct sss_names_ctx *snctx,
     417                 :            :                    const char *orig, char **domain, char **name);
     418                 :            : 
     419                 :            : char *
     420                 :            : sss_get_cased_name(TALLOC_CTX *mem_ctx, const char *orig_name,
     421                 :            :                    bool case_sensitive);
     422                 :            : 
     423                 :            : errno_t
     424                 :            : sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig,
     425                 :            :                         bool case_sensitive, const char ***_cased);
     426                 :            : 
     427                 :            : /* from backup-file.c */
     428                 :            : int backup_file(const char *src, int dbglvl);
     429                 :            : 
     430                 :            : /* from check_and_open.c */
     431                 :            : enum check_file_type {
     432                 :            :     CHECK_DONT_CHECK_FILE_TYPE = -1,
     433                 :            :     CHECK_REG,
     434                 :            :     CHECK_DIR,
     435                 :            :     CHECK_CHR,
     436                 :            :     CHECK_BLK,
     437                 :            :     CHECK_FIFO,
     438                 :            :     CHECK_LNK,
     439                 :            :     CHECK_SOCK
     440                 :            : };
     441                 :            : 
     442                 :            : /* check_file()
     443                 :            :  * Verify that a file has certain permissions and/or is of a certain
     444                 :            :  * file type. This function can be used to determine if a file is a
     445                 :            :  * symlink.
     446                 :            :  * Warning: use of this function implies a potential race condition
     447                 :            :  * Opening a file before or after checking it does NOT guarantee that
     448                 :            :  * it is still the same file. Additional checks should be performed
     449                 :            :  * on the caller_stat_buf to ensure that it has the same device and
     450                 :            :  * inode to minimize impact. Permission changes may have occurred,
     451                 :            :  * however.
     452                 :            :  */
     453                 :            : errno_t check_file(const char *filename, const int uid, const int gid,
     454                 :            :                    const int mode, enum check_file_type type,
     455                 :            :                    struct stat *caller_stat_buf, bool follow_symlink);
     456                 :            : 
     457                 :            : /* check_fd()
     458                 :            :  * Verify that an open file descriptor has certain permissions and/or
     459                 :            :  * is of a certain file type. This function CANNOT detect symlinks,
     460                 :            :  * as the file is already open and symlinks have been traversed. This
     461                 :            :  * is the safer way to perform file checks and should be preferred
     462                 :            :  * over check_file for nearly all situations.
     463                 :            :  */
     464                 :            : errno_t check_fd(int fd, const int uid, const int gid,
     465                 :            :                  const int mode, enum check_file_type type,
     466                 :            :                  struct stat *caller_stat_buf);
     467                 :            : 
     468                 :            : /* check_and_open_readonly()
     469                 :            :  * Utility function to open a file and verify that it has certain
     470                 :            :  * permissions and is of a certain file type. This function wraps
     471                 :            :  * check_fd(), and is considered race-condition safe.
     472                 :            :  */
     473                 :            : errno_t check_and_open_readonly(const char *filename, int *fd, const uid_t uid,
     474                 :            :                                const gid_t gid, const mode_t mode,
     475                 :            :                                enum check_file_type type);
     476                 :            : 
     477                 :            : /* from util.c */
     478                 :            : int split_on_separator(TALLOC_CTX *mem_ctx, const char *str,
     479                 :            :                        const char sep, bool trim, char ***_list, int *size);
     480                 :            : 
     481                 :            : char **parse_args(const char *str);
     482                 :            : 
     483                 :            : errno_t sss_hash_create(TALLOC_CTX *mem_ctx,
     484                 :            :                         unsigned long count,
     485                 :            :                         hash_table_t **tbl);
     486                 :            : 
     487                 :            : errno_t sss_hash_create_ex(TALLOC_CTX *mem_ctx,
     488                 :            :                            unsigned long count,
     489                 :            :                            hash_table_t **tbl,
     490                 :            :                            unsigned int directory_bits,
     491                 :            :                            unsigned int segment_bits,
     492                 :            :                            unsigned long min_load_factor,
     493                 :            :                            unsigned long max_load_factor,
     494                 :            :                            hash_delete_callback *delete_callback,
     495                 :            :                            void *delete_private_data);
     496                 :            : 
     497                 :            : /* Copy a NULL-terminated string list
     498                 :            :  * Returns NULL on out of memory error or invalid input
     499                 :            :  */
     500                 :            : char **dup_string_list(TALLOC_CTX *memctx, const char **str_list);
     501                 :            : 
     502                 :            : /* Take two string lists (terminated on a NULL char*)
     503                 :            :  * and return up to three arrays of strings based on
     504                 :            :  * shared ownership.
     505                 :            :  *
     506                 :            :  * Pass NULL to any return type you don't care about
     507                 :            :  */
     508                 :            : errno_t diff_string_lists(TALLOC_CTX *memctx,
     509                 :            :                           char **string1,
     510                 :            :                           char **string2,
     511                 :            :                           char ***string1_only,
     512                 :            :                           char ***string2_only,
     513                 :            :                           char ***both_strings);
     514                 :            : 
     515                 :            : /* Sanitize an input string (e.g. a username) for use in
     516                 :            :  * an LDAP/LDB filter
     517                 :            :  * Returns a newly-constructed string attached to mem_ctx
     518                 :            :  * It will fail only on an out of memory condition, where it
     519                 :            :  * will return ENOMEM.
     520                 :            :  */
     521                 :            : errno_t sss_filter_sanitize(TALLOC_CTX *mem_ctx,
     522                 :            :                             const char *input,
     523                 :            :                             char **sanitized);
     524                 :            : 
     525                 :            : char *
     526                 :            : sss_escape_ip_address(TALLOC_CTX *mem_ctx, int family, const char *addr);
     527                 :            : 
     528                 :            : /* This function only removes first and last
     529                 :            :  * character if the first character was '['.
     530                 :            :  *
     531                 :            :  * NOTE: This means, that ipv6addr must NOT be followed
     532                 :            :  * by port number.
     533                 :            :  */
     534                 :            : errno_t
     535                 :            : remove_ipv6_brackets(char *ipv6addr);
     536                 :            : 
     537                 :            : 
     538                 :            : errno_t add_string_to_list(TALLOC_CTX *mem_ctx, const char *string,
     539                 :            :                            char ***list_p);
     540                 :            : 
     541                 :            : bool string_in_list(const char *string, char **list, bool case_sensitive);
     542                 :            : 
     543                 :            : /* from sss_tc_utf8.c */
     544                 :            : char *
     545                 :            : sss_tc_utf8_str_tolower(TALLOC_CTX *mem_ctx, const char *s);
     546                 :            : uint8_t *
     547                 :            : sss_tc_utf8_tolower(TALLOC_CTX *mem_ctx, const uint8_t *s, size_t len, size_t *_nlen);
     548                 :            : bool sss_string_equal(bool cs, const char *s1, const char *s2);
     549                 :            : 
     550                 :            : /* len includes terminating '\0' */
     551                 :            : struct sized_string {
     552                 :            :     const char *str;
     553                 :            :     size_t len;
     554                 :            : };
     555                 :            : 
     556                 :            : void to_sized_string(struct sized_string *out, const char *in);
     557                 :            : 
     558                 :            : /* form domain_info.c */
     559                 :            : struct sss_domain_info *new_subdomain(TALLOC_CTX *mem_ctx,
     560                 :            :                                       struct sss_domain_info *parent,
     561                 :            :                                       const char *name,
     562                 :            :                                       const char *flat_name,
     563                 :            :                                       const char *id);
     564                 :            : struct sss_domain_info *copy_subdomain(TALLOC_CTX *mem_ctx,
     565                 :            :                                        struct sss_domain_info *subdomain);
     566                 :            : 
     567                 :            : /* from util_lock.c */
     568                 :            : errno_t sss_br_lock_file(int fd, size_t start, size_t len,
     569                 :            :                          int num_tries, useconds_t wait);
     570                 :            : 
     571                 :            : /* Endianness-compatibility for systems running older versions of glibc */
     572                 :            : 
     573                 :            : #ifndef le32toh
     574                 :            : #include <byteswap.h>
     575                 :            : 
     576                 :            : /* Copied from endian.h on glibc 2.15 */
     577                 :            : #ifdef __USE_BSD
     578                 :            : /* Conversion interfaces.  */
     579                 :            : # if __BYTE_ORDER == __LITTLE_ENDIAN
     580                 :            : #  define le32toh(x) (x)
     581                 :            : #  define htole32(x) (x)
     582                 :            : # else
     583                 :            : #  define le32toh(x) __bswap_32 (x)
     584                 :            : #  define htole32(x) __bswap_32 (x)
     585                 :            : # endif
     586                 :            : #endif /* __USE_BSD */
     587                 :            : 
     588                 :            : #endif /* le32toh */
     589                 :            : 
     590                 :            : #ifdef HAVE_PAC_RESPONDER
     591                 :            : #define BUILD_WITH_PAC_RESPONDER true
     592                 :            : #else
     593                 :            : #define BUILD_WITH_PAC_RESPONDER false
     594                 :            : #endif
     595                 :            : 
     596                 :            : #endif /* __SSSD_UTIL_H__ */

Generated by: LCOV version 1.9