1/* $NetBSD: lutil.h,v 1.3 2021/08/14 16:14:55 christos Exp $ */ 2 3/* $OpenLDAP$ */ 4/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 5 * 6 * Copyright 1998-2021 The OpenLDAP Foundation. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted only as authorized by the OpenLDAP 11 * Public License. 12 * 13 * A copy of this license is available in file LICENSE in the 14 * top-level directory of the distribution or, alternatively, at 15 * <http://www.OpenLDAP.org/license.html>. 16 */ 17 18#ifndef _LUTIL_H 19#define _LUTIL_H 1 20 21#include <ldap_cdefs.h> 22#include <lber_types.h> 23#include <ac/socket.h> 24 25#ifdef HAVE_TCPD 26# include <tcpd.h> 27# define LUTIL_STRING_UNKNOWN STRING_UNKNOWN 28#else /* ! TCP Wrappers */ 29# define LUTIL_STRING_UNKNOWN "unknown" 30#endif /* ! TCP Wrappers */ 31 32/* 33 * Include file for LDAP utility routine 34 */ 35 36LDAP_BEGIN_DECL 37 38/* n octets encode into ceiling(n/3) * 4 bytes */ 39/* Avoid floating point math through extra padding */ 40 41#define LUTIL_BASE64_ENCODE_LEN(n) (((n)+2)/3 * 4) 42#define LUTIL_BASE64_DECODE_LEN(n) ((n)/4*3) 43 44/* ISC Base64 Routines */ 45/* base64.c */ 46 47LDAP_LUTIL_F( int ) 48lutil_b64_ntop LDAP_P(( 49 unsigned char const *, 50 size_t, 51 char *, 52 size_t)); 53 54LDAP_LUTIL_F( int ) 55lutil_b64_pton LDAP_P(( 56 char const *, 57 unsigned char *, 58 size_t)); 59 60/* detach.c */ 61LDAP_LUTIL_F( int ) 62lutil_detach LDAP_P(( 63 int debug, 64 int do_close)); 65 66/* entropy.c */ 67LDAP_LUTIL_F( int ) 68lutil_entropy LDAP_P(( 69 unsigned char *buf, 70 ber_len_t nbytes )); 71 72/* passfile.c */ 73struct berval; /* avoid pulling in lber.h */ 74 75LDAP_LUTIL_F( int ) 76lutil_get_filed_password LDAP_P(( 77 const char *filename, 78 struct berval * )); 79 80/* passwd.c */ 81struct lutil_pw_scheme; 82 83#define LUTIL_PASSWD_OK (0) 84#define LUTIL_PASSWD_ERR (-1) 85 86typedef int (LUTIL_PASSWD_CHK_FUNC)( 87 const struct berval *scheme, 88 const struct berval *passwd, 89 const struct berval *cred, 90 const char **text ); 91 92typedef int (LUTIL_PASSWD_HASH_FUNC) ( 93 const struct berval *scheme, 94 const struct berval *passwd, 95 struct berval *hash, 96 const char **text ); 97 98LDAP_LUTIL_F( int ) 99lutil_passwd_add LDAP_P(( 100 struct berval *scheme, 101 LUTIL_PASSWD_CHK_FUNC *chk_fn, 102 LUTIL_PASSWD_HASH_FUNC *hash_fn )); 103 104LDAP_LUTIL_F( void ) 105lutil_passwd_init LDAP_P(( void )); 106 107LDAP_LUTIL_F( void ) 108lutil_passwd_destroy LDAP_P(( void )); 109 110LDAP_LUTIL_F( int ) 111lutil_authpasswd LDAP_P(( 112 const struct berval *passwd, /* stored password */ 113 const struct berval *cred, /* user supplied value */ 114 const char **methods )); 115 116LDAP_LUTIL_F( int ) 117lutil_authpasswd_hash LDAP_P(( 118 const struct berval *cred, 119 struct berval **passwd, /* password to store */ 120 struct berval **salt, /* salt to store */ 121 const char *method )); 122 123#ifdef SLAPD_CRYPT 124typedef int (lutil_cryptfunc) LDAP_P(( 125 const char *key, 126 const char *salt, 127 char **hash )); 128LDAP_LUTIL_V (lutil_cryptfunc *) lutil_cryptptr; 129#endif 130 131LDAP_LUTIL_F( int ) 132lutil_passwd LDAP_P(( 133 const struct berval *passwd, /* stored password */ 134 const struct berval *cred, /* user supplied value */ 135 const char **methods, 136 const char **text )); /* error message */ 137 138LDAP_LUTIL_F( int ) 139lutil_passwd_generate LDAP_P(( struct berval *pw, ber_len_t )); 140 141LDAP_LUTIL_F( int ) 142lutil_passwd_hash LDAP_P(( 143 const struct berval *passwd, 144 const char *method, 145 struct berval *hash, 146 const char **text )); 147 148LDAP_LUTIL_F( int ) 149lutil_passwd_scheme LDAP_P(( 150 const char *scheme )); 151 152LDAP_LUTIL_F( int ) 153lutil_salt_format LDAP_P(( 154 const char *format )); 155 156LDAP_LUTIL_F( int ) 157lutil_passwd_string64 LDAP_P(( 158 const struct berval *sc, 159 const struct berval *hash, 160 struct berval *b64, 161 const struct berval *salt )); 162 163/* utils.c */ 164LDAP_LUTIL_F( char* ) 165lutil_progname LDAP_P(( 166 const char* name, 167 int argc, 168 char *argv[] )); 169 170typedef struct lutil_tm { 171 int tm_sec; /* seconds 0-60 (1 leap second) */ 172 int tm_min; /* minutes 0-59 */ 173 int tm_hour; /* hours 0-23 */ 174 int tm_mday; /* day 1-31 */ 175 int tm_mon; /* month 0-11 */ 176 int tm_year; /* year - 1900 */ 177 int tm_nsec; /* nanoseconds */ 178 int tm_usub; /* submicro */ 179} lutil_tm; 180 181typedef struct lutil_timet { 182 unsigned int tt_sec; /* seconds since epoch, 0000 or 1970 */ 183 int tt_gsec; /* seconds since epoch, high 7 bits, maybe sign-flipped */ 184 /* sign flipped to sort properly as unsigned ints */ 185 unsigned int tt_nsec; /* nanoseconds */ 186} lutil_timet; 187 188/* Parse a timestamp string into a structure */ 189LDAP_LUTIL_F( int ) 190lutil_parsetime LDAP_P(( 191 char *atm, struct lutil_tm * )); 192 193/* Convert structured time to time in seconds since 1970 (Unix epoch) */ 194LDAP_LUTIL_F( int ) 195lutil_tm2time LDAP_P(( 196 struct lutil_tm *, struct lutil_timet * )); 197 198/* Convert structured time to time in seconds since 0000 (Proleptic Gregorian) */ 199LDAP_LUTIL_F( int ) 200lutil_tm2gtime LDAP_P(( 201 struct lutil_tm *, struct lutil_timet * )); 202 203#ifdef _WIN32 204LDAP_LUTIL_F( void ) 205lutil_slashpath LDAP_P(( char* path )); 206#define LUTIL_SLASHPATH(p) lutil_slashpath(p) 207#else 208#define LUTIL_SLASHPATH(p) 209#endif 210 211LDAP_LUTIL_F( char* ) 212lutil_strcopy LDAP_P(( char *dst, const char *src )); 213 214LDAP_LUTIL_F( char* ) 215lutil_strncopy LDAP_P(( char *dst, const char *src, size_t n )); 216 217LDAP_LUTIL_F( char* ) 218lutil_memcopy LDAP_P(( char *dst, const char *src, size_t n )); 219 220#define lutil_strbvcopy(a, bv) lutil_memcopy((a),(bv)->bv_val,(bv)->bv_len) 221 222struct tm; 223 224/* use this macro to statically allocate buffer for lutil_gentime */ 225#define LDAP_LUTIL_GENTIME_BUFSIZE 22 226#define lutil_gentime(s,m,t) lutil_localtime((s),(m),(t),0) 227LDAP_LUTIL_F( size_t ) 228lutil_localtime LDAP_P(( char *s, size_t smax, const struct tm *tm, 229 long delta )); 230 231#ifndef HAVE_MKSTEMP 232LDAP_LUTIL_F( int ) 233mkstemp LDAP_P (( char * template )); 234#endif 235 236/* sockpair.c */ 237LDAP_LUTIL_F( int ) 238lutil_pair( ber_socket_t sd[2] ); 239 240/* uuid.c */ 241/* use this macro to allocate buffer for lutil_uuidstr */ 242#define LDAP_LUTIL_UUIDSTR_BUFSIZE 40 243LDAP_LUTIL_F( size_t ) 244lutil_uuidstr( char *buf, size_t len ); 245 246LDAP_LUTIL_F( int ) 247lutil_uuidstr_from_normalized( 248 char *uuid, 249 size_t uuidlen, 250 char *buf, 251 size_t buflen ); 252 253/* 254 * Sometimes not all declarations in a header file are needed. 255 * An indicator to this is whether or not the symbol's type has 256 * been defined. Thus, we don't need to include a symbol if 257 * its type has not been defined through another header file. 258 */ 259 260#ifdef HAVE_NT_SERVICE_MANAGER 261LDAP_LUTIL_V (int) is_NT_Service; 262 263#ifdef _LDAP_PVT_THREAD_H 264LDAP_LUTIL_V (ldap_pvt_thread_cond_t) started_event; 265#endif /* _LDAP_PVT_THREAD_H */ 266 267/* macros are different between Windows and Mingw */ 268#if defined(_WINSVC_H) || defined(_WINSVC_) 269LDAP_LUTIL_V (SERVICE_STATUS) lutil_ServiceStatus; 270LDAP_LUTIL_V (SERVICE_STATUS_HANDLE) hlutil_ServiceStatus; 271#endif /* _WINSVC_H */ 272 273LDAP_LUTIL_F (void) 274lutil_CommenceStartupProcessing( char *serverName, void (*stopper)(int)) ; 275 276LDAP_LUTIL_F (void) 277lutil_ReportShutdownComplete( void ); 278 279LDAP_LUTIL_F (void *) 280lutil_getRegParam( char *svc, char *value ); 281 282LDAP_LUTIL_F (int) 283lutil_srv_install( char* service, char * displayName, char* filename, 284 int auto_start ); 285LDAP_LUTIL_F (int) 286lutil_srv_remove ( char* service, char* filename ); 287 288#endif /* HAVE_NT_SERVICE_MANAGER */ 289 290#ifdef HAVE_NT_EVENT_LOG 291LDAP_LUTIL_F (void) 292lutil_LogStartedEvent( char *svc, int slap_debug, char *configfile, char *urls ); 293 294LDAP_LUTIL_F (void) 295lutil_LogStoppedEvent( char *svc ); 296#endif 297 298#ifdef HAVE_EBCDIC 299/* Generally this has only been used to put '\n' to stdout. We need to 300 * make sure it is output in EBCDIC. 301 */ 302#undef putchar 303#undef putc 304#define putchar(c) putc((c), stdout) 305#define putc(c,fp) do { char x=(c); __atoe_l(&x,1); putc(x,fp); } while(0) 306#endif 307 308LDAP_LUTIL_F (int) 309lutil_atoix( int *v, const char *s, int x ); 310 311LDAP_LUTIL_F (int) 312lutil_atoux( unsigned *v, const char *s, int x ); 313 314LDAP_LUTIL_F (int) 315lutil_atolx( long *v, const char *s, int x ); 316 317LDAP_LUTIL_F (int) 318lutil_atoulx( unsigned long *v, const char *s, int x ); 319 320#define lutil_atoi(v, s) lutil_atoix((v), (s), 10) 321#define lutil_atou(v, s) lutil_atoux((v), (s), 10) 322#define lutil_atol(v, s) lutil_atolx((v), (s), 10) 323#define lutil_atoul(v, s) lutil_atoulx((v), (s), 10) 324 325#ifdef HAVE_LONG_LONG 326#if defined(HAVE_STRTOLL) || defined(HAVE_STRTOQ) 327LDAP_LUTIL_F (int) 328lutil_atollx( long long *v, const char *s, int x ); 329#define lutil_atoll(v, s) lutil_atollx((v), (s), 10) 330#endif /* HAVE_STRTOLL || HAVE_STRTOQ */ 331 332#if defined(HAVE_STRTOULL) || defined(HAVE_STRTOUQ) 333LDAP_LUTIL_F (int) 334lutil_atoullx( unsigned long long *v, const char *s, int x ); 335#define lutil_atoull(v, s) lutil_atoullx((v), (s), 10) 336#endif /* HAVE_STRTOULL || HAVE_STRTOUQ */ 337#endif /* HAVE_LONG_LONG */ 338 339LDAP_LUTIL_F (int) 340lutil_str2bin( struct berval *in, struct berval *out, void *ctx ); 341 342/* Parse and unparse time intervals */ 343LDAP_LUTIL_F (int) 344lutil_parse_time( const char *in, unsigned long *tp ); 345 346LDAP_LUTIL_F (int) 347lutil_unparse_time( char *buf, size_t buflen, unsigned long t ); 348 349#ifdef timerdiv 350#define lutil_timerdiv timerdiv 351#else /* ! timerdiv */ 352/* works inplace (x == t) */ 353#define lutil_timerdiv(t,d,x) \ 354 do { \ 355 time_t s = (t)->tv_sec; \ 356 assert( d > 0 ); \ 357 (x)->tv_sec = s / d; \ 358 (x)->tv_usec = ( (t)->tv_usec + 1000000 * ( s % d ) ) / d; \ 359 } while ( 0 ) 360#endif /* ! timerdiv */ 361 362#ifdef timermul 363#define lutil_timermul timermul 364#else /* ! timermul */ 365/* works inplace (x == t) */ 366#define lutil_timermul(t,m,x) \ 367 do { \ 368 time_t u = (t)->tv_usec * m; \ 369 assert( m > 0 ); \ 370 (x)->tv_sec = (t)->tv_sec * m + u / 1000000; \ 371 (x)->tv_usec = u % 1000000; \ 372 } while ( 0 ); 373#endif /* ! timermul */ 374 375LDAP_END_DECL 376 377#endif /* _LUTIL_H */ 378