rpld.c revision 50c83d09652262aba75a6182b3203c80b48b092b
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <fcntl.h>
#include <poll.h>
#include "rpld.h"
/* Global run-time parameters */
int debugLevel = DFT_DEBUGLEVEL;
int debugDest = DFT_DEBUGDEST;
int maxClients = DFT_MAXCLIENTS;
int backGround = DFT_BACKGROUND;
unsigned long startDelay = DFT_STARTDELAY;
unsigned long delayGran = DFT_DELAYGRAN;
int frameSize = DFT_FRAMESIZE;
int ifUnit = 0;
int ppanum = 1;
int need_llc = 0;
extern void dumpctl();
extern void dumpdata();
extern void sighuphdr();
extern void sigusr1hdr();
int goaround(void);
int if_fd; /* file descriptor for network interface name */
int totclnt = 0; /* total clients being served right now */
int outblocked = 0;
int
{
time_t t;
/* program initialize */
exit(-1);
/* start processing requests */
if (debugLevel >= MSG_INFO_1) {
}
while (1) {
if (service() < 0)
exit(-1);
}
}
int
service(void)
{
int flags;
int rc;
int n;
if (outblocked)
else
if (totclnt > 0)
else
if (debugLevel >= MSG_ALWAYS) {
}
}
outblocked = 0;
goaround();
return (rc);
}
/*
* This is the scheduler for all the outgoing traffic. Go around the
* circular linked list and only process and advance 1 in the list
* and then return no matter whether anything is being sent out in
* this step or not.
*/
int
goaround(void)
{
return (0);
case ST_FIND_RCVD:
break;
case ST_DATA_XFER:
break;
case ST_SEND_FINAL:
break;
case ST_FINISH:
else
}
break;
}
return (0);
}
int
{
char *cp;
union DL_primitives dl;
/*
* Parse command line, read appropriate config file and set up
* defaults
*/
return (-1);
/*
* Here, if the -a option is specified, we are actually running in
* a child process with all the parameters stored in the set of
* global variables.
*/
/* daemonize it if running in background */
if (backGround) {
switch (fork()) {
case -1:
return (-1);
break;
case 0: /* child: close FD's and detach terminal */
close(0);
close(1);
close(2);
(void) dup2(0, 1);
(void) dup2(0, 2);
/*
* Detach terminal
*/
setsid();
break;
default: /* parent */
exit(0);
break;
}
if (setpgrp() < 0)
return (-1);
if (fork() > 0)
return (-1);
}
if (llcsetup() < 0)
return (-1);
totclnt = 0;
return (0);
}