Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / eventlog / logevent.c
1 /* Copyright (C) 1998 Transarc Corporation - All rights reserved.
2  */
3
4 #include <afs/param.h>
5 #include <afs/stds.h>
6
7 #include <windows.h>
8 #include <stddef.h>
9 #include <stdarg.h>
10 #include <WINNT/afsreg.h>
11
12 #include "logevent.h"
13
14 /* AFS NT alternative event logging functions.
15  *
16  * All event logging functions take a variable number of arguments,
17  * with the trailing (variable) arguments being a set of message text
18  * insertion strings terminated by a 0 (NULL) argument.
19  * Status values are logged as raw data if the status is not zero.
20  *
21  * All functions return 0 if message is logged successfully and -1 otherwise.
22  *
23  * Example: ReportErrorEventAlt(eventId, status, filenameString, 0);
24  */
25
26 static int
27 ReportEventAlt(WORD eventType,
28                DWORD eventId,
29                WORD insertStrCount,
30                char **insertStr,
31                int status)
32 {
33     HANDLE eventLog = NULL;
34     BOOL result;
35
36     /* open write handle to the event log */
37     eventLog = RegisterEventSource(NULL /* local machine */,
38                                    AFSREG_SVR_APPLOG_SUBKEY);
39     if (eventLog == NULL) {
40         return -1;
41     }
42
43     /* log the event */
44     result = ReportEvent(eventLog, eventType, 0 /* category */, eventId,
45                          NULL /* SID */,
46                          insertStrCount, (status ? sizeof(status) : 0),
47                          insertStr, &status);
48
49     (void) DeregisterEventSource(eventLog);
50
51     return (result ? 0 : -1);
52 }
53
54
55 int
56 ReportErrorEventAlt(unsigned int eventId, int status, char *str, ...)
57 {
58     va_list strArgs;
59     char *iStrings[AFSEVT_MAXARGS];
60     int i;
61
62     /* construct iStrings (insertion strings) array */
63     va_start(strArgs, str);
64     for (i = 0; str && (i < AFSEVT_MAXARGS); i++) {
65         iStrings[i] = str;
66         str = va_arg(strArgs, char *);
67     }
68     va_end(strArgs);
69
70     if (str) {
71         /* too many args */
72         return -1;
73     }
74
75     /* report error event */
76     return ReportEventAlt(EVENTLOG_ERROR_TYPE,
77                           (DWORD) eventId, (WORD) i, iStrings, status);
78 }
79
80
81 int
82 ReportWarningEventAlt(unsigned int eventId, int status, char *str, ...)
83 {
84     va_list strArgs;
85     char *iStrings[AFSEVT_MAXARGS];
86     int i;
87
88     /* construct iStrings (insertion strings) array */
89     va_start(strArgs, str);
90     for(i = 0; str && (i < AFSEVT_MAXARGS); i++) {
91         iStrings[i] = str;
92         str = va_arg(strArgs, char *);
93     }
94     va_end(strArgs);
95
96     if (str) {
97         /* too many args */
98         return -1;
99     }
100
101     /* report warning event */
102     return ReportEventAlt(EVENTLOG_WARNING_TYPE,
103                           (DWORD) eventId, (WORD) i, iStrings, status);
104 }
105
106
107 int
108 ReportInformationEventAlt(unsigned int eventId, char *str, ...)
109 {
110     va_list strArgs;
111     char *iStrings[AFSEVT_MAXARGS];
112     int i;
113
114     /* construct iStrings (insertion strings) array */
115     va_start(strArgs, str);
116     for(i = 0; str && (i < AFSEVT_MAXARGS); i++) {
117         iStrings[i] = str;
118         str = va_arg(strArgs, char *);
119     }
120     va_end(strArgs);
121
122     if (str) {
123         /* too many args */
124         return -1;
125     }
126
127     /* report information event */
128     return ReportEventAlt(EVENTLOG_INFORMATION_TYPE,
129                           (DWORD) eventId, (WORD) i, iStrings, 0);
130 }