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.6 $
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
38 /*
39
40 AK_add_to_ack: writes a message to the acknowledgement file.
41
42 */
43
44 void AK_add_to_ack(char * filename, char * fmt, ...){
/* [<][>][^][v][top][bottom][index][help] */
45
46 va_list ap; /* points to each unnamed arg in turn */
47 char *p, *sval;
48 int ival;
49 double dval;
50 FILE * ack_file;
51
52 if(( ack_file = fopen(filename, "a")) == NULL){
53 fprintf(stderr, "Can't open ack file, %s", filename);
54 }
55
56 va_start(ap, fmt);
57
58 for(p = fmt; *p; p++){
59 if (*p != '%') {
60 fprintf(ack_file, "%c", *p);
61 continue;
62 }
63 switch(*++p) {
64 case 'd':
65 ival = va_arg(ap, int);
66 fprintf(ack_file, "%d", ival);
67 break;
68 case 'f':
69 dval = va_arg(ap, double);
70 fprintf(ack_file, "%f", dval);
71 break;
72 case 's':
73 //for(sval = va_arg(ap, char *); *sval; sval++)
74 // putchar(*sval);
75 sval = va_arg(ap, char *);
76 fprintf(ack_file, "%s", sval);
77 break;
78 default:
79 putchar(*p);
80 break;
81 }
82 }
83
84 va_end(ap); /* clean up */
85 fclose(ack_file);
86 }
87
88 /* */
89 void AK_add_to_ack_string(const char * file_name, const string msg){
/* [<][>][^][v][top][bottom][index][help] */
90
91 ofstream ack_file(file_name, ios::app);
92
93 if(!ack_file){
94 cerr << "Couldn't open ack file" << endl;
95 return;
96 }
97 ack_file << msg;
98 ack_file.close();
99 }
100
101
102
103
104 /*
105
106 AK_ack_file_name_generate: Generates a unique name for temporary acknowledgement
107 files, and also creates it.
108
109 tmpdir: temporary directory (without a trailing '/')
110 prefix: prefix for the temp file
111
112 returns: the generated name.
113
114
115 */
116
117 char * AK_ack_file_name_generate( const char * tmpdir, const char * prefix){
/* [<][>][^][v][top][bottom][index][help] */
118
119 FILE * ack_file;
120 char * name;
121
122 /* allocate space for name. 32 should be enough for PID */
123 name = (char*)malloc(strlen(tmpdir) + strlen(prefix) + 32);
124
125 sprintf(name, "%s/%s.%i", tmpdir, prefix, getpid());
126
127 /* create the file */
128 if(( ack_file = fopen(name, "w")) == NULL){
129 fprintf(stderr, "Can't open ack file, %s", name);
130 }
131
132 /* close it */
133 fclose(ack_file);
134
135 return name;
136
137 }
138
139
140 /*
141
142 AK_send_ack: sends the ack message contained in the temp file.
143
144
145 */
146
147 void AK_send_ack( const char * filename, const char * to_address, const char * mailercommand){
/* [<][>][^][v][top][bottom][index][help] */
148
149 char * mail_command_line = NULL;
150
151
152 if(to_address != NULL){
153 mail_command_line = (char *)malloc(strlen(mailercommand) + strlen(filename) + 128);
154 sprintf(mail_command_line, "%s %s < %s", mailercommand, to_address, filename);
155 system(mail_command_line);
156 }
157
158
159 }
160
161
162 /*
163
164 AK_delete_ack: deletes the temporary acknowledgement file.
165
166 */
167
168 void AK_delete_ack( const char * filename ){
/* [<][>][^][v][top][bottom][index][help] */
169
170 unlink(filename);
171
172 }
173
174 /*
175
176 AK_log_ack: logs the acknowledgements in the log_file.
177
178 */
179
180 void AK_log_ack(const char * filename, const char * logfilename){
/* [<][>][^][v][top][bottom][index][help] */
181
182 FILE * ack_file, * log_file;
183 char * buf;
184 time_t cur_time;
185 char * time_str;
186
187 buf = (char *)malloc(1024);
188 if(( ack_file = fopen(filename, "r")) == NULL){
189 fprintf(stderr, "Can't open ack file, %s\n", filename);
190 return;
191 }
192
193 if(( log_file = fopen(logfilename, "a")) == NULL){
194 fprintf(stderr, "Can't open log file, %s\n", logfilename);
195 return;
196 }
197
198 /* get time */
199 cur_time = time(NULL);
200 time_str = strdup(ctime(&cur_time));
201 /* cut the '\n' at the end */
202 time_str[strlen(time_str) - 1] = '\0';
203
204 fprintf(log_file, ">>> time: %s ACK <<<\n\n", time_str);
205
206
207 while((buf=fgets(buf, 1023, ack_file)) > 0){
208 fprintf(log_file, "%s", buf);
209 }
210
211 free(time_str);
212 fclose(ack_file);
213 fclose(log_file);
214
215 }
216
217
218
219
220
221
222
223