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 */
40ldap_pvt_thread_mutex_t slapi_printmessage_mutex;
41char			*slapi_log_file = NULL;
42int			slapi_log_level = SLAPI_LOG_PLUGIN;
43
44int
45slapi_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( &currentTime );
79		ltm = localtime( &currentTime );
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
98done:
99	ldap_pvt_thread_mutex_unlock( &slapi_printmessage_mutex );
100
101	return rc;
102}
103