char *ss_host; /* suffix in host */
char *ss_slice;
short ss_port;
+ char *ss_ip;
int ss_slicePos; /* position in slices array */
} ServiceSig;
serv.ss_host = GetWord(line, 0);
serv.ss_slice = GetWord(line, 1);
+ serv.ss_ip = GetWord(line, 3);
if (num == 0) {
/* the first row must be an entry for apache */
for (i = 0; i < numServices; i++) {
xfree(serviceSig[i].ss_host);
+ xfree(serviceSig[i].ss_ip);
xfree(serviceSig[i].ss_slice);
}
xfree(serviceSig);
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(serviceSig[whichService].ss_port);
- dest.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-
+ if (serviceSig[whichService].ss_ip != NULL) {
+ dest.sin_addr.s_addr = inet_addr(serviceSig[whichService].ss_ip);
+ } else {
+ dest.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ }
+
/* start connection process - we should be told that it's in
progress */
if (connect(sock, (struct sockaddr *) &dest, sizeof(dest)) != -1 ||
{
int lisSock;
int logFd;
+ int doDaemon = 1;
+ int opt;
+ struct in_addr lisAddress = { .s_addr = htonl(INADDR_ANY) };
+
+ while ((opt = getopt(argc, argv, "dl:")) != -1) {
+ switch (opt) {
+ case 'd':
+ doDaemon = 0;
+ break;
+ case 'l':
+ if (inet_pton(AF_INET, optarg, &lisAddress) <= 0) {
+ fprintf(stderr, "`%s' is not a valid address\n", optarg);
+ exit(-1);
+ }
+ break;
+ default:
+ fprintf(stderr, "Usage: %s [-d] [-l <listening address>]\n", argv[0]);
+ exit(-1);
+ }
+ }
/* do the daemon stuff */
- if (argc <= 1 || strcmp(argv[1], "-d") != 0) {
+ if (doDaemon) {
if (InitDaemon() < 0) {
fprintf(stderr, "codemux daemon_init() failed\n");
exit(-1);
}
/* create the accept socket */
- if ((lisSock = CreatePrivateAcceptSocket(DEMUX_PORT, TRUE)) < 0) {
+ if ((lisSock = CreatePrivateAcceptSocket(DEMUX_PORT, TRUE,
+ &lisAddress)) < 0) {
fprintf(stderr, "failed creating accept socket\n");
exit(-1);
}