1 /*****************************************************************************/
2 /* */
3 /* (C) Copyright 1997 Alberto Pasquale */
4 /* Portions (C) Copyright 1999 Per Lundberg */
5 /* */
6 /* A L L R I G H T S R E S E R V E D */
7 /* */
8 /*****************************************************************************/
9 /* */
10 /* How to contact the author: Alberto Pasquale of 2:332/504@fidonet */
11 /* Viale Verdi 106 */
12 /* 41100 Modena */
13 /* Italy */
14 /* */
15 /*****************************************************************************/
16
17 #include "apgenlib.hpp"
18 #include "apgenlb2.hpp"
19
LogFile()20 LogFile::LogFile ()
21 {
22 f = NULL;
23 fname[0] = '\0';
24 }
25
26
setup(pcsz fname,pcsz ID,pcsz logset,word flags)27 void LogFile::setup (pcsz fname, pcsz ID, pcsz logset, word flags)
28 {
29 close ();
30
31 if (fname)
32 strzcpy (LogFile::fname, fname, sizeof (LogFile::fname));
33
34 if (ID)
35 strzcpy (LogFile::ID, ID, sizeof (LogFile::ID));
36
37 if (logset)
38 strzcpy (LogFile::logset, logset, sizeof (LogFile::logset));
39
40 if (flags != LF_NoChange)
41 LogFile::flags = flags;
42 }
43
44
~LogFile()45 LogFile::~LogFile ()
46 {
47 if (f)
48 fclose (f);
49 }
50
51
close()52 int LogFile::close ()
53 {
54 int ret = 0;
55
56 if (f) {
57 ret = fclose (f);
58 f = NULL;
59 }
60
61 return ret;
62 }
63
64
flush()65 int LogFile::flush ()
66 {
67 int ret = 0;
68
69 if (f)
70 ret = fflush (f);
71
72 return ret;
73 }
74
75
open()76 int LogFile::open () // private
77 {
78 if (f)
79 return 0;
80
81 f = fopen (fname, "at");
82 if (!f)
83 return -1;
84
85 return 0;
86 }
87
88
va_write(psz date,pcsz strfmt,va_list args)89 int LogFile::va_write (psz date, pcsz strfmt, va_list args)
90 {
91 if (fname[0] == '\0')
92 return 0;
93
94 if (*strfmt == '\0')
95 return 0;
96
97 time_t timer;
98
99 if (!f)
100 if (open ())
101 return -1;
102
103 time (&timer);
104 strftime (date, LF_DateSize, "%d %b %H:%M:%S", localtime (&timer));
105
106 int err = 0;
107
108 err |= (fprintf (f, "%c %s %4s ", strfmt[0], date, ID) < 0);
109 err |= (vfprintf (f, strfmt+1, args) < 0);
110 err |= (fputc ('\n', f) == EOF);
111
112 if (flags & LF_CloseAfterWrite)
113 err |= close ();
114 else if (!(flags & LF_FlushOnRequest))
115 err |= flush ();
116
117 return err;
118 }
119
120
vwrite(pcsz strfmt,...)121 int LogFile::vwrite (pcsz strfmt, ...)
122 {
123 va_list args;
124 char date[LF_DateSize];
125
126 va_start (args, strfmt);
127 int ret = va_write (date, strfmt, args);
128 va_end (args);
129
130 return ret;
131 }
132
133
PrintStart(FILE * af,char prty,pcsz date)134 int LogFile::PrintStart (FILE *af, char prty, pcsz date) // private
135 {
136 int ret = 0;
137
138 if (flags & LF_PrintPrty)
139 ret |= (fprintf (af, "%c ", prty) < 0);
140
141 if (flags & LF_PrintDate)
142 ret |= (fprintf (af, "%.6s ", date) < 0);
143
144 if (flags & LF_PrintTime)
145 ret |= (fprintf (af, "%.8s ", date+7) < 0);
146
147 if (flags & LF_PrintID)
148 ret |= (fprintf (af, "%.4s ", ID) < 0);
149
150 return ret;
151 }
152
153
vwrite(FILE * af,pcsz strfmt,...)154 int LogFile::vwrite (FILE *af, pcsz strfmt, ...)
155 {
156 va_list args;
157 char date[LF_DateSize];
158
159 int ret = 0;
160
161 va_start (args, strfmt);
162 ret |= va_write (date, strfmt, args);
163 va_end (args);
164
165 if (af) {
166 ret |= PrintStart (af, strfmt[0], date);
167
168 va_start (args, strfmt);
169 ret |= (vfprintf (af, strfmt+1, args) < 0);
170 va_end (args);
171
172 ret |= (fputc ('\n', af) == EOF);
173 ret |= fflush (af);
174 }
175
176 return ret;
177 }
178