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