AIX: Fix undefined symbols
[openafs.git] / src / audit / audit-file.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 #include <roken.h>
14
15 #include <afs/afsutil.h>
16
17 #include "audit-api.h"
18
19 struct file_context {
20     FILE *auditout;
21 };
22
23 static void
24 send_msg(void *rock, const char *message, int msglen, int truncated)
25 {
26     struct file_context *ctx = rock;
27
28     fwrite(message, 1, msglen, ctx->auditout);
29     fputc('\n', ctx->auditout);
30
31     fflush(ctx->auditout);
32 }
33
34 static int
35 open_file(void *rock, const char *fileName)
36 {
37     struct file_context *ctx = rock;
38     int tempfd, flags, r;
39     char *oldName;
40
41 #ifndef AFS_NT40_ENV
42     struct stat statbuf;
43
44     if ((lstat(fileName, &statbuf) == 0)
45         && (S_ISFIFO(statbuf.st_mode))) {
46         flags = O_WRONLY | O_NONBLOCK;
47     } else
48 #endif
49     {
50         r = asprintf(&oldName, "%s.old", fileName);
51         if (r < 0 || oldName == NULL) {
52             printf("Warning: Unable to create backup filename. Auditing ignored\n");
53             return 1;
54         }
55         rk_rename(fileName, oldName);
56         flags = O_WRONLY | O_TRUNC | O_CREAT;
57         free(oldName);
58     }
59     tempfd = open(fileName, flags, 0666);
60     if (tempfd > -1) {
61         ctx->auditout = fdopen(tempfd, "a");
62         if (!ctx->auditout) {
63             printf("Warning: fdopen failed for auditlog %s, ignored.\n", fileName);
64             return 1;
65         }
66     } else {
67         printf("Warning: auditlog %s not writable, ignored.\n", fileName);
68         return 1;
69     }
70     return 0;
71 }
72
73 static void
74 print_interface_stats(void *rock, FILE *out)
75 {
76     return;
77 }
78
79 static void *
80 create_interface(void)
81 {
82     struct file_context *ctx;
83     ctx = calloc(1, sizeof(*ctx));
84     if (!ctx) {
85         printf("error allocating memory\n");
86         return NULL;
87     }
88     return ctx;
89 }
90
91 static void
92 close_interface(void **rock)
93 {
94     struct file_context *ctx = *rock;
95     if (!ctx)
96         return;
97
98     if (ctx->auditout)
99         fclose(ctx->auditout);
100     free(ctx);
101     *rock = NULL;
102 }
103 const struct osi_audit_ops audit_file_ops = {
104     &send_msg,
105     &open_file,
106     &print_interface_stats,
107     &create_interface,
108     &close_interface,
109     NULL,    /* set_option */
110     NULL,    /* open_interface */
111 };