/* -*-c-*-
- *
- * $Id: bres.c,v 1.3 2000/06/17 10:38:35 mdw Exp $
*
* Background reverse name resolution
*
* (c) 1999 Straylight/Edgeware
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of the mLib utilities library.
*
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
- *
+ *
* mLib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Library General Public
* License along with mLib; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: bres.c,v $
- * Revision 1.3 2000/06/17 10:38:35 mdw
- * Track changes to selbuf interface.
- *
- * Revision 1.2 1999/10/30 11:28:39 mdw
- * Fix include error, pointed out by Chris Rutter.
- *
- * Revision 1.1 1999/10/04 21:40:42 mdw
- * Added background resolver from `fw'.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
+#include "config.h"
+
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include "alloc.h"
#include "bres.h"
+#include "mdup.h"
#include "report.h"
#include "sel.h"
struct hostent *h;
char *name;
char **alias = 0;
-
+
/* --- Read the skeleton structure --- */
if (doread(fd, &hsk, sizeof(hsk)))
if (hsk.nalias) {
int i;
if ((alias = malloc(hsk.nalias * sizeof(char *))) == 0)
- goto tidy_1;
+ goto tidy_1;
for (i = 0; i < hsk.nalias; i++)
alias[i] = 0;
for (i = 0; i < hsk.nalias; i++) {
if (doread(fd, a, hsk.naddr * hsk.addrsz))
goto tidy_2;
for (i = 0; i < hsk.naddr; i++) {
- struct in_addr in;
*p++ = a;
- memcpy(&in, a, sizeof(in));
+ a += hsk.addrsz;
}
*p++ = 0;
h->h_name = a;
PUT(name);
- xfree(name);
+ free(name);
h->h_aliases = p;
for (i = 0; i < hsk.nalias; i++) {
*p++ = a;
PUT(alias[i]);
- xfree(alias[i]);
+ free(alias[i]);
}
*p++ = 0;
- xfree(alias);
-
+ free(alias);
+
#undef PUT
}
{
int i;
for (i = 0; i < hsk.nalias && alias[i]; i++)
- xfree(alias[i]);
- xfree(alias);
+ free(alias[i]);
+ free(alias);
}
tidy_1:
- xfree(name);
+ free(name);
tidy_0:
return (0);
}
{
int i;
+#if defined(_SC_OPEN_MAX)
int maxfd = sysconf(_SC_OPEN_MAX);
+#elif defined(OPEN_MAX)
+ int maxfd = OPEN_MAX;
+#else
+ int maxfd = -1;
+#endif
if (maxfd < 0)
maxfd = 256; /* Fingers crossed... */
}
}
+ signal(SIGTERM, SIG_DFL);
+ signal(SIGHUP, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
+ signal(SIGALRM, SIG_DFL);
+ signal(SIGINT, SIG_DFL);
+
/* --- Main request/response loop --- */
for (;;) {
free(name);
} break;
- /* --- Forward lookup --- */
+ /* --- Reverse lookup --- */
case BRES_BYADDR: {
struct in_addr addr;
xfree(rc->u.name);
}
if (h)
- xfree(h);
+ free(h);
if (fail)
zap(rs);
if (!rc)
{
int rfd[2], cfd[2];
pid_t kid;
+ mdup_fd md[2];
/* --- Make the pipes --- */
close(rfd[0]);
if (server) {
- dup2(cfd[0], STDIN_FILENO);
- dup2(rfd[1], STDOUT_FILENO);
- close(cfd[0]);
- close(rfd[1]);
- execlp(server, server, (char *)0);
- child(STDOUT_FILENO, STDIN_FILENO);
+ md[0].cur = cfd[0]; md[0].want = STDIN_FILENO;
+ md[1].cur = rfd[1]; md[1].want = STDOUT_FILENO;
+ if (mdup(md, 2) || execlp(server, server, (char *)0))
+ child(STDOUT_FILENO, STDIN_FILENO);
} else
child(rfd[1], cfd[0]);
_exit(1);