modules/ak/ack.cc
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- AK_add_to_ack
- AK_add_to_ack_string
- AK_ack_file_name_generate
- AK_send_ack
- AK_delete_ack
- AK_log_ack
1 /***************************************
2 $Revision: 1.8 $
3
4 AK (Acknowledgement) module
5
6 Status: NOT REVIEWED, NOT TESTED
7
8 Author(s): Engin Gunduz
9
10 ******************/ /******************
11 Modification History:
12 engin (10/06/2000) Created.
13 ******************/ /******************
14 Copyright (c) 2000 RIPE NCC
15
16 All Rights Reserved
17
18 Permission to use, copy, modify, and distribute this software and its
19 documentation for any purpose and without fee is hereby granted,
20 provided that the above copyright notice appear in all copies and that
21 both that copyright notice and this permission notice appear in
22 supporting documentation, and that the name of the author not be
23 used in advertising or publicity pertaining to distribution of the
24 software without specific, written prior permission.
25
26 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
27 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
28 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
29 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
30 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32 ***************************************/
33
34
35
36 #include "ack.h"
37 extern int supress_ack_notif;
38 extern char * humailbox;
39 extern char * defmail;
40
41
42 /*
43
44 AK_add_to_ack: writes a message to the acknowledgement file.
45
46 */
47
48 void AK_add_to_ack(char * filename, char * fmt, ...){
/* [<][>][^][v][top][bottom][index][help] */
49
50 va_list ap; /* points to each unnamed arg in turn */
51 char *p, *sval;
52 int ival;
53 double dval;
54 FILE * ack_file;
55
56 if(( ack_file = fopen(filename, "a")) == NULL){
57 fprintf(stderr, "Can't open ack file, %s", filename);
58 }
59
60 va_start(ap, fmt);
61
62 for(p = fmt; *p; p++){
63 if (*p != '%') {
64 fprintf(ack_file, "%c", *p);
65 continue;
66 }
67 switch(*++p) {
68 case 'd':
69 ival = va_arg(ap, int);
70 fprintf(ack_file, "%d", ival);
71 break;
72 case 'f':
73 dval = va_arg(ap, double);
74 fprintf(ack_file, "%f", dval);
75 break;
76 case 'X':
77 ival = va_arg(ap, int);
78 fprintf(ack_file, "%X", ival);
79 break;
80 case 'x':
81 ival = va_arg(ap, int);
82 fprintf(ack_file, "%x", ival);
83 break;
84 case 's':
85 //for(sval = va_arg(ap, char *); *sval; sval++)
86 // putchar(*sval);
87 sval = va_arg(ap, char *);
88 fprintf(ack_file, "%s", sval);
89 break;
90 default:
91 putchar(*p);
92 break;
93 }
94 }
95
96 va_end(ap); /* clean up */
97 fclose(ack_file);
98 }
99
100 /* */
101 void AK_add_to_ack_string(const char * file_name, const string msg){
/* [<][>][^][v][top][bottom][index][help] */
102
103 ofstream ack_file(file_name, ios::app);
104
105 if(!ack_file){
106 cerr << "Couldn't open ack file" << endl;
107 return;
108 }
109 ack_file << msg;
110 ack_file.close();
111 }
112
113
114
115
116 /*
117
118 AK_ack_file_name_generate: Generates a unique name for temporary acknowledgement
119 files, and also creates it.
120
121 tmpdir: temporary directory (without a trailing '/')
122 prefix: prefix for the temp file
123
124 returns: the generated name.
125
126
127 */
128
129 char * AK_ack_file_name_generate( const char * tmpdir, const char * prefix){
/* [<][>][^][v][top][bottom][index][help] */
130
131 FILE * ack_file;
132 char * name;
133
134 /* allocate space for name. 32 should be enough for PID */
135 name = (char*)malloc(strlen(tmpdir) + strlen(prefix) + 32);
136
137 sprintf(name, "%s/%s.%i", tmpdir, prefix, getpid());
138
139 /* create the file */
140 if(( ack_file = fopen(name, "w")) == NULL){
141 fprintf(stderr, "Can't open ack file, %s", name);
142 }
143
144 /* close it */
145 fclose(ack_file);
146
147 return name;
148
149 }
150
151
152 /*
153
154 AK_send_ack: sends the ack message contained in the temp file.
155
156
157 */
158
159 void AK_send_ack( const char * filename, const char * to_address, const char * mailercommand){
/* [<][>][^][v][top][bottom][index][help] */
160
161 char * mail_command_line = NULL;
162 char * supress_file = NULL;
163 FILE * ack_file, * supr_file_hdl;
164 char buf[1024];
165
166 /* if we are not supressing acks and notifs, send the ack */
167 if(!supress_ack_notif){
168 if(to_address != NULL){
169 mail_command_line = (char *)malloc(strlen(mailercommand) + strlen(to_address)
170 + strlen(filename) + 128);
171 sprintf(mail_command_line, "%s %s < %s", mailercommand, to_address, filename);
172 system(mail_command_line);
173 }
174 /* if we are supressing acks and notifs, send ack to DEFMAIL */
175 }else{
176 supress_file = (char *)malloc(strlen(filename) + strlen(".supress") + 2);
177 sprintf(supress_file, "%s.supress", filename);
178 if(( supr_file_hdl = fopen(supress_file, "w")) == NULL){
179 fprintf(stderr, "Can't open supress ack file, %s", supress_file);
180 }else{
181 fprintf(supr_file_hdl, "From: %s\nTo: %s\nSubject: Supressed ack mail\n\n",
182 humailbox, defmail);
183 if(( ack_file = fopen(filename, "r")) == NULL){
184 fprintf(stderr, "Can't open ack file for reading, %s", filename);
185 }else{
186 while(fgets(buf, 1024, ack_file) != NULL){
187 fprintf(supr_file_hdl, buf);
188 }
189 fclose(ack_file);
190 }
191 }
192 fclose(supr_file_hdl);
193 mail_command_line = (char *)malloc(strlen(mailercommand) + strlen(defmail)
194 + strlen(supress_file) + 128);
195 sprintf(mail_command_line, "%s %s < %s", mailercommand, defmail, supress_file);
196 system(mail_command_line);
197 unlink(supress_file);
198 free(supress_file);
199 }
200
201
202 }
203
204
205 /*
206
207 AK_delete_ack: deletes the temporary acknowledgement file.
208
209 */
210
211 void AK_delete_ack( const char * filename ){
/* [<][>][^][v][top][bottom][index][help] */
212
213 unlink(filename);
214
215 }
216
217 /*
218
219 AK_log_ack: logs the acknowledgements in the log_file.
220
221 */
222
223 void AK_log_ack(const char * filename, const char * logfilename){
/* [<][>][^][v][top][bottom][index][help] */
224
225 FILE * ack_file, * log_file;
226 char * buf;
227 time_t cur_time;
228 char * time_str;
229
230 buf = (char *)malloc(1024);
231 if(( ack_file = fopen(filename, "r")) == NULL){
232 fprintf(stderr, "Can't open ack file, %s\n", filename);
233 return;
234 }
235
236 if(( log_file = fopen(logfilename, "a")) == NULL){
237 fprintf(stderr, "Can't open log file, %s\n", logfilename);
238 return;
239 }
240
241 /* get time */
242 cur_time = time(NULL);
243 time_str = strdup(ctime(&cur_time));
244 /* cut the '\n' at the end */
245 time_str[strlen(time_str) - 1] = '\0';
246
247 fprintf(log_file, ">>> time: %s ACK <<<\n\n", time_str);
248
249
250 while((buf=fgets(buf, 1023, ack_file)) > 0){
251 fprintf(log_file, "%s", buf);
252 }
253
254 free(time_str);
255 fclose(ack_file);
256 fclose(log_file);
257
258 }
259
260
261
262
263
264
265
266