X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftrace%2Flib_trace.c;h=b6f2a75e5ed3ee0a821a8bde2768f81261b6cc79;hp=717c7da1608701b5bd431f3dfed1c45933c6feb0;hb=6662c1ccb49cb09d0f2cec2ec6150410a0fd0f7f;hpb=0de8912c1c0746eb37b733e9e6fdf852aab9506a diff --git a/ncurses/trace/lib_trace.c b/ncurses/trace/lib_trace.c index 717c7da1..b6f2a75e 100644 --- a/ncurses/trace/lib_trace.c +++ b/ncurses/trace/lib_trace.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2018,2019 Free Software Foundation, Inc. * + * Copyright 2018-2021,2022 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -36,7 +37,7 @@ /* * lib_trace.c - Tracing/Debugging routines * - * The _tracef() function is originally from pcurses (by Pavel Curtis) in 1982. + * The _tracef() function is originally from pcurses (by Pavel Curtis) in 1982. * pcurses allowed one to enable/disable tracing using traceon() and traceoff() * functions. ncurses provides a trace() function which allows one to * selectively enable or disable several tracing features. @@ -47,7 +48,7 @@ #include -MODULE_ID("$Id: lib_trace.c,v 1.92 2019/03/23 23:47:16 tom Exp $") +MODULE_ID("$Id: lib_trace.c,v 1.100 2022/07/23 20:08:45 tom Exp $") NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */ @@ -91,10 +92,24 @@ NCURSES_EXPORT_VAR(long) _nc_outchars = 0; #define MyPath _nc_globals.trace_fname #define MyLevel _nc_globals.trace_level #define MyNested _nc_globals.nested_tracef +#endif /* TRACE */ -NCURSES_EXPORT(void) -trace(const unsigned int tracelevel) +#if USE_REENTRANT +#define Locked(statement) { \ + _nc_lock_global(tst_tracef); \ + statement; \ + _nc_unlock_global(tst_tracef); \ + } +#else +#define Locked(statement) statement +#endif + +NCURSES_EXPORT(unsigned) +curses_trace(unsigned tracelevel) { + unsigned result; +#if defined(TRACE) + Locked(result = _nc_tracing); if ((MyFP == 0) && tracelevel) { MyInit = TRUE; if (MyFD >= 0) { @@ -113,16 +128,17 @@ trace(const unsigned int tracelevel) _nc_STRCAT(MyPath, ".log", sizeof(MyPath)); } } +#define SAFE_MODE (O_CREAT | O_EXCL | O_RDWR) if (_nc_access(MyPath, W_OK) < 0 - || (MyFD = open(MyPath, O_CREAT | O_EXCL | O_RDWR, 0600)) < 0 + || (MyFD = safe_open3(MyPath, SAFE_MODE, 0600)) < 0 || (MyFP = fdopen(MyFD, BIN_W)) == 0) { ; /* EMPTY */ } } - _nc_tracing = tracelevel; + Locked(_nc_tracing = tracelevel); /* Try to set line-buffered mode, or (failing that) unbuffered, * so that the trace-output gets flushed automatically at the - * end of each line. This is useful in case the program dies. + * end of each line. This is useful in case the program dies. */ if (MyFP != 0) { #if HAVE_SETVBUF /* ANSI */ @@ -141,11 +157,23 @@ trace(const unsigned int tracelevel) fclose(MyFP); MyFP = 0; } - _nc_tracing = tracelevel; + Locked(_nc_tracing = tracelevel); } else if (_nc_tracing != tracelevel) { - _nc_tracing = tracelevel; + Locked(_nc_tracing = tracelevel); _tracef("tracelevel=%#x", tracelevel); } +#else + (void) tracelevel; + result = 0; +#endif + return result; +} + +#if defined(TRACE) +NCURSES_EXPORT(void) +trace(const unsigned int tracelevel) +{ + curses_trace(tracelevel); } static void @@ -196,7 +224,7 @@ _nc_va_tracef(const char *fmt, va_list ap) # if USE_WEAK_SYMBOLS if ((pthread_self)) # endif -#ifdef _WIN32 +#ifdef _NC_WINDOWS fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self().p); #else fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self()); @@ -332,7 +360,7 @@ _nc_fmt_funcptr(char *target, const char *source, size_t size) if (ch != 0 || (n + 1) >= size) leading = FALSE; if (!leading) { - _nc_SPRINTF(dst, _nc_SLIMIT(TR_FUNC_LEN - (dst - target)) + _nc_SPRINTF(dst, _nc_SLIMIT(TR_FUNC_LEN - (size_t) (dst - target)) "%02x", ch & 0xff); dst += 2; }