fprintf(out, "\n");
}
+static struct Lock audlock;
+static afs_int32 lock_init = 0;
+void
+osi_audit_init(void)
+{
+#ifdef AFS_PTHREAD_ENV
+ if ( !lock_init ) {
+ Lock_Init(&audlock);
+ lock_init = 1;
+ }
+#endif /* AFS_PTHREAD_ENV */
+}
+
/* ************************************************************************** */
/* The routine that acually does the audit call.
* ************************************************************************** */
#ifdef AFS_AIX32_ENV
afs_int32 code;
afs_int32 err;
+ static char BUFFER[32768];
#endif
int result;
-
va_list vaList;
-#ifdef AFS_AIX32_ENV
- static struct Lock audbuflock = { 0, 0, 0, 0,
+
#ifdef AFS_PTHREAD_ENV
- PTHREAD_MUTEX_INITIALIZER,
- PTHREAD_COND_INITIALIZER,
- PTHREAD_COND_INITIALIZER
+ /* This is not thread safe. Lock initialization should
+ * be done in a server initialization phase
+ */
+ if ( !lock_init )
+ osi_audit_init();
#endif /* AFS_PTHREAD_ENV */
- };
- static char BUFFER[32768];
-#endif
if ((osi_audit_all < 0) || (osi_echo_trail < 0))
osi_audit_check();
break;
}
+#ifdef AFS_PTHREAD_ENV
+ ObtainWriteLock(&audlock);
+#endif
#ifdef AFS_AIX32_ENV
- ObtainWriteLock(&audbuflock);
bufferPtr = BUFFER;
/* Put the error code into the buffer list */
printf("Error while writing audit entry: %d.\n", errno);
}
#endif /* notdef */
- ReleaseWriteLock(&audbuflock);
#else
if (auditout) {
va_start(vaList, errCode);
fflush(auditout);
}
#endif
+#ifdef AFS_PTHREAD_ENV
+ ReleaseWriteLock(&audlock);
+#endif
return 0;
}
int osi_audit(char *audEvent, afs_int32 errCode, ...);
int osi_auditU(struct rx_call *call, char *audEvent, int errCode, ...);
int osi_audit_file(FILE *out);
+void osi_audit_init(void);
+