modules/nt/notification.cc

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. NT_ntfy_filename_generate
  2. NT_forwd_filename_generate
  3. NT_cross_filename_generate
  4. NT_crossntfy_filename_generate
  5. NT_add_to_ntfy_hash
  6. NT_add_to_frwd_hash
  7. NT_add_to_cross_hash
  8. NT_add_to_ntfy_hash_list
  9. NT_add_to_frwd_hash_list
  10. NT_add_to_cross_hash_list
  11. NT_add_to_ntfy
  12. NT_add_to_cross
  13. NT_add_to_ntfy_list
  14. NT_send_ntfy
  15. NT_log_ntfy
  16. NT_delete_ntfy
  17. nt_gfunc_send
  18. NT_send_ntfy_list
  19. nt_gfunc_log
  20. NT_log_ntfy_list
  21. nt_gfunc_delete
  22. NT_delete_ntfy_list
  23. NT_gather_ntfy_addresses
  24. NT_gather_frwd_addresses
  25. get_overlapping_routes_list
  26. NT_write_all_ntfs
  27. NT_write_all_frwds

   1 /***************************************
   2   $Revision: 1.11 $
   3 
   4   NT (Notifications) module
   5 
   6   Status: NOT REVIEWED, NOT TESTED
   7 
   8   Author(s):       Engin Gunduz
   9 
  10   ******************/ /******************
  11   Modification History:
  12         engin (06/07/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 
  37 
  38 
  39 #include "notification.h"
  40 extern int supress_ack_notif;
  41 extern char * defmail;
  42 
  43 /*  Generates a unique file name and returns the full path of the filename 
  44     for storing notification message.  Creates the file at the same time. 
  45     May use PID or time or both to ensure uniqueness.  */
  46       
  47 char * NT_ntfy_filename_generate( const char * tmpdir, const char * e_mail){
     /* [<][>][^][v][top][bottom][index][help] */
  48 
  49    FILE * ntfy_file;
  50    char * name;
  51      
  52    /* allocate space for name.  32 should be enough for PID */
  53    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("notify") +32 ); 
  54    
  55    sprintf(name, "%s/%s-%s.%i", tmpdir, "notify", e_mail, getpid());
  56 
  57    /* create the file */
  58    if(( ntfy_file = fopen(name, "w")) == NULL){
  59      fprintf(stderr, "Can't open notification file for creating, %s", name);
  60    }
  61 
  62    fprintf(ntfy_file, "To: %s\nFrom: %s\nSubject: Notification of RIPE Database changes\nReply-To: %s\n\n%s\n", e_mail, humailbox, humailbox, notitxt);
  63    if(reading_from_mail){
  64      fprintf(ntfy_file, "%s\n\n", notimailtxt);
  65    }
  66    /* close it */
  67    fclose(ntfy_file);
  68     
  69    return name;
  70       
  71 }
  72 
  73 
  74 
  75 
  76 
  77 /* Generates a unique file name and returns the full path of the filename 
  78    for storing forwarded message. Creates the file at the same time.  */ 
  79 char * NT_forwd_filename_generate( const char * tmpdir, const char * e_mail){
     /* [<][>][^][v][top][bottom][index][help] */
  80 
  81    FILE * forwd_file;
  82    char * name;
  83       
  84    /* allocate space for name.  32 should be enough for PID */
  85    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("forwd") +32 ); 
  86    
  87    sprintf(name, "%s/%s-%s.%i", tmpdir, "forwd", e_mail, getpid());
  88    //printf("DEBUG: NT_forwd_filename_generate: will generate %s\n", name);
  89    /* create the file */
  90    if(( forwd_file = fopen(name, "w")) == NULL){
  91      fprintf(stderr, "Can't open forward file, %s", name);
  92    }
  93 
  94    fprintf(forwd_file, "To: %s\nFrom: %s\nSubject:  Requested RIPE database object changes \nReply-To: %s\n\n%s\n", e_mail, humailbox, humailbox, fwtxt);
  95    if(reading_from_mail){
  96      fprintf(forwd_file, "\n%s\n", fwmailtxt);
  97    }
  98 
  99    /* close it */
 100    fclose(forwd_file);
 101     
 102    return name;
 103 
 104 }
 105 
 106 
 107 
 108 
 109 
 110 /* Generates a unique file name and returns the full path of the filename 
 111    for storing cross notification message. Creates the file at the same time.  */ 
 112 char * NT_cross_filename_generate( const char * tmpdir, const char * e_mail, int mode){
     /* [<][>][^][v][top][bottom][index][help] */
 113 
 114    FILE * cross_file;
 115    char * name;
 116       
 117    /* allocate space for name.  32 should be enough for PID */
 118    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("cross") +32 ); 
 119    
 120    sprintf(name, "%s/%s-%s.%i", tmpdir, "cross", e_mail, getpid());
 121    //printf("DEBUG: NT_cross_filename_generate: will generate %s\n", name);
 122    /* create the file */
 123    if(( cross_file = fopen(name, "w")) == NULL){
 124      fprintf(stderr, "Can't open cross notif file, %s", name);
 125    }
 126 
 127    //printf("DEBUG: NT_cross_filename_generate: e_mail=[%s], humailbox=[%s]\n", e_mail, humailbox);
 128    if(mode == ADDITION){
 129      fprintf(cross_file, "To: %s\nFrom: %s\n%s\nReply-To: %s\n\n", e_mail, humailbox, cno_subject_add, humailbox);
 130    }else{
 131      fprintf(cross_file, "To: %s\nFrom: %s\n%s\nReply-To: %s\n\n", e_mail, humailbox, cno_subject_del, humailbox);
 132    }
 133    
 134    /* close it */
 135    fclose(cross_file);
 136     
 137    return name;
 138 
 139 }
 140 
 141 
 142 
 143 
 144 
 145 
 146 
 147 /* Generates a unique file name and returns the full path of the filename for 
 148    storing notification message. Creates the file at the same time.  */
 149 char * NT_crossntfy_filename_generate( const char * tmpdir, const char * e_mail){
     /* [<][>][^][v][top][bottom][index][help] */
 150    FILE * cross_file;
 151    char * name;
 152       
 153    /* allocate space for name.  32 should be enough for PID */
 154    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("cross") +32 ); 
 155    
 156    sprintf(name, "%s/%s-%s.%i", tmpdir, "cross", e_mail, getpid());
 157 
 158    /* create the file */
 159    if(( cross_file = fopen(name, "w")) == NULL){
 160      fprintf(stderr, "Can't open cross file, %s", name);
 161    }
 162 
 163    /* close it */
 164    fclose(cross_file);
 165     
 166    return name;
 167 
 168 }
 169 
 170 
 171 
 172 
 173 
 174 /* Adds the e-mail to the notify hash, generating appropriate temp files */
 175 void NT_add_to_ntfy_hash(GHashTable * ntfy_hash, char * e_mail){
     /* [<][>][^][v][top][bottom][index][help] */
 176 
 177   if(g_hash_table_lookup(ntfy_hash ,e_mail) == NULL){/* there is no such entry, so create it */
 178     g_hash_table_insert(ntfy_hash, strdup(e_mail), NT_ntfy_filename_generate(tmpdir, e_mail));
 179   }
 180     
 181 }
 182 
 183 
 184 
 185 
 186 /* Adds the e-mail to the forw hash, generating appropriate temp files */
 187 void NT_add_to_frwd_hash(GHashTable * frwd_hash, char * e_mail){
     /* [<][>][^][v][top][bottom][index][help] */
 188 
 189   if(g_hash_table_lookup(frwd_hash ,e_mail) == NULL){/* there is no such entry, so create it */
 190     g_hash_table_insert(frwd_hash, strdup(e_mail), NT_forwd_filename_generate(tmpdir, e_mail));
 191   }
 192     
 193 }
 194 
 195 
 196 
 197 
 198 
 199 /* Adds the e-mail to the cross hash, generating appropriate temp files */
 200 void NT_add_to_cross_hash(GHashTable * cross_hash, const char * e_mail, int mode){
     /* [<][>][^][v][top][bottom][index][help] */
 201 
 202   if(g_hash_table_lookup(cross_hash ,e_mail) == NULL){/* there is no such entry, so create it */
 203     g_hash_table_insert(cross_hash, strdup(e_mail), NT_cross_filename_generate(tmpdir, e_mail, mode));
 204   }
 205     
 206 }
 207 
 208 
 209 
 210 
 211 
 212 /* Adds the e-mails in a linked list to the hash */
 213 void NT_add_to_ntfy_hash_list(GHashTable * ntfy_hash, GSList * e_mail_list){
     /* [<][>][^][v][top][bottom][index][help] */
 214 
 215    GSList * temp = NULL;
 216 
 217    for(temp = e_mail_list; temp != NULL; temp = g_slist_next(temp)){
 218      NT_add_to_ntfy_hash(ntfy_hash, (char *)temp->data);
 219    }
 220   
 221 }
 222 
 223 
 224 
 225 
 226 /* Adds the e-mails in a linked list to the hash */
 227 void NT_add_to_frwd_hash_list(GHashTable * frwd_hash, GSList * e_mail_list){
     /* [<][>][^][v][top][bottom][index][help] */
 228 
 229    GSList * temp = NULL;
 230 
 231    for(temp = e_mail_list; temp != NULL; temp = g_slist_next(temp)){
 232      NT_add_to_frwd_hash(frwd_hash, (char *)temp->data);
 233    }
 234   
 235 }
 236 
 237 
 238 
 239 /* Adds the e-mails in a linked list to the hash */
 240 void NT_add_to_cross_hash_list(GHashTable * cross_hash, GSList * e_mail_list, int mode){
     /* [<][>][^][v][top][bottom][index][help] */
 241 
 242    GSList * temp = NULL;
 243 
 244    for(temp = e_mail_list; temp != NULL; temp = g_slist_next(temp)){
 245      NT_add_to_cross_hash(cross_hash, (char *)temp->data, mode);
 246    }
 247   
 248 }
 249 
 250 
 251 
 252 
 253 
 254 
 255 /* Appends the argument strings to the file.  */
 256 void NT_add_to_ntfy( char * filename, char * fmt, ... ){
     /* [<][>][^][v][top][bottom][index][help] */
 257   va_list ap;  /* points to each unnamed arg in turn */
 258   FILE * ntfy_file;
 259  
 260   if(tracing){
 261     printf("TRACING: NT_add_to_ntfy\n"); 
 262   }
 263   if(( ntfy_file = fopen(filename, "a")) == NULL){
 264     fprintf(stderr, "Can't open notification file for writing, %s\n", filename);
 265     return;
 266   }
 267     
 268   va_start(ap, fmt);
 269   vfprintf(ntfy_file, fmt, ap);
 270 
 271   va_end(ap); /* clean up */
 272   fclose(ntfy_file);
 273 }
 274 
 275 
 276 
 277 /* Appends the argument strings to the file.  */
 278 void NT_add_to_cross(const char * e_mail, GHashTable * hash, char * fmt, ...){
     /* [<][>][^][v][top][bottom][index][help] */
 279   //va_list ap;  /* points to each unnamed arg in turn */
 280   //FILE * cross_file;
 281  
 282   //if(tracing){
 283   //  printf("TRACING: NT_add_to_cross\n"); 
 284   //}
 285   //if(( ack_file = fopen(filename, "a")) == NULL){
 286   //  fprintf(stderr, "Can't open cross notification file, %s\n", filename);
 287   //}
 288     
 289   //va_start(ap, fmt);
 290   //vfprintf(ack_file, fmt, ap);
 291 
 292   //va_end(ap); /* clean up */
 293   //fclose(ack_file);
 294 
 295   //printf("DEBUG: NT_add_to_cross: will now call NT_add_to_ntfy: e_mail=[%s], arg=[%s]\n", e_mail, arg);
 296   //NT_add_to_ntfy((char *)g_hash_table_lookup(hash, find_email_address(e_mail)), arg);
 297 
 298   va_list ap;  /* points to each unnamed arg in turn */
 299   FILE * cross_file;
 300   char * filename;
 301  
 302   if(g_hash_table_lookup(hash, find_email_address(e_mail)) != NULL){
 303     filename = (char *)g_hash_table_lookup(hash, find_email_address(e_mail));
 304   }else{
 305     fprintf(stderr, "Can't find a cross notification file for e-mail %s\n", e_mail);
 306     return;
 307   }
 308 
 309   if(( cross_file = fopen(filename, "a")) == NULL){
 310     fprintf(stderr, "Can't open cross notification file, %s\n", filename);
 311   }
 312   
 313  
 314    
 315   if(tracing){
 316     printf("TRACING: NT_add_to_cross\n"); 
 317   }
 318   if(( cross_file = fopen(filename, "a")) == NULL){
 319     fprintf(stderr, "Can't open cross notification file for writing, %s\n", filename);
 320   }
 321     
 322   va_start(ap, fmt);
 323   vfprintf(cross_file, fmt, ap);
 324 
 325   va_end(ap); /* clean up */
 326   fclose(cross_file);
 327   
 328 
 329 }
 330 
 331 
 332 
 333 
 334 
 335 /* Appends the argument string to the temp notif files in the list */
 336 void NT_add_to_ntfy_list(GSList * list, GHashTable * hash, char * arg){
     /* [<][>][^][v][top][bottom][index][help] */
 337   
 338   GSList * temp = NULL;
 339 
 340   for(temp = list; temp != NULL; temp = g_slist_next(temp)){
 341     NT_add_to_ntfy((char *)g_hash_table_lookup(hash, ((char *)temp->data)), arg);
 342   }
 343 }
 344 
 345 
 346 
 347 
 348 
 349 
 350 
 351 
 352 /* Sends the notification message which is stored in the temporary filefilename.  */
 353 void NT_send_ntfy( const char * filename, const char * to_address, const char * mailercommand){
     /* [<][>][^][v][top][bottom][index][help] */
 354 
 355     char * mail_command_line = NULL;
 356     char * supress_file = NULL;
 357     FILE * notif_file, * supr_file_hdl;
 358     char buf[1024];
 359 
 360 
 361     /* if we are not supressing acks and notifs, send the notif */
 362     if(!supress_ack_notif){
 363       if(to_address != NULL){
 364         mail_command_line = (char *)malloc(strlen(mailercommand) + strlen(filename) + 128);
 365         sprintf(mail_command_line, "%s %s < %s", mailercommand, to_address, filename);
 366         system(mail_command_line);
 367       }
 368     /* if we are supressing acks and notifs, send notif to DEFMAIL  */
 369     }else{
 370       supress_file = (char *)malloc(strlen(filename) + strlen(".supress") + 2); 
 371       sprintf(supress_file, "%s.supress", filename);
 372       if(( supr_file_hdl = fopen(supress_file, "w")) == NULL){
 373         fprintf(stderr, "Can't open supress notif file, %s", supress_file);
 374       }else{
 375         fprintf(supr_file_hdl, "From: %s\nTo: %s\nSubject: Supressed notif mail\n\n",
 376             humailbox, defmail);
 377         if(( notif_file = fopen(filename, "r")) == NULL){
 378           fprintf(stderr, "Can't open notif file for reading, %s", filename);
 379         }else{
 380           while(fgets(buf, 1024, notif_file) != NULL){
 381             fprintf(supr_file_hdl, buf);
 382           }
 383           fclose(notif_file);
 384         }
 385       }
 386       fclose(supr_file_hdl);
 387       mail_command_line = (char *)malloc(strlen(mailercommand) + strlen(defmail) 
 388             + strlen(supress_file) + 128);
 389       sprintf(mail_command_line, "%s %s < %s", mailercommand, defmail, supress_file);
 390       system(mail_command_line);
 391       unlink(supress_file);
 392       free(supress_file);
 393     }
 394 
 395 
 396 }
 397 
 398 
 399 
 400 /* Adds the notification message which is in the filename into log_file. */
 401 void NT_log_ntfy( const char * filename, const char * logfilename){
     /* [<][>][^][v][top][bottom][index][help] */
 402 
 403   FILE * notif_file, * log_file;
 404   char * buf;
 405   time_t cur_time;
 406   char * time_str;
 407 
 408   buf = (char *)malloc(1024);
 409   if(( notif_file = fopen(filename, "r")) == NULL){
 410     fprintf(stderr, "Can't open notification file for reading, [%s]\n", filename);
 411     return;
 412   }
 413 
 414   if(( log_file = fopen(logfilename, "a")) == NULL){
 415     fprintf(stderr, "Can't open log file, %s\n", logfilename);
 416     return;
 417   }
 418 
 419   /* get time */
 420   cur_time = time(NULL);
 421   time_str = strdup(ctime(&cur_time));
 422   /* cut the '\n' at the end */
 423   time_str[strlen(time_str) - 1] = '\0';
 424 
 425   fprintf(log_file, ">>> time: %s NOTIF <<<\n\n", time_str);
 426 
 427 
 428   while((buf=fgets(buf, 1023, notif_file)) > 0){
 429     fprintf(log_file, "%s", buf);
 430   }
 431 
 432   fclose(notif_file);
 433   fclose(log_file);
 434 
 435 }
 436 
 437 
 438 /* Deletes the temporary notification file. */ 
 439 void NT_delete_ntfy( const char * filename){
     /* [<][>][^][v][top][bottom][index][help] */
 440 
 441    unlink(filename);
 442    
 443 }
 444 
 445 
 446 /* The function required for NT_send_ntfy_list */
 447 void  nt_gfunc_send(gpointer key, gpointer value, gpointer user_data){
     /* [<][>][^][v][top][bottom][index][help] */
 448   NT_send_ntfy((char *)value, (char *)key, (char *)user_data);
 449 }
 450 
 451 
 452        
 453 /* Sends the notification messages whose temp files are stored in filehash. */              
 454 void NT_send_ntfy_list( GHashTable * filehash, char * mailercommand){
     /* [<][>][^][v][top][bottom][index][help] */
 455 
 456   g_hash_table_foreach( filehash, (GHFunc)nt_gfunc_send, mailercommand);
 457   
 458 }
 459 
 460 
 461 
 462 
 463 /* The function required for NT_log_ntfy_list */
 464 void  nt_gfunc_log(gpointer key, gpointer value, gpointer user_data){
     /* [<][>][^][v][top][bottom][index][help] */
 465   NT_log_ntfy((char *)value, (char *)user_data);
 466 }
 467 
 468 
 469 
 470 
 471 /* Logs the notification whose temp files are in filehash to log_file. */
 472 void NT_log_ntfy_list( GHashTable * filehash, char * log_file){
     /* [<][>][^][v][top][bottom][index][help] */
 473 
 474    g_hash_table_foreach( filehash, (GHFunc)nt_gfunc_log, log_file);
 475   
 476 }
 477 
 478 
 479 
 480 /* The function required for NT_delete_ntfy_list */
 481 void  nt_gfunc_delete(gpointer key, gpointer value, gpointer user_data){
     /* [<][>][^][v][top][bottom][index][help] */
 482   NT_delete_ntfy((char *)value);
 483 }
 484 
 485 
 486 
 487 /* Deletes the temporary notification messages in the filehash. Empties and frees 
 488    the hash too.  */
 489 void NT_delete_ntfy_list( GHashTable * filehash){
     /* [<][>][^][v][top][bottom][index][help] */
 490 
 491   g_hash_table_foreach(filehash, (GHFunc)nt_gfunc_delete, NULL);
 492   g_hash_table_destroy(filehash);
 493   
 494 }
 495 
 496 
 497 /* Gathers e-mail boxes to which we will send normal notification messages. It 
 498    takes old and new objects, looks up maintainers and less specific inetnums/domains/routes 
 499    when necessary, finds the addresses (in mnt-nfy and notify attributes) and returns 
 500    a list of them. */
 501 GSList * NT_gather_ntfy_addresses( char * old_object, char * new_object){
     /* [<][>][^][v][top][bottom][index][help] */
 502   GSList *temp = NULL;
 503   GSList * mntners = NULL; 
 504 
 505   if(old_object != NULL && new_object != NULL){/* it was an update */
 506     temp = get_attr_list(old_object, "notify");
 507     mntners = get_mntners(old_object);
 508     temp = g_slist_concat(temp, get_mntnfy_vector(mntners));
 509   }else if(old_object == NULL && new_object != NULL){/* it was a creation */
 510     temp = get_attr_list(new_object, "notify");
 511     mntners = get_mntners(new_object);
 512     temp = g_slist_concat(temp, get_mntnfy_vector(mntners));
 513   }else if(old_object != NULL && new_object == NULL){/* it was a deletion */
 514     temp = get_attr_list(old_object, "notify");
 515     mntners = get_mntners(old_object);
 516     temp = g_slist_concat(temp, get_mntnfy_vector(mntners));
 517   }
 518   return temp;
 519 }
 520 
 521 
 522 
 523 /* Gathers e-mail boxes to which we will forward messages (or rather, objects). It 
 524    an object, looks up maintainers, finds the addresses (in upd-to attributes) and returns 
 525    a list of them. */
 526 GSList * NT_gather_frwd_addresses(char * object){
     /* [<][>][^][v][top][bottom][index][help] */
 527   GSList *temp = NULL;
 528   GSList * mntners = NULL; 
 529 
 530   mntners = get_mntners(object);
 531   temp = get_updto_vector(mntners);
 532   return temp;
 533 }
 534 
 535 
 536 
 537 
 538 /* Accepts a route object as a "* char" and returns a list of overlapping routes */
 539 overlap_routes get_overlapping_routes_list(char * object){
     /* [<][>][^][v][top][bottom][index][help] */
 540 
 541   char * route_prefix = NULL;
 542   GSList * tmp_list;
 543   char * result;
 544   char * query_string;  
 545   overlap_routes result_routes; 
 546     
 547   result_routes.less_spec = NULL;
 548   result_routes.exact_match = NULL;
 549   result_routes.more_spec = NULL;
 550       
 551   tmp_list = get_attr_list(object, "route");  
 552 
 553   if(tmp_list != NULL && tmp_list->data != NULL){
 554     route_prefix = strdup((char *)(tmp_list->data));
 555   }else{
 556     return result_routes; /* then, this wasn't a route object */
 557   }
 558   
 559   /* get the less specific route objects */
 560   /* form the query string */
 561   query_string = (char *)malloc(strlen("-Troute -r -L ") + strlen(route_prefix) + 2);
 562   sprintf(query_string, "-Troute -r -L %s", route_prefix);
 563 
 564   /* get the results */ 
 565   result = send_and_get(query_host, query_port, query_string);
 566   free(query_string);
 567 
 568   /* and fill in the result field  */
 569   result_routes.less_spec = take_objects(result);
 570 
 571   /* get the exact match route objects */
 572   /* form the query string */
 573   query_string = (char *)malloc(strlen("-Troute -r -x ") + strlen(route_prefix) + 2);
 574   sprintf(query_string, "-Troute -r -x %s", route_prefix);
 575 
 576   /* get the results */ 
 577   result = send_and_get(query_host, query_port, query_string);
 578   free(query_string);
 579 
 580   /* and fill in the result field  */
 581   result_routes.exact_match = take_objects(result);
 582 
 583   /* get the more specific route objects */
 584   /* form the query string */
 585   query_string = (char *)malloc(strlen("-Troute -r -M ") + strlen(route_prefix) + 2);
 586   sprintf(query_string, "-Troute -r -M %s", route_prefix);
 587 
 588   /* get the results */ 
 589   result = send_and_get(query_host, query_port, query_string);
 590   free(query_string);
 591 
 592   /* and fill in the result field  */
 593   result_routes.more_spec = take_objects(result);
 594 
 595   /* Return the results */
 596   return result_routes;
 597   
 598 }
 599 
 600 
 601 
 602 
 603 
 604 /* Gets old and new versions of the object, and creates temporary notification
 605    files when necessary, and then writes appropriate strings into those
 606    temporary files. */
 607 void NT_write_all_ntfs(char * old_object, char * new_object, /*const char * notif_log,
     /* [<][>][^][v][top][bottom][index][help] */
 608                        const char * forw_log,    const char * cross_log,*/ const char * tempdir,
 609                        GHashTable * ntfy_hash,  GHashTable * forwd_hash, GHashTable * cross_hash, 
 610                        char * from_address){ 
 611 
 612    GSList * e_mail_list = NULL;
 613    //GSList * cross_route_list = NULL;
 614    GSList * temp = NULL;
 615    char * e_mail_address;
 616    overlap_routes overlapping_routes; 
 617     
 618    /* from_address may contain also the name, like "Johnny Bravo <johnny@inter.net>",
 619       so extract the e-mail address from it */
 620    e_mail_address = find_email_address(from_address); 
 621 
 622 
 623    if(tracing){
 624      printf("TRACING: NT_write_all_ntfs: from_address=[%s], e_mail_address=[%s]\n", from_address, e_mail_address);
 625    }
 626    if(old_object != NULL && new_object != NULL){/* it was an update */
 627      e_mail_list = NT_gather_ntfy_addresses(old_object, new_object);
 628      NT_add_to_ntfy_hash_list(ntfy_hash, e_mail_list); 
 629      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "---\nPREVIOUS OBJECT:\n\n");
 630      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, old_object);
 631      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n\nREPLACED BY:\n\n");
 632      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, new_object);
 633      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n");
 634    }else if(old_object == NULL && new_object != NULL){/* it was a creation */
 635      e_mail_list = NT_gather_ntfy_addresses(old_object, new_object);
 636      NT_add_to_ntfy_hash_list(ntfy_hash, e_mail_list); 
 637      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "---\nOBJECT BELOW CREATED:\n\n");
 638      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, new_object);
 639      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n");
 640      /* We'll deal with cross notifications only when we create or delete route objects */
 641      if(strcmp(get_class_type_char(new_object), "route") == 0){
 642        NT_add_to_cross_hash(cross_hash, e_mail_address, ADDITION); 
 643        overlapping_routes = get_overlapping_routes_list(new_object);
 644        if(overlapping_routes.less_spec != NULL || overlapping_routes.exact_match != NULL ||
 645           overlapping_routes.more_spec != NULL ){
 646          //printf("DEBUG: NT_write_all_ntfs: e_mail_address=[%s]\n", e_mail_address);
 647          NT_add_to_cross(e_mail_address, cross_hash, "%s\n\n%s\n\n%s\n\n", cno_explain_add, new_object, cno_overlap_add);
 648          if(overlapping_routes.less_spec != NULL){
 649            NT_add_to_cross(from_address, cross_hash, "LESS SPECIFIC MATCHES\n\n");
 650            for(temp = overlapping_routes.less_spec; temp != NULL; temp = g_slist_next(temp)){
 651              NT_add_to_cross(from_address, cross_hash, "%s\n\n", (char *)temp->data);
 652            }
 653          }
 654          if(overlapping_routes.exact_match != NULL){
 655            NT_add_to_cross(from_address, cross_hash, "EXACT MATCHES\n\n");
 656            for(temp = overlapping_routes.exact_match; temp != NULL; temp = g_slist_next(temp)){
 657              NT_add_to_cross(from_address, cross_hash, "%s\n\n", (char *)temp->data);
 658            }
 659          }
 660          if(overlapping_routes.more_spec != NULL){
 661            NT_add_to_cross(from_address, cross_hash, "MORE SPECIFIC MATCHES\n\n");
 662            for(temp = overlapping_routes.more_spec; temp != NULL; temp = g_slist_next(temp)){
 663              NT_add_to_cross(from_address, cross_hash, "%s\n\n", (char *)temp->data);
 664            }
 665          }
 666        }
 667      }
 668    }else if(old_object != NULL && new_object == NULL){/* it was a deletion */
 669      old_object = delete_delete_attrib(old_object);
 670      e_mail_list = NT_gather_ntfy_addresses(old_object, new_object);
 671      NT_add_to_ntfy_hash_list(ntfy_hash, e_mail_list); 
 672      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "---\nOBJECT BELOW DELETED:\n\n");
 673      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, old_object);
 674      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n");
 675      /* We'll deal with cross notifications only when we create or delete route objects */
 676      if(strcmp(get_class_type_char(old_object), "route") == 0){
 677        NT_add_to_cross_hash(cross_hash, e_mail_address, DELETION); 
 678        overlapping_routes = get_overlapping_routes_list(old_object);
 679        if(overlapping_routes.less_spec != NULL || overlapping_routes.exact_match != NULL ||
 680           overlapping_routes.more_spec != NULL ){
 681          //printf("DEBUG: NT_write_all_ntfs: e_mail_address=[%s]\n", e_mail_address);
 682          NT_add_to_cross(e_mail_address, cross_hash, "%s\n\n%s\n\n%s\n\n", cno_explain_del, old_object, cno_overlap_del);
 683          if(overlapping_routes.less_spec != NULL){
 684            NT_add_to_cross(from_address, cross_hash, "LESS SPECIFIC MATCHES\n\n");
 685            for(temp = overlapping_routes.less_spec; temp != NULL; temp = g_slist_next(temp)){
 686              NT_add_to_cross(from_address, cross_hash, "%s\n\n", (char *)temp->data);
 687            }
 688          }
 689          if(overlapping_routes.exact_match != NULL){
 690            NT_add_to_cross(from_address, cross_hash, "EXACT MATCHES\n\n");
 691            for(temp = overlapping_routes.exact_match; temp != NULL; temp = g_slist_next(temp)){
 692              NT_add_to_cross(from_address, cross_hash, "%s\n\n", (char *)temp->data);
 693            }
 694          }
 695          if(overlapping_routes.more_spec != NULL){
 696            NT_add_to_cross(from_address, cross_hash, "MORE SPECIFIC MATCHES\n\n");
 697            for(temp = overlapping_routes.more_spec; temp != NULL; temp = g_slist_next(temp)){
 698              NT_add_to_cross(from_address, cross_hash, "%s\n\n", (char *)temp->data);
 699            }
 700          }
 701        }
 702      }
 703    }
 704 }
 705 
 706 
 707 
 708 
 709 
 710 /* Gets old and new versions of the object, and creates temporary notification
 711    files when necessary, and then writes appropriate strings into those
 712    temporary files. */
 713 void NT_write_all_frwds(char * old_object, char * new_object, /*const char * notif_log,
     /* [<][>][^][v][top][bottom][index][help] */
 714                        const char * forw_log,    const char * cross_log,*/ const char * tempdir,
 715                        GHashTable * ntfy_hash,  GHashTable * forwd_hash, GHashTable * cross_hash, 
 716                        const char * from_address){ 
 717 
 718    GSList * e_mail_list = NULL;
 719 
 720 
 721    if(tracing){
 722      printf("TRACING: NT_write_all_frwds\n");
 723    }
 724    if(old_object != NULL && new_object != NULL){/* it was an update */
 725      e_mail_list = NT_gather_frwd_addresses(old_object);
 726      NT_add_to_frwd_hash_list(forwd_hash, e_mail_list);
 727      NT_add_to_ntfy_list(e_mail_list, forwd_hash, "----\nUPDATE REQUESTED FOR:\n\n");
 728      //NT_add_to_ntfy_list(e_mail_list, forwd_hash, old_object);
 729      //NT_add_to_ntfy_list(e_mail_list, forwd_hash, "\n\n");
 730      NT_add_to_ntfy_list(e_mail_list, forwd_hash, new_object);
 731    }else if(old_object == NULL && new_object != NULL){/* it was a creation */
 732      e_mail_list = NT_gather_frwd_addresses(new_object);
 733      NT_add_to_frwd_hash_list(forwd_hash, e_mail_list);
 734      NT_add_to_ntfy_list(e_mail_list, forwd_hash, "----\nADDITION REQUESTED FOR:\n\n");
 735      NT_add_to_ntfy_list(e_mail_list, forwd_hash, new_object);
 736    }else if(old_object != NULL && new_object == NULL){/* it was a deletion */
 737      e_mail_list = NT_gather_frwd_addresses(old_object);
 738      NT_add_to_frwd_hash_list(forwd_hash, e_mail_list);
 739      NT_add_to_ntfy_list(e_mail_list, forwd_hash, "----\nDELETION REQUESTED FOR:\n\n");
 740      NT_add_to_ntfy_list(e_mail_list, forwd_hash, old_object);
 741    }
 742 }
 743 

/* [<][>][^][v][top][bottom][index][help] */