debug.c revision 1a7529bf5f867b43e0475f7f9ac0cd8671fb16f1
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson/*
3b7f610bec248f85e25a52a0ad7dec9894389ca5Tinderbox User Authors:
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence Simo Sorce <ssorce@redhat.com>
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews Stephen Gallagher <sgallagh@redhat.com>
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews Copyright (C) 2009 Red Hat
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson This program is free software; you can redistribute it and/or modify
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein it under the terms of the GNU General Public License as published by
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence the Free Software Foundation; either version 3 of the License, or
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson (at your option) any later version.
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
593cb00bd17e5e2ab0dcb7c635a9a81082dc5d0eAndreas Gustafsson This program is distributed in the hope that it will be useful,
593cb00bd17e5e2ab0dcb7c635a9a81082dc5d0eAndreas Gustafsson but WITHOUT ANY WARRANTY; without even the implied warranty of
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews GNU General Public License for more details.
3e14b69d196a3ebeecc4662c426344dcfd7db678Andreas Gustafsson
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews You should have received a copy of the GNU General Public License
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence along with this program. If not, see <http://www.gnu.org/licenses/>.
16a68807e13caea3183a41a5292f1b3f48b81a26Mark Andrews*/
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include "config.h"
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
261a6a1f7d95eaf0cd882f3123dcfd775517a54fMark Andrews#include <stdio.h>
e63d63dc8510c669e1575b2762265842e8783822Evan Hunt#include <stdarg.h>
364a82f7c25b62967678027043425201a5e5171aBob Halley#include <stdlib.h>
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <sys/types.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <sys/stat.h>
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews#include <sys/time.h>
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
261a6a1f7d95eaf0cd882f3123dcfd775517a54fMark Andrews#include "util/util.h"
3e14b69d196a3ebeecc4662c426344dcfd7db678Andreas Gustafsson
a903095bf4512dae561c7f6fc7854a51bebf334aMark Andrewsconst char *debug_prg_name = "sssd";
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
47d89fcd4fb850b066f87dc3313afe1cfe92cd99Mark Andrewsint debug_level = SSSDBG_UNRESOLVED;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafssonint debug_timestamps = SSSDBG_TIMESTAMP_UNRESOLVED;
673ce7aebbb6d01c75b95f6df1ec491d6422b951Andreas Gustafssonint debug_microseconds = SSSDBG_MICROSECONDS_UNRESOLVED;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafssonint debug_to_file = 0;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafssonconst char *debug_log_file = "sssd";
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid LawrenceFILE *debug_file = NULL;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafssonerrno_t set_debug_file_from_fd(const int fd)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson{
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson FILE *dummy;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews errno_t ret;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews errno = 0;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson dummy = fdopen(fd, "a");
600cfa2ba4c50017581b6c14e3a688a82ecebbe0David Lawrence if (dummy == NULL) {
600cfa2ba4c50017581b6c14e3a688a82ecebbe0David Lawrence ret = errno;
600cfa2ba4c50017581b6c14e3a688a82ecebbe0David Lawrence DEBUG(1, ("fdopen failed [%d][%s].\n", ret, strerror(ret)));
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson return ret;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson }
47d89fcd4fb850b066f87dc3313afe1cfe92cd99Mark Andrews
47d89fcd4fb850b066f87dc3313afe1cfe92cd99Mark Andrews debug_file = dummy;
47d89fcd4fb850b066f87dc3313afe1cfe92cd99Mark Andrews
47d89fcd4fb850b066f87dc3313afe1cfe92cd99Mark Andrews return EOK;
47d89fcd4fb850b066f87dc3313afe1cfe92cd99Mark Andrews}
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
e63d63dc8510c669e1575b2762265842e8783822Evan Huntint debug_convert_old_level(int old_level)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson{
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if ((old_level != 0) && !(old_level & 0x000F))
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson return old_level;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson int new_level = SSSDBG_FATAL_FAILURE;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
9a859983d7059a6eb9c877c1d2ac6a3a5b7170f7Evan Hunt if (old_level <= 0)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson return new_level;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein if (old_level >= 1)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_CRIT_FAILURE;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (old_level >= 2)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_OP_FAILURE;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (old_level >= 3)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_MINOR_FAILURE;
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (old_level >= 4)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_CONF_SETTINGS;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (old_level >= 5)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_FUNC_DATA;
0c8649cea98afc061dd2938fd315df53b8fc35caAndreas Gustafsson
0c8649cea98afc061dd2938fd315df53b8fc35caAndreas Gustafsson if (old_level >= 6)
0c8649cea98afc061dd2938fd315df53b8fc35caAndreas Gustafsson new_level |= SSSDBG_TRACE_FUNC;
692ae2fff922f1c072169d1ddda8e600cb572a9bMark Andrews
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (old_level >= 7)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_TRACE_LIBS;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (old_level >= 8)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson new_level |= SSSDBG_TRACE_INTERNAL;
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews if (old_level >= 9)
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews new_level |= SSSDBG_TRACE_ALL;
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews return new_level;
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews}
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrewsvoid debug_fn(const char *format, ...)
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews{
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews va_list ap;
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews va_start(ap, format);
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews vfprintf(debug_file ? debug_file : stderr, format, ap);
d6f99498d624d5c5c8ee45067df02e6a6b35a1a3Mark Andrews fflush(debug_file ? debug_file : stderr);
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson va_end(ap);
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson}
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafssonint debug_get_level(int old_level)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson{
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if ((old_level != 0) && !(old_level & 0x000F))
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson return old_level;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
9a859983d7059a6eb9c877c1d2ac6a3a5b7170f7Evan Hunt if ((old_level > 9) || (old_level < 0))
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson return SSSDBG_FATAL_FAILURE;
b76715a02fbe0c373a5a03c4f09ac0d6de5abc43Mark Andrews
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington int levels[] = {
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington SSSDBG_FATAL_FAILURE, /* 0 */
d0aebc5a55b6145297d94f8aee939852357c59fcMark Andrews SSSDBG_CRIT_FAILURE,
d0aebc5a55b6145297d94f8aee939852357c59fcMark Andrews SSSDBG_OP_FAILURE,
a76b380643a22f23a67a9df284e86cd7ef7608c1Mark Andrews SSSDBG_MINOR_FAILURE,
a76b380643a22f23a67a9df284e86cd7ef7608c1Mark Andrews SSSDBG_CONF_SETTINGS,
b76715a02fbe0c373a5a03c4f09ac0d6de5abc43Mark Andrews SSSDBG_FUNC_DATA,
d0aebc5a55b6145297d94f8aee939852357c59fcMark Andrews SSSDBG_TRACE_FUNC,
d0aebc5a55b6145297d94f8aee939852357c59fcMark Andrews SSSDBG_TRACE_LIBS,
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer SSSDBG_TRACE_INTERNAL,
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington SSSDBG_TRACE_ALL /* 9 */
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington };
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington return levels[old_level];
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington}
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington
9a859983d7059a6eb9c877c1d2ac6a3a5b7170f7Evan Huntvoid ldb_debug_messages(void *context, enum ldb_debug_level level,
19f4d25fd5b35b1375b0b9f13b66770ee4a66154Brian Wellington const char *fmt, va_list ap)
b76715a02fbe0c373a5a03c4f09ac0d6de5abc43Mark Andrews{
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson int loglevel = SSSDBG_UNRESOLVED;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson int ret;
e61793f0865117ad87a19d6e245bea8f3b712d1bDanny Mayer char * message = NULL;
2883651930dc85cacae940fe2a81277dfc14807dBrian Wellington
2883651930dc85cacae940fe2a81277dfc14807dBrian Wellington switch(level) {
2883651930dc85cacae940fe2a81277dfc14807dBrian Wellington case LDB_DEBUG_FATAL:
e482a1c91ecb5e47bc26617bf310d6b5c41fad91Andreas Gustafsson loglevel = SSSDBG_FATAL_FAILURE;
16bd30ae6987cd4ba4fe3b873e72abf5b7178c26Mark Andrews break;
e482a1c91ecb5e47bc26617bf310d6b5c41fad91Andreas Gustafsson case LDB_DEBUG_ERROR:
e482a1c91ecb5e47bc26617bf310d6b5c41fad91Andreas Gustafsson loglevel = SSSDBG_CRIT_FAILURE;
b76715a02fbe0c373a5a03c4f09ac0d6de5abc43Mark Andrews break;
2883651930dc85cacae940fe2a81277dfc14807dBrian Wellington case LDB_DEBUG_WARNING:
2883651930dc85cacae940fe2a81277dfc14807dBrian Wellington loglevel = SSSDBG_TRACE_FUNC;
459d31fa838619cee728a90984d27d18345dc18aAndreas Gustafsson break;
459d31fa838619cee728a90984d27d18345dc18aAndreas Gustafsson case LDB_DEBUG_TRACE:
c67496c94321dfb68d209019f2b5872a81289c66Michael Sawyer loglevel = SSSDBG_TRACE_ALL;
b76715a02fbe0c373a5a03c4f09ac0d6de5abc43Mark Andrews break;
c67496c94321dfb68d209019f2b5872a81289c66Michael Sawyer }
c67496c94321dfb68d209019f2b5872a81289c66Michael Sawyer
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein ret = vasprintf(&message, fmt, ap);
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson if (ret < 0) {
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson /* ENOMEM */
f621719829356f27e831507b75e88e8a655e48d8Danny Mayer return;
bfe313722d5b2eff6c80336ed1f19c2f99a53de6Andreas Gustafsson }
78838d3e0cd62423c23de5503910e01884d2104bBrian Wellington
b76715a02fbe0c373a5a03c4f09ac0d6de5abc43Mark Andrews DEBUG_MSG(loglevel, "ldb", message);
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson free(message);
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt}
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Huntint open_debug_file_ex(const char *filename, FILE **filep)
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt{
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt FILE *f = NULL;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt char *logpath;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt const char *log_file;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt mode_t old_umask;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt int ret;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt if (filename == NULL) {
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt log_file = debug_log_file;
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt } else {
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt log_file = filename;
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt }
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt ret = asprintf(&logpath, "%s/%s.log", LOG_PATH, log_file);
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt if (ret == -1) {
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt return ENOMEM;
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt }
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt
1d761cb453c76353deb8423c78e98d00c5f86ffaEvan Hunt if (debug_file && !filep) fclose(debug_file);
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk old_umask = umask(0177);
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk errno = 0;
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk f = fopen(logpath, "a");
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk if (f == NULL) {
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk sss_log(SSS_LOG_EMERG, "Could not open file [%s]. Error: [%d][%s]\n",
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk logpath, errno, strerror(errno));
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk free(logpath);
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk return EIO;
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk }
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson umask(old_umask);
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt if (filep == NULL) {
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt debug_file = f;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt } else {
b1866070ef4fb9e17bff16ad458f629bbc5a4accwpk *filep = f;
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt }
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson free(logpath);
68e4926b2262571e004b4be00b905ec776c01d9cMichael Graff return EOK;
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson}
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
68e4926b2262571e004b4be00b905ec776c01d9cMichael Graffint open_debug_file(void)
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson{
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews return open_debug_file_ex(NULL, NULL);
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews}
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
9aba20edee4e704433a464ae43b070b0775de506Mark Andrewsint rotate_debug_files(void)
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews{
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews int ret;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews errno_t error;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews if (!debug_to_file) return EOK;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews do {
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews error = 0;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews ret = fclose(debug_file);
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews if (ret != 0) {
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews error = errno;
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews }
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews /* Check for EINTR, which means we should retry
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews * because the system call was interrupted by a
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews * signal
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews */
a903095bf4512dae561c7f6fc7854a51bebf334aMark Andrews } while (error == EINTR);
b4d8192d210290112e07b0e22b491c45c50ba696Evan Hunt
a903095bf4512dae561c7f6fc7854a51bebf334aMark Andrews if (error != 0) {
a903095bf4512dae561c7f6fc7854a51bebf334aMark Andrews /* Even if we were unable to close the debug log, we need to make
a903095bf4512dae561c7f6fc7854a51bebf334aMark Andrews * sure that we open up a new one. Log rotation will remove the
a903095bf4512dae561c7f6fc7854a51bebf334aMark Andrews * current file, so all debug messages will be disappearing.
9aba20edee4e704433a464ae43b070b0775de506Mark Andrews *
7ab0e69f61e61e81d489c95c7ebd981e74e7ef16Andreas Gustafsson * We should write an error to the syslog warning of the resource
e672951ed28b2e9cc7a19c3d7fa4a258382f981cAutomatic Updater * leak and then proceed with opening the new file.
d788d738e3d29037651b42566519c9a0a66ba219Mark Andrews */
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein sss_log(SSS_LOG_ALERT, "Could not close debug file [%s]. [%d][%s]\n",
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence debug_log_file, error, strerror(error));
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson sss_log(SSS_LOG_ALERT, "Attempting to open new file anyway. "
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson "Be aware that this is a resource leak\n");
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson }
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
42a5f9c8f535fb2a6d1cbfaa38533176e1f1667aBob Halley debug_file = NULL;
42a5f9c8f535fb2a6d1cbfaa38533176e1f1667aBob Halley
42a5f9c8f535fb2a6d1cbfaa38533176e1f1667aBob Halley return open_debug_file();
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson}
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson