/* * $Id: call_pipeline.c,v 1.21 2002/10/17 20:16:13 ljb Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include FILE *dfile; extern trace_t *default_trace; extern config_info_t ci; void call_pipeline (trace_t *tr, FILE *fin, char *web_origin_str, int null_notifications, int dump_stdout, int rps_dist_flag) { char outfn[256], outfn2[256], logfn[256], tlogfn[256]; int ret_code, ack_lock = -1, lock_fd = 0; long tlog_fpos = -1; char pid_string[20]; FILE *trans_fp = NULL; char *from_ip = NULL; struct sockaddr_in myaddr; /**** Code to get IP address of sender ****/ int sock_fd = fileno(fin); int sock_length = sizeof(myaddr); umask(0077); /* set umask for reading/writing files (there may be password info in them) */ if(!getpeername(sock_fd, (struct sockaddr *)&myaddr, &sock_length)) { trace(NORM, tr, "irr_submit connection from %s\n", inet_ntoa(myaddr.sin_addr)); from_ip = inet_ntoa(myaddr.sin_addr); } /**** end IP get code ****/ sprintf (pid_string, "PID%d\n", (int) getpid ()); /* open the transaction log */ if (ci.log_dir != NULL) { sprintf (logfn, "%s/trans.log", ci.log_dir); if ((ack_lock = lock_file (&lock_fd, logfn)) != 0) trace (ERROR, tr, "Error opening %s: %s\n", logfn, strerror(errno)); if ((trans_fp = fopen (logfn, "a")) != NULL) { fputs (TRANS_SEPERATOR, trans_fp); fputs (pid_string, trans_fp); /* support for the journal entry for RPS-DIST */ strcpy (tlogfn, logfn); tlog_fpos = ftell (trans_fp); } else trace (ERROR, tr, "Could not open transaction log: %s\n", logfn); } else trace (ERROR, tr, "No pipeline submission log directory configured!\n"); /* Decode PGP stuff, and add any auth cookies necessary. PGP needs to come first, because it's sensitive to any changes in the file. */ if (pgpdecodefile_new (fin, outfn, trans_fp, ci.pgp_dir, tr)) { trace (ERROR, tr, "Panic! Fatal error from pgpdecodefile PID (%s) ABORT!\n", pid_string); if (trans_fp != NULL) fclose (trans_fp); exit(0); } fclose (fin); if (trans_fp != NULL) fclose (trans_fp); if (ack_lock == 0) unlock_file (lock_fd); else if (lock_fd != 0) close (lock_fd); /* Open the ack log. We need to lock the next section as the DB is * queried and updated. */ if (ci.log_dir != NULL) { sprintf (logfn, "%s/ack.log", ci.log_dir); if ((ack_lock = lock_file (&lock_fd, logfn)) != 0) trace (ERROR, tr, "Error opening %s: %s\n", logfn, strerror(errno)); if ((trans_fp = fopen (logfn, "a")) != NULL) { fputs (TRANS_SEPERATOR, trans_fp); fputs (pid_string, trans_fp); } } /* check mail headers, adding cookies while removing the mail headers * from the stream; also preserve any PGP cookies already existing. * 'ret_code' is 0..n, ie, the number of non-null lines read. This way * we can detect empty submissions. */ if ((ret_code = addmailcookies(tr, dump_stdout, outfn, outfn2)) < 0) exit(0); unlink(outfn); if (ret_code > 0) { /* syntax checking: irr_check */ dfile = stderr; dfile = fopen ("/dev/null", "w"); if (callsyntaxchk (tr, outfn2, outfn, (char *) tmpfntmpl) < 0) { trace (ERROR, tr, "** FAILED IRRCHECK **, problem opening up files\n"); unlink (outfn2); exit(0); } unlink (outfn2); /* auth checking: irr_auth */ dfile = stdout; if (auth_check (tr, outfn, outfn2, ci.irrd_host, ci.irrd_port, ci.super_passwd) < 0) { trace (ERROR, tr, "** FAILED AUTHCHECK **, problem opening files\n"); unlink (outfn); exit(0); } unlink (outfn); } /* notification: irr_notify */ dfile = stderr; callnotify (tr, outfn2, ret_code, null_notifications, dump_stdout, web_origin_str, rps_dist_flag, ci.irrd_host, ci.irrd_port, ci.db_admin, ci.pgp_dir, ci.db_dir, tlogfn, tlog_fpos, trans_fp, from_ip); unlink (outfn2); if (trans_fp != NULL) fclose (trans_fp); /* See if we need to roll the logs */ if (ack_lock == 0) { log_roll ("%s/ack.log", ci.log_dir, 1); unlock_file (lock_fd); } /* lock file opened but a lock error occured; see lock_file () */ else if (ack_lock != 1) close (lock_fd); log_roll ("%s/trans.log", ci.log_dir, 0); }