Return-Path: Delivered-To: apmail-httpd-cvs-archive@httpd.apache.org Received: (qmail 43394 invoked by uid 500); 12 Dec 2002 16:09:53 -0000 Mailing-List: contact cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list cvs@httpd.apache.org Received: (qmail 43380 invoked by uid 500); 12 Dec 2002 16:09:53 -0000 Delivered-To: apmail-apache-1.3-cvs@apache.org Date: 12 Dec 2002 16:09:53 -0000 Message-ID: <20021212160953.85129.qmail@icarus.apache.org> From: jim@apache.org To: apache-1.3-cvs@apache.org Subject: cvs commit: apache-1.3/src/os/netware mod_log_nw.c X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N jim 2002/12/12 08:09:52 Modified: src CHANGES src/include ap_alloc.h ap_mmn.h src/main alloc.c http_main.c rfc1413.c src/modules/proxy proxy_connect.c proxy_ftp.c proxy_http.c src/modules/standard mod_log_agent.c mod_log_config.c mod_log_referer.c mod_rewrite.c src/os/netware mod_log_nw.c Log: Where the OS allows, we now proactively use the various _ex and magic cleanups to close fds (lock files, log files and sockets) to prevent them from leaking into 3rd party modules that don't call ap_cleanup_for_exec() before forking off subprocesses. Expect some possible fine-tuning. Revision Changes Path 1.1867 +9 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1866 retrieving revision 1.1867 diff -u -r1.1866 -r1.1867 --- CHANGES 9 Dec 2002 20:21:00 -0000 1.1866 +++ CHANGES 12 Dec 2002 16:09:49 -0000 1.1867 @@ -1,5 +1,14 @@ Changes with Apache 1.3.28 + *) Certain 3rd party modules would bypass the Apache API and not + invoke ap_cleanup_for_exec() before creating sub-processes. + To such a child process, Apache's file descriptors (lock + fd's, log files, sockets) were accessible, allowing them + direct access to Apache log file etc. Where the OS allows, + we now add proactive close functions to prevent these file + descriptors from leaking to the child processes. + [Jim Jagielski, Martin Kraemer] + *) Prevent obscenely large values of precision in ap_vformatter from clobbering a buffer. [Sander Striker, Jim Jagielski] 1.81 +3 -0 apache-1.3/src/include/ap_alloc.h Index: ap_alloc.h =================================================================== RCS file: /home/cvs/apache-1.3/src/include/ap_alloc.h,v retrieving revision 1.80 retrieving revision 1.81 diff -u -r1.80 -r1.81 --- ap_alloc.h 8 Dec 2002 19:09:55 -0000 1.80 +++ ap_alloc.h 12 Dec 2002 16:09:50 -0000 1.81 @@ -337,6 +337,8 @@ API_EXPORT(FILE *) ap_pfopen(struct pool *, const char *name, const char *fmode); API_EXPORT(FILE *) ap_pfdopen(struct pool *, int fd, const char *fmode); API_EXPORT(int) ap_popenf(struct pool *, const char *name, int flg, int mode); +API_EXPORT(int) ap_popenf_ex(struct pool *, const char *name, int flg, + int mode, int domagic); API_EXPORT(void) ap_note_cleanups_for_file(pool *, FILE *); API_EXPORT(void) ap_note_cleanups_for_file_ex(pool *, FILE *, int); @@ -351,6 +353,7 @@ API_EXPORT(void) ap_note_cleanups_for_socket_ex(pool *, int, int); API_EXPORT(void) ap_kill_cleanups_for_socket(pool *p, int sock); API_EXPORT(int) ap_psocket(pool *p, int, int, int); +API_EXPORT(int) ap_psocket_ex(pool *p, int, int, int, int); API_EXPORT(int) ap_pclosesocket(pool *a, int sock); API_EXPORT(regex_t *) ap_pregcomp(pool *p, const char *pattern, int cflags); 1.62 +3 -2 apache-1.3/src/include/ap_mmn.h Index: ap_mmn.h =================================================================== RCS file: /home/cvs/apache-1.3/src/include/ap_mmn.h,v retrieving revision 1.61 retrieving revision 1.62 diff -u -r1.61 -r1.62 --- ap_mmn.h 8 Dec 2002 19:09:55 -0000 1.61 +++ ap_mmn.h 12 Dec 2002 16:09:50 -0000 1.62 @@ -239,8 +239,9 @@ * 19990320.13 - add ap_strtol() * 19990320.14 - add ap_register_cleanup_ex(), * ap_note_cleanups_for_fd_ex(), - * ap_note_cleanups_for_socket_ex() and - * ap_note_cleanups_for_file_ex() + * ap_note_cleanups_for_socket_ex(), + * ap_note_cleanups_for_file_ex(), + * ap_popenf_ex() and ap_psocket_ex(). */ #define MODULE_MAGIC_COOKIE 0x41503133UL /* "AP13" */ 1.135 +29 -12 apache-1.3/src/main/alloc.c Index: alloc.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v retrieving revision 1.134 retrieving revision 1.135 diff -u -r1.134 -r1.135 --- alloc.c 11 Dec 2002 12:24:27 -0000 1.134 +++ alloc.c 12 Dec 2002 16:09:50 -0000 1.135 @@ -1687,14 +1687,19 @@ void (*child_cleanup) (void *), int (*magic_cleanup) (void *)) { - struct cleanup *c = (struct cleanup *) ap_palloc(p, sizeof(struct cleanup)); - c->data = data; - c->plain_cleanup = plain_cleanup; - c->child_cleanup = child_cleanup; - c->next = p->cleanups; - p->cleanups = c; - if(magic_cleanup) { - if(!magic_cleanup(data)) + struct cleanup *c; + if (p) { + c = (struct cleanup *) ap_palloc(p, sizeof(struct cleanup)); + c->data = data; + c->plain_cleanup = plain_cleanup; + c->child_cleanup = child_cleanup; + c->next = p->cleanups; + p->cleanups = c; + } + /* attempt to do magic even if not passed a pool. Allows us + * to perform the magic, therefore, "whenever" we want/need */ + if (magic_cleanup) { + if (!magic_cleanup(data)) ap_log_error(APLOG_MARK, APLOG_WARNING, NULL, "exec() may not be safe"); } @@ -1827,7 +1832,8 @@ ap_kill_cleanup(p, (void *) (long) fd, fd_cleanup); } -API_EXPORT(int) ap_popenf(pool *a, const char *name, int flg, int mode) +API_EXPORT(int) ap_popenf_ex(pool *a, const char *name, int flg, int mode, + int domagic) { int fd; int save_errno; @@ -1837,13 +1843,18 @@ save_errno = errno; if (fd >= 0) { fd = ap_slack(fd, AP_SLACK_HIGH); - ap_note_cleanups_for_fd(a, fd); + ap_note_cleanups_for_fd_ex(a, fd, domagic); } ap_unblock_alarms(); errno = save_errno; return fd; } +API_EXPORT(int) ap_popenf(pool *a, const char *name, int flg, int mode) +{ + return ap_popenf_ex(a, name, flg, mode, 0); +} + API_EXPORT(int) ap_pclosef(pool *a, int fd) { int res; @@ -2047,7 +2058,8 @@ ap_kill_cleanup(p, (void *) (long) sock, socket_cleanup); } -API_EXPORT(int) ap_psocket(pool *p, int domain, int type, int protocol) +API_EXPORT(int) ap_psocket_ex(pool *p, int domain, int type, int protocol, + int domagic) { int fd; @@ -2059,9 +2071,14 @@ errno = save_errno; return -1; } - ap_note_cleanups_for_socket(p, fd); + ap_note_cleanups_for_socket_ex(p, fd, domagic); ap_unblock_alarms(); return fd; +} + +API_EXPORT(int) ap_psocket(pool *p, int domain, int type, int protocol) +{ + return ap_psocket_ex(p, domain, type, protocol, 0); } API_EXPORT(int) ap_pclosesocket(pool *a, int sock) 1.597 +14 -14 apache-1.3/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v retrieving revision 1.596 retrieving revision 1.597 diff -u -r1.596 -r1.597 --- http_main.c 25 Oct 2002 21:12:23 -0000 1.596 +++ http_main.c 12 Dec 2002 16:09:50 -0000 1.597 @@ -876,7 +876,7 @@ unlock_it.l_pid = 0; /* pid not actually interesting */ expand_lock_fname(p); - lock_fd = ap_popenf(p, ap_lock_fname, O_CREAT | O_WRONLY | O_EXCL, 0644); + lock_fd = ap_popenf_ex(p, ap_lock_fname, O_CREAT | O_WRONLY | O_EXCL, 0644, 1); if (lock_fd == -1) { perror("open"); fprintf(stderr, "Cannot open lock file: %s\n", ap_lock_fname); @@ -943,7 +943,7 @@ static void accept_mutex_child_init_flock(pool *p) { - flock_fd = ap_popenf(p, ap_lock_fname, O_WRONLY, 0600); + flock_fd = ap_popenf_ex(p, ap_lock_fname, O_WRONLY, 0600, 1); if (flock_fd == -1) { ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf, "Child cannot open lock file: %s", ap_lock_fname); @@ -959,7 +959,7 @@ { expand_lock_fname(p); unlink(ap_lock_fname); - flock_fd = ap_popenf(p, ap_lock_fname, O_CREAT | O_WRONLY | O_EXCL, 0600); + flock_fd = ap_popenf_ex(p, ap_lock_fname, O_CREAT | O_WRONLY | O_EXCL, 0600, 1); if (flock_fd == -1) { ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf, "Parent cannot open lock file: %s", ap_lock_fname); @@ -2457,7 +2457,7 @@ #ifdef TPF ap_scoreboard_fname = ap_server_root_relative(p, ap_scoreboard_fname); #endif /* TPF */ - scoreboard_fd = ap_popenf(p, ap_scoreboard_fname, O_CREAT | O_BINARY | O_RDWR, 0666); + scoreboard_fd = ap_popenf_ex(p, ap_scoreboard_fname, O_CREAT | O_BINARY | O_RDWR, 0666, 1); if (scoreboard_fd == -1) { perror(ap_scoreboard_fname); fprintf(stderr, "Cannot open scoreboard file:\n"); @@ -2483,7 +2483,7 @@ ap_scoreboard_image = &_scoreboard_image; ap_scoreboard_fname = ap_server_root_relative(p, ap_scoreboard_fname); - scoreboard_fd = ap_popenf(p, ap_scoreboard_fname, O_CREAT | O_BINARY | O_RDWR, 0644); + scoreboard_fd = ap_popenf_ex(p, ap_scoreboard_fname, O_CREAT | O_BINARY | O_RDWR, 0644, 1); if (scoreboard_fd == -1) { perror(ap_scoreboard_fname); fprintf(stderr, "Cannot open scoreboard file:\n"); @@ -3655,7 +3655,7 @@ s = ap_slack(s, AP_SLACK_HIGH); #endif - ap_note_cleanups_for_socket(p, s); /* arrange to close on exec or restart */ + ap_note_cleanups_for_socket_ex(p, s, 1); /* arrange to close on exec or restart */ #ifdef TPF os_note_additional_cleanups(p, s); #endif /* TPF */ @@ -3796,7 +3796,7 @@ #ifdef WORKAROUND_SOLARIS_BUG s = ap_slack(s, AP_SLACK_HIGH); - ap_note_cleanups_for_socket(p, s); /* arrange to close on exec or restart */ + ap_note_cleanups_for_socket_ex(p, s, 1); /* arrange to close on exec or restart */ #endif ap_unblock_alarms(); @@ -3903,7 +3903,7 @@ fd = make_sock(p, &lr->local_addr); } else { - ap_note_cleanups_for_socket(p, fd); + ap_note_cleanups_for_socket_ex(p, fd, 1); } /* if we get here, (fd >= 0) && (fd < FD_SETSIZE) */ FD_SET(fd, &listenfds); @@ -4517,7 +4517,7 @@ */ signal(SIGUSR1, SIG_IGN); - ap_note_cleanups_for_socket(ptrans, csd); + ap_note_cleanups_for_socket_ex(ptrans, csd, 1); /* protect various fd_sets */ #ifdef CHECK_FD_SETSIZE @@ -4565,7 +4565,7 @@ "dup: couldn't duplicate csd"); dupped_csd = csd; /* Oh well... */ } - ap_note_cleanups_for_socket(ptrans, dupped_csd); + ap_note_cleanups_for_socket_ex(ptrans, dupped_csd, 1); /* protect various fd_sets */ #ifdef CHECK_FD_SETSIZE @@ -5092,7 +5092,7 @@ #ifdef SCOREBOARD_FILE else { ap_scoreboard_fname = ap_server_root_relative(pconf, ap_scoreboard_fname); - ap_note_cleanups_for_fd(pconf, scoreboard_fd); + ap_note_cleanups_for_fd_ex(pconf, scoreboard_fd, 1); /* close on exec */ } #endif @@ -5892,7 +5892,7 @@ requests_this_child++; - ap_note_cleanups_for_socket(ptrans, csd); + ap_note_cleanups_for_socket_ex(ptrans, csd, 1); /* * We now have a connection, so set it up with the appropriate @@ -5924,7 +5924,7 @@ "dup: couldn't duplicate csd"); dupped_csd = csd; /* Oh well... */ } - ap_note_cleanups_for_socket(ptrans, dupped_csd); + ap_note_cleanups_for_socket_ex(ptrans, dupped_csd, 1); #endif ap_bpushfd(conn_io, csd, dupped_csd); @@ -6140,7 +6140,7 @@ if (fd > listenmaxfd) listenmaxfd = fd; } - ap_note_cleanups_for_socket(p, fd); + ap_note_cleanups_for_socket_ex(p, fd, 1); lr->fd = fd; if (lr->next == NULL) { /* turn the list into a ring */ 1.40 +1 -1 apache-1.3/src/main/rfc1413.c Index: rfc1413.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/rfc1413.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- rfc1413.c 13 Mar 2002 21:05:31 -0000 1.39 +++ rfc1413.c 12 Dec 2002 16:09:51 -0000 1.40 @@ -243,7 +243,7 @@ result = FROM_UNKNOWN; - sock = ap_psocket(conn->pool, AF_INET, SOCK_STREAM, IPPROTO_TCP); + sock = ap_psocket_ex(conn->pool, AF_INET, SOCK_STREAM, IPPROTO_TCP, 1); if (sock < 0) { ap_log_error(APLOG_MARK, APLOG_CRIT, srv, "socket: rfc1413: error creating socket"); 1.50 +1 -1 apache-1.3/src/modules/proxy/proxy_connect.c Index: proxy_connect.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_connect.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- proxy_connect.c 25 Mar 2002 09:21:58 -0000 1.49 +++ proxy_connect.c 12 Dec 2002 16:09:51 -0000 1.50 @@ -182,7 +182,7 @@ return ap_proxyerror(r, proxyhost ? HTTP_BAD_GATEWAY : HTTP_INTERNAL_SERVER_ERROR, err); - sock = ap_psocket(r->pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); + sock = ap_psocket_ex(r->pool, PF_INET, SOCK_STREAM, IPPROTO_TCP, 1); if (sock == -1) { ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "proxy: error creating socket"); return HTTP_INTERNAL_SERVER_ERROR; 1.99 +3 -3 apache-1.3/src/modules/proxy/proxy_ftp.c Index: proxy_ftp.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_ftp.c,v retrieving revision 1.98 retrieving revision 1.99 diff -u -r1.98 -r1.99 --- proxy_ftp.c 7 Apr 2002 18:57:36 -0000 1.98 +++ proxy_ftp.c 12 Dec 2002 16:09:51 -0000 1.99 @@ -665,7 +665,7 @@ if (err != NULL) return ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR, err); - sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP); + sock = ap_psocket_ex(p, PF_INET, SOCK_STREAM, IPPROTO_TCP, 1); if (sock == -1) { ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "proxy: error creating socket"); @@ -944,7 +944,7 @@ } /* try to set up PASV data connection first */ - dsock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP); + dsock = ap_psocket_ex(p, PF_INET, SOCK_STREAM, IPPROTO_TCP, 1); if (dsock == -1) { return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR, @@ -1032,7 +1032,7 @@ "proxy: error getting socket address")); } - dsock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP); + dsock = ap_psocket_ex(p, PF_INET, SOCK_STREAM, IPPROTO_TCP, 1); if (dsock == -1) { return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR, 1.102 +1 -1 apache-1.3/src/modules/proxy/proxy_http.c Index: proxy_http.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_http.c,v retrieving revision 1.101 retrieving revision 1.102 diff -u -r1.101 -r1.102 --- proxy_http.c 3 Sep 2002 07:12:46 -0000 1.101 +++ proxy_http.c 12 Dec 2002 16:09:51 -0000 1.102 @@ -241,7 +241,7 @@ * we have worked out who exactly we are going to connect to, now make * that connection... */ - sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP); + sock = ap_psocket_ex(p, PF_INET, SOCK_STREAM, IPPROTO_TCP, 1); if (sock == -1) { ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "proxy: error creating socket"); 1.37 +2 -1 apache-1.3/src/modules/standard/mod_log_agent.c Index: mod_log_agent.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_log_agent.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- mod_log_agent.c 13 Mar 2002 21:05:33 -0000 1.36 +++ mod_log_agent.c 12 Dec 2002 16:09:52 -0000 1.37 @@ -125,7 +125,8 @@ cls->agent_fd = ap_piped_log_write_fd(pl); } else if (*cls->fname != '\0') { - if ((cls->agent_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) { + if ((cls->agent_fd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1)) + < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "could not open agent log file %s.", fname); exit(1); 1.89 +2 -1 apache-1.3/src/modules/standard/mod_log_config.c Index: mod_log_config.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_log_config.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -r1.88 -r1.89 --- mod_log_config.c 21 May 2002 13:03:56 -0000 1.88 +++ mod_log_config.c 12 Dec 2002 16:09:52 -0000 1.89 @@ -1069,7 +1069,8 @@ } else { char *fname = ap_server_root_relative(p, cls->fname); - if ((cls->log_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) { + if ((cls->log_fd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1)) + < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "could not open transfer log file %s.", fname); exit(1); 1.40 +2 -1 apache-1.3/src/modules/standard/mod_log_referer.c Index: mod_log_referer.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_log_referer.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- mod_log_referer.c 13 Mar 2002 21:05:33 -0000 1.39 +++ mod_log_referer.c 12 Dec 2002 16:09:52 -0000 1.40 @@ -142,7 +142,8 @@ cls->referer_fd = ap_piped_log_write_fd(pl); } else if (*cls->fname != '\0') { - if ((cls->referer_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) { + if ((cls->referer_fd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1)) + < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "could not open referer log file %s.", fname); exit(1); 1.179 +6 -6 apache-1.3/src/modules/standard/mod_rewrite.c Index: mod_rewrite.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v retrieving revision 1.178 retrieving revision 1.179 diff -u -r1.178 -r1.179 --- mod_rewrite.c 8 Jul 2002 17:18:32 -0000 1.178 +++ mod_rewrite.c 12 Dec 2002 16:09:52 -0000 1.179 @@ -3105,8 +3105,8 @@ conf->rewritelogfp = ap_piped_log_write_fd(pl); } else if (*conf->rewritelogfile != '\0') { - if ((conf->rewritelogfp = ap_popenf(p, fname, rewritelog_flags, - rewritelog_mode)) < 0) { + if ((conf->rewritelogfp = ap_popenf_ex(p, fname, rewritelog_flags, + rewritelog_mode, 1)) < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "mod_rewrite: could not open RewriteLog " @@ -3253,8 +3253,8 @@ /* create the lockfile */ unlink(lockname); - if ((lockfd = ap_popenf(p, lockname, O_WRONLY|O_CREAT, - REWRITELOCK_MODE)) < 0) { + if ((lockfd = ap_popenf_ex(p, lockname, O_WRONLY|O_CREAT, + REWRITELOCK_MODE, 1)) < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "mod_rewrite: Parent could not create RewriteLock " "file %s", lockname); @@ -3281,8 +3281,8 @@ } /* open the lockfile (once per child) to get a unique fd */ - if ((lockfd = ap_popenf(p, lockname, O_WRONLY, - REWRITELOCK_MODE)) < 0) { + if ((lockfd = ap_popenf_ex(p, lockname, O_WRONLY, + REWRITELOCK_MODE, 1)) < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "mod_rewrite: Child could not open RewriteLock " "file %s", lockname); 1.4 +1 -1 apache-1.3/src/os/netware/mod_log_nw.c Index: mod_log_nw.c =================================================================== RCS file: /home/cvs/apache-1.3/src/os/netware/mod_log_nw.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- mod_log_nw.c 2 Apr 2002 16:51:01 -0000 1.3 +++ mod_log_nw.c 12 Dec 2002 16:09:52 -0000 1.4 @@ -1161,7 +1161,7 @@ fname = ap_server_root_relative(p, cls->fname); } - if ((cls->log_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) { + if ((cls->log_fd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1)) < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "could not open transfer log file %s.", fname); exit(1);