#include <strings.h>
#endif
#endif
+#include <sys/stat.h>
#include "afsutil.h"
#include "fileutil.h"
#if defined(AFS_PTHREAD_ENV)
#ifdef AFS_NT40_ENV
#define F_OK 0
+#define O_NONBLOCK 0
#endif
-char *(*threadNameProgram) ();
+static int
+dummyThreadNum(void)
+{
+ return -1;
+}
+static int (*threadNumProgram) () = dummyThreadNum;
static int serverLogFD = -1;
#include <stdarg.h>
int LogLevel;
int mrafsStyleLogs = 0;
+static int threadIdLogs = 0;
int printLocks = 0;
static char ourName[MAXPATHLEN];
void
+SetLogThreadNumProgram(int (*func) () )
+{
+ threadNumProgram = func;
+}
+
+void
WriteLogBuffer(char *buf, afs_uint32 len)
{
LOCK_SERVERLOG();
UNLOCK_SERVERLOG();
}
+int
+LogThreadNum(void)
+{
+ return (*threadNumProgram) ();
+}
+
void
vFSLog(const char *format, va_list args)
{
char *timeStamp;
char tbuffer[1024];
char *info;
- int len;
- char *name;
+ size_t len;
+ int num;
currenttime = time(0);
timeStamp = afs_ctime(¤ttime, tbuffer, sizeof(tbuffer));
timeStamp[24] = ' '; /* ts[24] is the newline, 25 is the null */
info = &timeStamp[25];
- if (mrafsStyleLogs) {
- name = (*threadNameProgram) ();
- (void)afs_snprintf(info, (sizeof tbuffer) - strlen(tbuffer), "[%s] ",
- name);
+ if (mrafsStyleLogs || threadIdLogs) {
+ num = (*threadNumProgram) ();
+ if (num > -1) {
+ (void)afs_snprintf(info, (sizeof tbuffer) - strlen(tbuffer), "[%d] ",
+ num);
info += strlen(info);
}
+ }
(void)afs_vsnprintf(info, (sizeof tbuffer) - strlen(tbuffer), format,
args);
if (LogLevel > 0) {
LogLevel *= 5;
+
+#if defined(AFS_PTHREAD_ENV)
+ if (LogLevel > 1 && threadNumProgram != NULL &&
+ threadIdLogs == 0) {
+ threadIdLogs = 1;
+ }
+#endif
} else {
LogLevel = 1;
+
+#if defined(AFS_PTHREAD_ENV)
+ if (threadIdLogs == 1)
+ threadIdLogs = 0;
+#endif
}
printLocks = 2;
#if defined(AFS_PTHREAD_ENV)
#if defined(AFS_PTHREAD_ENV)
DebugOn(LogLevel);
#else /* AFS_PTHREAD_ENV */
- IOMGR_SoftSig(DebugOn, (void *)LogLevel);
+ IOMGR_SoftSig(DebugOn, LogLevel);
#endif /* AFS_PTHREAD_ENV */
(void)signal(signo, ResetDebug_Signal); /* on some platforms,
* this signal handler
* needs to be set
* again */
+#if defined(AFS_PTHREAD_ENV)
+ if (threadIdLogs == 1)
+ threadIdLogs = 0;
+#endif
if (mrafsStyleLogs)
OpenLog((char *)&ourName);
} /*ResetDebug_Signal */
(void)signal(SIGHUP, ResetDebug_Signal);
/* Note that we cannot use SIGUSR1 -- Linux stole it for pthreads! */
(void)signal(SIGTSTP, SetDebug_Signal);
+#ifndef AFS_NT40_ENV
+ (void)signal(SIGPIPE, SIG_IGN);
+#endif
}
int
* This function should allow various libraries that inconsistently
* use stdout/stderr to all go to the same place
*/
- int tempfd;
+ int tempfd, isfifo = 0;
char oldName[MAXPATHLEN];
struct timeval Start;
struct tm *TimeFields;
char FileName[MAXPATHLEN];
#ifndef AFS_NT40_ENV
+ struct stat statbuf;
+
if (serverLogSyslog) {
openlog(serverLogSyslogTag, LOG_PID, serverLogSyslogFacility);
return (0);
}
+
+ /* Support named pipes as logs by not rotating them */
+ if ((lstat(fileName, &statbuf) == 0) && (S_ISFIFO(statbuf.st_mode))) {
+ isfifo = 1;
+ }
#endif
if (mrafsStyleLogs) {
- time_t t = Start.tv_sec;
+ time_t t;
TM_GetTimeOfDay(&Start, 0);
+ t = Start.tv_sec;
TimeFields = localtime(&t);
if (fileName) {
if (strncmp(fileName, (char *)&ourName, strlen(fileName)))
TimeFields->tm_mon + 1, TimeFields->tm_mday,
TimeFields->tm_hour, TimeFields->tm_min,
TimeFields->tm_sec);
- rename(fileName, FileName); /* don't check error code */
- tempfd = open(fileName, O_WRONLY | O_TRUNC | O_CREAT, 0666);
+ if (!isfifo)
+ renamefile(fileName, FileName); /* don't check error code */
+ tempfd = open(fileName, O_WRONLY | O_TRUNC | O_CREAT | (isfifo?O_NONBLOCK:0), 0666);
} else {
strcpy(oldName, fileName);
strcat(oldName, ".old");
/* don't check error */
- renamefile(fileName, oldName);
- tempfd = open(fileName, O_WRONLY | O_TRUNC | O_CREAT, 0666);
+ if (!isfifo)
+ renamefile(fileName, oldName);
+ tempfd = open(fileName, O_WRONLY | O_TRUNC | O_CREAT | (isfifo?O_NONBLOCK:0), 0666);
}
if (tempfd < 0) {
printf("Unable to open log file %s\n", fileName);
return -1;
}
-#if defined(AFS_PTHREAD_ENV)
/* redirect stdout and stderr so random printf's don't write to data */
- assert(freopen(NULLDEV, "w", stdout) != NULL);
- assert(freopen(NULLDEV, "w", stderr) != NULL);
+ (void)freopen(fileName, "a", stdout);
+ (void)freopen(fileName, "a", stderr);
+#ifdef HAVE_SETVBUF
+#ifdef SETVBUF_REVERSED
+ setvbuf(stderr, _IONBF, NULL, 0);
+#else
+ setvbuf(stderr, NULL, _IONBF, 0);
+#endif
+#else
+ setbuf(stderr, NULL);
+#endif
+#if defined(AFS_PTHREAD_ENV)
assert(pthread_mutex_init(&serverLogMutex, NULL) == 0);
+#endif /* AFS_PTHREAD_ENV */
serverLogFD = tempfd;
-#else
- close(tempfd); /* just checking.... */
- (void)freopen(fileName, "w", stdout);
- (void)freopen(fileName, "w", stderr);
- serverLogFD = fileno(stdout);
-#endif /* AFS_PTHREAD_ENV */
return 0;
} /*OpenLog */
int
ReOpenLog(const char *fileName)
{
+ int isfifo = 0;
#if !defined(AFS_PTHREAD_ENV)
int tempfd;
#endif
+#if !defined(AFS_NT40_ENV)
+ struct stat statbuf;
+#endif
if (access(fileName, F_OK) == 0)
return 0; /* exists, no need to reopen. */
if (serverLogSyslog) {
return 0;
}
+
+ /* Support named pipes as logs by not rotating them */
+ if ((lstat(fileName, &statbuf) == 0) && (S_ISFIFO(statbuf.st_mode))) {
+ isfifo = 1;
+ }
#endif
-#if defined(AFS_PTHREAD_ENV)
LOCK_SERVERLOG();
if (serverLogFD > 0)
close(serverLogFD);
- serverLogFD = open(fileName, O_WRONLY | O_APPEND | O_CREAT, 0666);
- UNLOCK_SERVERLOG();
- return serverLogFD < 0 ? -1 : 0;
+ serverLogFD = open(fileName, O_WRONLY | O_APPEND | O_CREAT | (isfifo?O_NONBLOCK:0), 0666);
+ if (serverLogFD > 0) {
+ (void)freopen(fileName, "a", stdout);
+ (void)freopen(fileName, "a", stderr);
+#ifdef HAVE_SETVBUF
+#ifdef SETVBUF_REVERSED
+ setvbuf(stderr, _IONBF, NULL, 0);
#else
+ setvbuf(stderr, NULL, _IONBF, 0);
+#endif
+#else
+ setbuf(stderr, NULL);
+#endif
- tempfd = open(fileName, O_WRONLY | O_APPEND | O_CREAT, 0666);
- if (tempfd < 0) {
- printf("Unable to open log file %s\n", fileName);
- return -1;
}
- close(tempfd);
-
- (void)freopen(fileName, "a", stdout);
- (void)freopen(fileName, "a", stderr);
- serverLogFD = fileno(stdout);
-
-
- return 0;
-#endif /* AFS_PTHREAD_ENV */
+ UNLOCK_SERVERLOG();
+ return serverLogFD < 0 ? -1 : 0;
}