1 /* $NetBSD: printmsg.c,v 1.3 2021/08/14 16:15:02 christos Exp $ */
2
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 2002-2021 The OpenLDAP Foundation.
7 * Portions Copyright 1997,2002-2003 IBM Corporation.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted only as authorized by the OpenLDAP
12 * Public License.
13 *
14 * A copy of this license is available in the file LICENSE in the
15 * top-level directory of the distribution or, alternatively, at
16 * <http://www.OpenLDAP.org/license.html>.
17 */
18 /* ACKNOWLEDGEMENTS:
19 * This work was initially developed by IBM Corporation for use in
20 * IBM products and subsequently ported to OpenLDAP Software by
21 * Steve Omrani.
22 */
23
24 #include <portable.h>
25 #include <stdio.h>
26 #include <ac/string.h>
27 #include <ac/stdarg.h>
28 #include <ac/unistd.h>
29 #include <fcntl.h>
30 #include <ac/errno.h>
31
32 #include <ldap.h>
33 #include <ldap_config.h>
34 #include <slap.h>
35 #include <slapi.h>
36
37 #include <ldap_pvt_thread.h>
38
39 /* Single threads access to routine */
40 ldap_pvt_thread_mutex_t slapi_printmessage_mutex;
41 char *slapi_log_file = NULL;
42 int slapi_log_level = SLAPI_LOG_PLUGIN;
43
44 int
slapi_int_log_error(int level,char * subsystem,char * fmt,va_list arglist)45 slapi_int_log_error(
46 int level,
47 char *subsystem,
48 char *fmt,
49 va_list arglist )
50 {
51 int rc = 0;
52 FILE *fp = NULL;
53
54 char timeStr[100];
55 struct tm *ltm;
56 time_t currentTime;
57
58 assert( subsystem != NULL );
59 assert( fmt != NULL );
60
61 ldap_pvt_thread_mutex_lock( &slapi_printmessage_mutex ) ;
62
63 /* for now, we log all severities */
64 if ( level <= slapi_log_level ) {
65 fp = fopen( slapi_log_file, "a" );
66 if ( fp == NULL) {
67 rc = -1;
68 goto done;
69 }
70
71 /*
72 * FIXME: could block
73 */
74 while ( lockf( fileno( fp ), F_LOCK, 0 ) != 0 ) {
75 /* DO NOTHING */ ;
76 }
77
78 time( ¤tTime );
79 ltm = localtime( ¤tTime );
80 strftime( timeStr, sizeof(timeStr), "%x %X", ltm );
81 fputs( timeStr, fp );
82
83 fprintf( fp, " %s: ", subsystem );
84 vfprintf( fp, fmt, arglist );
85 if ( fmt[ strlen( fmt ) - 1 ] != '\n' ) {
86 fputs( "\n", fp );
87 }
88 fflush( fp );
89
90 lockf( fileno( fp ), F_ULOCK, 0 );
91
92 fclose( fp );
93
94 } else {
95 rc = -1;
96 }
97
98 done:
99 ldap_pvt_thread_mutex_unlock( &slapi_printmessage_mutex );
100
101 return rc;
102 }
103