o Move our prompt descriptor list outside of the bundle.

It's now dealt with by the `server' object.  This simplifies
  things as we only have one list of prompt descriptors and
  the log_ routines check prompt::logactive to determine
  whether it should be used for output.
o Include the MP socket UpdateSet() result in bundle::UpdateSet().
o Don't select on the tun device unless we're in NETWORK
  phase or AUTO mode.
o Stop the idle timer when we go to DEAD phase.  We may
  have transferred a link and not had a chance to kill
  it.
o Don't fail when trying to unlink our transferred datalink
  from our descriptor lists just before the transfer.
o Add our link descriptor to the write set if we got a short
  write the last time (physical::out is set).
o Log the connection source address when a connection is closed.
o Remove descriptor::next field.  Descriptor lists are not required
  any more.
This commit is contained in:
Brian Somers 1998-05-23 22:24:50 +00:00
parent 86b1f0d762
commit 0f2f3eb395
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=36314
15 changed files with 222 additions and 239 deletions

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: bundle.c,v 1.2 1998/05/21 21:44:08 brian Exp $
* $Id: bundle.c,v 1.3 1998/05/23 17:05:26 brian Exp $
*/
#include <sys/types.h>
@ -112,6 +112,7 @@ bundle_NewPhase(struct bundle *bundle, u_int new)
switch (new) {
case PHASE_DEAD:
log_DisplayPrompts();
bundle->phase = new;
break;
@ -121,7 +122,7 @@ bundle_NewPhase(struct bundle *bundle, u_int new)
case PHASE_AUTHENTICATE:
bundle->phase = new;
bundle_DisplayPrompt(bundle);
log_DisplayPrompts();
break;
case PHASE_NETWORK:
@ -129,13 +130,13 @@ bundle_NewPhase(struct bundle *bundle, u_int new)
fsm_Up(&bundle->ncp.ipcp.fsm);
fsm_Open(&bundle->ncp.ipcp.fsm);
bundle->phase = new;
bundle_DisplayPrompt(bundle);
log_DisplayPrompts();
break;
case PHASE_TERMINATE:
bundle->phase = new;
mp_Down(&bundle->ncp.mp);
bundle_DisplayPrompt(bundle);
log_DisplayPrompts();
break;
}
}
@ -476,16 +477,12 @@ bundle_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
{
struct bundle *bundle = descriptor2bundle(d);
struct datalink *dl;
struct descriptor *desc;
int result, want, queued, nlinks;
result = 0;
for (dl = bundle->links; dl; dl = dl->next)
result += descriptor_UpdateSet(&dl->desc, r, w, e, n);
for (desc = bundle->desc.next; desc; desc = desc->next)
result += descriptor_UpdateSet(desc, r, w, e, n);
/* If there are aren't many packets queued, look for some more. */
for (nlinks = 0, dl = bundle->links; dl; dl = dl->next)
nlinks++;
@ -504,7 +501,8 @@ bundle_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
bundle_StartAutoLoadTimer(bundle, 1);
}
if (r) {
if (r &&
(bundle->phase == PHASE_NETWORK || bundle->phys_type & PHYS_DEMAND)) {
/* enough surplus so that we can tell if we're getting swamped */
want = bundle->cfg.autoload.max.packets + nlinks * 2;
/* but at least 20 packets ! */
@ -526,7 +524,7 @@ bundle_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
* might be ``holding'' one of the datalinks (death-row) and
* wants to be able to de-select() it from the descriptor set.
*/
descriptor_UpdateSet(&bundle->ncp.mp.server.desc, r, w, e, n);
result += descriptor_UpdateSet(&bundle->ncp.mp.server.desc, r, w, e, n);
return result;
}
@ -536,16 +534,11 @@ bundle_IsSet(struct descriptor *d, const fd_set *fdset)
{
struct bundle *bundle = descriptor2bundle(d);
struct datalink *dl;
struct descriptor *desc;
for (dl = bundle->links; dl; dl = dl->next)
if (descriptor_IsSet(&dl->desc, fdset))
return 1;
for (desc = bundle->desc.next; desc; desc = desc->next)
if (descriptor_IsSet(desc, fdset))
return 1;
if (descriptor_IsSet(&bundle->ncp.mp.server.desc, fdset))
return 1;
@ -557,7 +550,6 @@ bundle_DescriptorRead(struct descriptor *d, struct bundle *bundle,
const fd_set *fdset)
{
struct datalink *dl;
struct descriptor *desc;
if (descriptor_IsSet(&bundle->ncp.mp.server.desc, fdset))
descriptor_Read(&bundle->ncp.mp.server.desc, bundle, fdset);
@ -566,10 +558,6 @@ bundle_DescriptorRead(struct descriptor *d, struct bundle *bundle,
if (descriptor_IsSet(&dl->desc, fdset))
descriptor_Read(&dl->desc, bundle, fdset);
for (desc = bundle->desc.next; desc; desc = desc->next)
if (descriptor_IsSet(desc, fdset))
descriptor_Read(desc, bundle, fdset);
if (FD_ISSET(bundle->dev.fd, fdset)) {
struct tun_data tun;
int n, pri;
@ -653,7 +641,6 @@ bundle_DescriptorWrite(struct descriptor *d, struct bundle *bundle,
const fd_set *fdset)
{
struct datalink *dl;
struct descriptor *desc;
/* This is not actually necessary as struct mpserver doesn't Write() */
if (descriptor_IsSet(&bundle->ncp.mp.server.desc, fdset))
@ -662,15 +649,11 @@ bundle_DescriptorWrite(struct descriptor *d, struct bundle *bundle,
for (dl = bundle->links; dl; dl = dl->next)
if (descriptor_IsSet(&dl->desc, fdset))
descriptor_Write(&dl->desc, bundle, fdset);
for (desc = bundle->desc.next; desc; desc = desc->next)
if (descriptor_IsSet(desc, fdset))
descriptor_Write(desc, bundle, fdset);
}
struct bundle *
bundle_Create(const char *prefix, struct prompt *prompt, int type)
bundle_Create(const char *prefix, int type)
{
int s, enoentcount, err;
struct ifreq ifrq;
@ -752,7 +735,6 @@ bundle_Create(const char *prefix, struct prompt *prompt, int type)
bundle.ifp.Name = NULL;
return NULL;
}
prompt_Printf(prompt, "Using interface: %s\n", bundle.ifp.Name);
log_Printf(LogPHASE, "Using interface: %s\n", bundle.ifp.Name);
bundle.ifp.Speed = 0;
@ -789,7 +771,6 @@ bundle_Create(const char *prefix, struct prompt *prompt, int type)
}
bundle.desc.type = BUNDLE_DESCRIPTOR;
bundle.desc.next = NULL;
bundle.desc.UpdateSet = bundle_UpdateSet;
bundle.desc.IsSet = bundle_IsSet;
bundle.desc.Read = bundle_DescriptorRead;
@ -866,7 +847,6 @@ void
bundle_Destroy(struct bundle *bundle)
{
struct datalink *dl;
struct descriptor *desc, *ndesc;
/*
* Clean up the interface. We don't need to timer_Stop()s, mp_Down(),
@ -887,18 +867,6 @@ bundle_Destroy(struct bundle *bundle)
/* In case we never made PHASE_NETWORK */
bundle_Notify(bundle, EX_ERRDEAD);
/* Finally, destroy our prompts */
desc = bundle->desc.next;
while (desc) {
ndesc = desc->next;
if (desc->type == PROMPT_DESCRIPTOR)
prompt_Destroy((struct prompt *)desc, 1);
else
log_Printf(LogERROR, "bundle_Destroy: Don't know how to delete descriptor"
" type %d\n", desc->type);
desc = ndesc;
}
bundle->desc.next = NULL;
bundle->ifp.Name = NULL;
}
@ -1052,7 +1020,7 @@ bundle_LinkClosed(struct bundle *bundle, struct datalink *dl)
fsm_Close(&bundle->ncp.ipcp.fsm); /* ST_INITIAL please */
}
bundle_NewPhase(bundle, PHASE_DEAD);
bundle_DisplayPrompt(bundle);
bundle_StopIdleTimer(bundle);
bundle_StopAutoLoadTimer(bundle);
bundle->autoload.running = 0;
} else
@ -1263,84 +1231,6 @@ bundle_IsDead(struct bundle *bundle)
return !bundle->links || (bundle->phase == PHASE_DEAD && bundle->CleaningUp);
}
void
bundle_RegisterDescriptor(struct bundle *bundle, struct descriptor *d)
{
d->next = bundle->desc.next;
bundle->desc.next = d;
}
void
bundle_UnRegisterDescriptor(struct bundle *bundle, struct descriptor *d)
{
struct descriptor **desc;
for (desc = &bundle->desc.next; *desc; desc = &(*desc)->next)
if (*desc == d) {
*desc = d->next;
break;
}
}
void
bundle_DelPromptDescriptors(struct bundle *bundle, struct server *s)
{
struct descriptor **desc;
struct prompt *p;
desc = &bundle->desc.next;
while (*desc) {
if ((*desc)->type == PROMPT_DESCRIPTOR) {
p = (struct prompt *)*desc;
if (p->owner == s) {
prompt_Destroy(p, 1);
desc = &bundle->desc.next;
continue;
}
}
desc = &(*desc)->next;
}
}
void
bundle_DisplayPrompt(struct bundle *bundle)
{
struct descriptor **desc;
for (desc = &bundle->desc.next; *desc; desc = &(*desc)->next)
if ((*desc)->type == PROMPT_DESCRIPTOR)
prompt_Required((struct prompt *)*desc);
}
void
bundle_WriteTermPrompt(struct bundle *bundle, struct datalink *dl,
const char *data, int len)
{
struct descriptor *desc;
struct prompt *p;
for (desc = bundle->desc.next; desc; desc = desc->next)
if (desc->type == PROMPT_DESCRIPTOR) {
p = (struct prompt *)desc;
if (prompt_IsTermMode(p, dl))
prompt_Printf(p, "%.*s", len, data);
}
}
void
bundle_SetTtyCommandMode(struct bundle *bundle, struct datalink *dl)
{
struct descriptor *desc;
struct prompt *p;
for (desc = bundle->desc.next; desc; desc = desc->next)
if (desc->type == PROMPT_DESCRIPTOR) {
p = (struct prompt *)desc;
if (prompt_IsTermMode(p, dl))
prompt_TtyCommandMode(p);
}
}
static void
bundle_LinkAdded(struct bundle *bundle, struct datalink *dl)
{
@ -1369,14 +1259,13 @@ bundle_DatalinkLinkout(struct bundle *bundle, struct datalink *dl)
{
struct datalink **dlp;
if (dl->state == DATALINK_CLOSED)
for (dlp = &bundle->links; *dlp; dlp = &(*dlp)->next)
if (*dlp == dl) {
*dlp = dl->next;
dl->next = NULL;
bundle_LinksRemoved(bundle);
return dl;
}
for (dlp = &bundle->links; *dlp; dlp = &(*dlp)->next)
if (*dlp == dl) {
*dlp = dl->next;
dl->next = NULL;
bundle_LinksRemoved(bundle);
return dl;
}
return NULL;
}
@ -1534,8 +1423,8 @@ bundle_SendDatalink(struct datalink *dl, int s, struct sockaddr_un *sun)
log_Printf(LogPHASE, "Transmitting datalink %s\n", dl->name);
bundle_DatalinkLinkout(dl->bundle, dl);
bundle_LinkClosed(dl->bundle, dl);
bundle_DatalinkLinkout(dl->bundle, dl);
/* Build our scatter/gather array */
iov[0].iov_len = strlen(Version) + 1;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: bundle.h,v 1.1.2.42 1998/05/21 01:13:24 brian Exp $
* $Id: bundle.h,v 1.2 1998/05/21 21:44:14 brian Exp $
*/
#define PHASE_DEAD 0 /* Link is dead */
@ -126,7 +126,7 @@ struct bundle {
#define descriptor2bundle(d) \
((d)->type == BUNDLE_DESCRIPTOR ? (struct bundle *)(d) : NULL)
extern struct bundle *bundle_Create(const char *, struct prompt *, int);
extern struct bundle *bundle_Create(const char *, int);
extern void bundle_Destroy(struct bundle *);
extern const char *bundle_PhaseName(struct bundle *);
#define bundle_Phase(b) ((b)->phase)
@ -151,10 +151,6 @@ extern struct datalink *bundle2datalink(struct bundle *, const char *);
extern void bundle_RegisterDescriptor(struct bundle *, struct descriptor *);
extern void bundle_UnRegisterDescriptor(struct bundle *, struct descriptor *);
extern void bundle_DelPromptDescriptors(struct bundle *, struct server *);
extern void bundle_DisplayPrompt(struct bundle *);
extern void bundle_WriteTermPrompt(struct bundle *, struct datalink *,
const char *, int);
extern void bundle_SetTtyCommandMode(struct bundle *, struct datalink *);
extern int bundle_DatalinkClone(struct bundle *, struct datalink *,

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: chat.c,v 1.44.2.29 1998/05/01 19:24:11 brian Exp $
* $Id: chat.c,v 1.45 1998/05/21 21:44:37 brian Exp $
*/
#include <sys/types.h>
@ -514,7 +514,6 @@ chat_Init(struct chat *c, struct physical *p, const char *data, int emptybuf,
const char *phone)
{
c->desc.type = CHAT_DESCRIPTOR;
c->desc.next = NULL;
c->desc.UpdateSet = chat_UpdateSet;
c->desc.IsSet = chat_IsSet;
c->desc.Read = chat_Read;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: datalink.c,v 1.2 1998/05/21 21:44:54 brian Exp $
* $Id: datalink.c,v 1.3 1998/05/23 13:38:06 brian Exp $
*/
#include <sys/types.h>
@ -543,7 +543,6 @@ datalink_Create(const char *name, struct bundle *bundle, int type)
return dl;
dl->desc.type = DATALINK_DESCRIPTOR;
dl->desc.next = NULL;
dl->desc.UpdateSet = datalink_UpdateSet;
dl->desc.IsSet = datalink_IsSet;
dl->desc.Read = datalink_Read;
@ -612,7 +611,6 @@ datalink_Clone(struct datalink *odl, const char *name)
return dl;
dl->desc.type = DATALINK_DESCRIPTOR;
dl->desc.next = NULL;
dl->desc.UpdateSet = datalink_UpdateSet;
dl->desc.IsSet = datalink_IsSet;
dl->desc.Read = datalink_Read;
@ -973,7 +971,6 @@ iov2datalink(struct bundle *bundle, struct iovec *iov, int *niov, int maxiov,
(*niov)++;
dl->desc.type = DATALINK_DESCRIPTOR;
dl->desc.next = NULL;
dl->desc.UpdateSet = datalink_UpdateSet;
dl->desc.IsSet = datalink_IsSet;
dl->desc.Read = datalink_Read;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: descriptor.h,v 1.1.2.10 1998/04/28 01:25:13 brian Exp $
* $Id: descriptor.h,v 1.2 1998/05/21 21:45:08 brian Exp $
*/
#define PHYSICAL_DESCRIPTOR (1)
@ -38,7 +38,6 @@ struct bundle;
struct descriptor {
int type;
struct descriptor *next;
int (*UpdateSet)(struct descriptor *, fd_set *, fd_set *, fd_set *, int *);
int (*IsSet)(struct descriptor *, const fd_set *);

View File

@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: ipcp.c,v 1.50.2.54 1998/05/21 01:26:08 brian Exp $
* $Id: ipcp.c,v 1.51 1998/05/21 21:45:46 brian Exp $
*
* TODO:
* o More RFC1772 backwoard compatibility
@ -738,7 +738,7 @@ IpcpLayerUp(struct fsm *fp)
throughput_start(&ipcp->throughput, "IPCP throughput",
Enabled(fp->bundle, OPT_THROUGHPUT));
bundle_DisplayPrompt(fp->bundle);
log_DisplayPrompts();
return 1;
}

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: log.c,v 1.25.2.14 1998/05/01 22:39:35 brian Exp $
* $Id: log.c,v 1.27 1998/05/21 21:46:25 brian Exp $
*/
#include <sys/types.h>
@ -66,16 +66,28 @@ static const char *LogNames[] = {
static u_long LogMask = MSK(LogPHASE);
static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
static int LogTunno = -1;
static struct prompt *logprompt; /* Where to log local stuff */
static struct prompt *promptlist; /* Where to log local stuff */
struct prompt *
log_PromptList()
{
return promptlist;
}
void
log_RegisterPrompt(struct prompt *prompt)
{
if (prompt) {
prompt->lognext = logprompt;
logprompt = prompt;
LogMaskLocal |= prompt->logmask;
}
prompt->next = promptlist;
promptlist = prompt;
prompt->active = 1;
log_DiscardAllLocal(&prompt->logmask);
}
void
log_ActivatePrompt(struct prompt *prompt)
{
prompt->active = 1;
LogMaskLocal |= prompt->logmask;
}
static void
@ -84,26 +96,80 @@ LogSetMaskLocal(void)
struct prompt *p;
LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
for (p = logprompt; p; p = p->lognext)
for (p = promptlist; p; p = p->next)
LogMaskLocal |= p->logmask;
}
void
log_DeactivatePrompt(struct prompt *prompt)
{
if (prompt->active) {
prompt->active = 0;
LogSetMaskLocal();
}
}
void
log_UnRegisterPrompt(struct prompt *prompt)
{
if (prompt) {
struct prompt **p;
for (p = &logprompt; *p; p = &(*p)->lognext)
for (p = &promptlist; *p; p = &(*p)->next)
if (*p == prompt) {
*p = prompt->lognext;
prompt->lognext = NULL;
*p = prompt->next;
prompt->next = NULL;
break;
}
LogSetMaskLocal();
}
}
void
log_DestroyPrompts(struct server *s)
{
struct prompt *p, *pn;
p = promptlist;
while (p) {
pn = p->next;
if (s && p->owner != s) {
p->next = NULL;
prompt_Destroy(p, 1);
}
p = pn;
}
}
void
log_DisplayPrompts()
{
struct prompt *p;
for (p = promptlist; p; p = p->next)
prompt_Required(p);
}
void
log_WritePrompts(struct datalink *dl, const char *data, int len)
{
struct prompt *p;
for (p = promptlist; p; p = p->next)
if (prompt_IsTermMode(p, dl))
prompt_Printf(p, "%.*s", len, data);
}
void
log_SetTtyCommandMode(struct datalink *dl)
{
struct prompt *p;
for (p = promptlist; p; p = p->next)
if (prompt_IsTermMode(p, dl))
prompt_TtyCommandMode(p);
}
static int
syslogLevel(int lev)
{
@ -225,19 +291,20 @@ log_Printf(int lev, const char *fmt,...)
if (log_IsKept(lev)) {
static char nfmt[200];
if ((log_IsKept(lev) & LOG_KEPT_LOCAL) && logprompt) {
if ((log_IsKept(lev) & LOG_KEPT_LOCAL) && promptlist) {
if ((log_IsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
LogTunno, log_Name(lev), fmt);
else
snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
for (prompt = logprompt; prompt; prompt = prompt->lognext)
for (prompt = promptlist; prompt; prompt = prompt->next)
if (lev > LogMAXCONF || (prompt->logmask & MSK(lev)))
prompt_vPrintf(prompt, nfmt, ap);
}
if ((log_IsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !logprompt)) {
if ((log_IsKept(lev) & LOG_KEPT_SYSLOG) &&
(lev != LogWARN || !promptlist)) {
if ((log_IsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
LogTunno, log_Name(lev), fmt);
@ -380,7 +447,7 @@ log_ShowWho(struct cmdargs const *arg)
{
struct prompt *p;
for (p = logprompt; p; p = p->lognext) {
for (p = promptlist; p; p = p->next) {
prompt_Printf(arg->prompt, "%s (%s)", p->src.type, p->src.from);
if (p == arg->prompt)
prompt_Printf(arg->prompt, " *");

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: log.h,v 1.18.2.8 1998/05/01 22:39:37 brian Exp $
* $Id: log.h,v 1.19 1998/05/21 21:46:30 brian Exp $
*/
#define LogMIN (1)
@ -51,6 +51,8 @@
struct mbuf;
struct cmdargs;
struct prompt;
struct server;
struct datalink;
/* The first int arg for all of the following is one of the above values */
extern const char *log_Name(int);
@ -75,8 +77,16 @@ extern void log_Printf(int, const char *,...);
#endif
extern void log_DumpBp(int, const char *, const struct mbuf *);
extern void log_DumpBuff(int, const char *, const u_char *, int);
extern void log_RegisterPrompt(struct prompt *);
extern void log_UnRegisterPrompt(struct prompt *);
extern int log_ShowLevel(struct cmdargs const *);
extern int log_SetLevel(struct cmdargs const *);
extern int log_ShowWho(struct cmdargs const *);
extern void log_RegisterPrompt(struct prompt *);
extern void log_UnRegisterPrompt(struct prompt *);
extern void log_DestroyPrompts(struct server *);
extern void log_DisplayPrompts(void);
extern void log_WritePrompts(struct datalink *, const char *, int);
extern void log_ActivatePrompt(struct prompt *);
extern void log_DeactivatePrompt(struct prompt *);
extern void log_SetTtyCommandMode(struct datalink *);
extern struct prompt *log_PromptList(void);

View File

@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: main.c,v 1.121.2.60 1998/05/15 18:21:38 brian Exp $
* $Id: main.c,v 1.123 1998/05/21 21:46:40 brian Exp $
*
* TODO:
*/
@ -330,10 +330,14 @@ main(int argc, char **argv)
return 1;
}
if ((bundle = bundle_Create(TUN_PREFIX, prompt, mode)) == NULL) {
if ((bundle = bundle_Create(TUN_PREFIX, mode)) == NULL) {
log_Printf(LogWARN, "bundle_Create: %s\n", strerror(errno));
return EX_START;
}
if (prompt) {
prompt->bundle = bundle; /* couldn't do it earlier */
prompt_Printf(prompt, "Using interface: %s\n", bundle->ifp.Name);
}
SignalBundle = bundle;
if (system_Select(bundle, "default", CONFFILE, prompt) < 0)
@ -474,8 +478,11 @@ DoLoop(struct bundle *bundle, struct prompt *prompt)
sig_Handle();
/* All our datalinks, the tun device and the MP socket */
descriptor_UpdateSet(&bundle->desc, &rfds, &wfds, &efds, &nfds);
descriptor_UpdateSet(&server.desc, &rfds, &wfds, &efds, &nfds);
/* All our prompts and the diagnostic socket */
descriptor_UpdateSet(&server.desc, &rfds, NULL, NULL, &nfds);
if (bundle_IsDead(bundle))
/* Don't select - we'll be here forever */

View File

@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: modem.c,v 1.81 1998/05/21 21:46:56 brian Exp $
* $Id: modem.c,v 1.82 1998/05/21 22:55:08 brian Exp $
*
* TODO:
*/
@ -754,7 +754,7 @@ modem_PhysicalClose(struct physical *modem)
close(modem->fd);
modem->fd = -1;
timer_Stop(&modem->Timer);
bundle_SetTtyCommandMode(modem->dl->bundle, modem->dl);
log_SetTtyCommandMode(modem->dl);
throughput_stop(&modem->link.throughput);
throughput_log(&modem->link.throughput, LogPHASE, modem->link.name);
}
@ -951,12 +951,12 @@ modem_DescriptorRead(struct descriptor *d, struct bundle *bundle,
/* LCP packet is detected. Turn ourselves into packet mode */
if (cp != rbuff) {
/* Get rid of the bit before the HDLC header */
bundle_WriteTermPrompt(p->dl->bundle, p->dl, rbuff, cp - rbuff);
bundle_WriteTermPrompt(p->dl->bundle, p->dl, "\r\n", 2);
log_WritePrompts(p->dl, rbuff, cp - rbuff);
log_WritePrompts(p->dl, "\r\n", 2);
}
datalink_Up(p->dl, 0, 1);
} else
bundle_WriteTermPrompt(p->dl->bundle, p->dl, rbuff, n);
log_WritePrompts(p->dl, rbuff, n);
}
} else if (n > 0)
async_Input(bundle, rbuff, n, p);
@ -984,7 +984,6 @@ iov2modem(struct datalink *dl, struct iovec *iov, int *niov, int maxiov, int fd)
p->desc.IsSet = physical_IsSet;
p->desc.Read = modem_DescriptorRead;
p->desc.Write = modem_DescriptorWrite;
p->desc.next = NULL;
p->type = PHYS_DIRECT;
p->dl = dl;
len = strlen(_PATH_DEV);

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp.c,v 1.3 1998/05/23 13:38:09 brian Exp $
* $Id: mp.c,v 1.4 1998/05/23 17:05:28 brian Exp $
*/
#include <sys/types.h>
@ -850,28 +850,30 @@ mpserver_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
int *n)
{
struct mpserver *s = descriptor2mpserver(d);
int result;
result = 0;
if (s->send.dl != NULL) {
/* We've connect()ed */
if (!link_QueueLen(&s->send.dl->physical->link) &&
!s->send.dl->physical->out) {
/* Only send if we've transmitted all our data (i.e. the ConfigAck) */
datalink_RemoveFromSet(s->send.dl, r, w, e);
result -= datalink_RemoveFromSet(s->send.dl, r, w, e);
bundle_SendDatalink(s->send.dl, s->fd, &s->socket);
s->send.dl = NULL;
close(s->fd);
s->fd = -1;
} else
/* Never read from a datalink that's on death row ! */
datalink_RemoveFromSet(s->send.dl, r, NULL, NULL);
result -= datalink_RemoveFromSet(s->send.dl, r, NULL, NULL);
} else if (r && s->fd >= 0) {
if (*n < s->fd + 1)
*n = s->fd + 1;
FD_SET(s->fd, r);
log_Printf(LogTIMER, "mp: fdset(r) %d\n", s->fd);
return 1;
result++;
}
return 0;
return result;
}
static int
@ -912,7 +914,6 @@ void
mpserver_Init(struct mpserver *s)
{
s->desc.type = MPSERVER_DESCRIPTOR;
s->desc.next = NULL;
s->desc.UpdateSet = mpserver_UpdateSet;
s->desc.IsSet = mpserver_IsSet;
s->desc.Read = mpserver_Read;

View File

@ -16,7 +16,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* $Id: physical.c,v 1.1.2.34 1998/05/21 01:12:20 brian Exp $
* $Id: physical.c,v 1.2 1998/05/21 21:47:37 brian Exp $
*
*/
@ -138,7 +138,7 @@ physical_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
log_Printf(LogTIMER, "%s: fdset(e) %d\n", p->link.name, p->fd);
sets++;
}
if (w && (force || link_QueueLen(&p->link))) {
if (w && (force || link_QueueLen(&p->link) || p->out)) {
FD_SET(p->fd, w);
log_Printf(LogTIMER, "%s: fdset(w) %d\n", p->link.name, p->fd);
sets++;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: prompt.c,v 1.1.2.30 1998/05/10 22:20:17 brian Exp $
* $Id: prompt.c,v 1.2 1998/05/21 21:47:57 brian Exp $
*/
#include <sys/param.h>
@ -185,7 +185,7 @@ prompt_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
if (n)
command_Decode(bundle, linebuff, n, p, p->src.from);
} else if (n <= 0) {
log_Printf(LogPHASE, "Client connection closed.\n");
log_Printf(LogPHASE, "%s: Client connection closed.\n", p->src.from);
prompt_Destroy(p, 0);
}
return;
@ -279,7 +279,6 @@ prompt_Create(struct server *s, struct bundle *bundle, int fd)
if (p != NULL) {
p->desc.type = PROMPT_DESCRIPTOR;
p->desc.next = NULL;
p->desc.UpdateSet = prompt_UpdateSet;
p->desc.IsSet = prompt_IsSet;
p->desc.Read = prompt_Read;
@ -306,12 +305,8 @@ prompt_Create(struct server *s, struct bundle *bundle, int fd)
p->TermMode = NULL;
p->nonewline = 1;
p->needprompt = 1;
p->active = 1;
p->bundle = bundle;
if (p->bundle)
bundle_RegisterDescriptor(p->bundle, &p->desc);
log_RegisterPrompt(p);
log_DiscardAllLocal(&p->logmask);
}
return p;
@ -326,12 +321,11 @@ prompt_Destroy(struct prompt *p, int verbose)
if (p->fd_out != p->fd_in)
close(p->fd_out);
if (verbose)
log_Printf(LogPHASE, "Client connection dropped.\n");
log_Printf(LogPHASE, "%s: Client connection dropped.\n", p->src.from);
} else
prompt_TtyOldMode(p);
log_UnRegisterPrompt(p);
bundle_UnRegisterDescriptor(p->bundle, &p->desc);
free(p);
}
@ -502,7 +496,7 @@ prompt_Continue(struct prompt *p)
prompt_TtyCommandMode(p);
p->nonewline = 1;
prompt_Required(p);
p->active = 1;
log_ActivatePrompt(p);
} else if (!p->owner) {
bgtimer.func = prompt_TimedContinue;
bgtimer.name = "prompt bg";
@ -517,6 +511,6 @@ prompt_Suspend(struct prompt *p)
{
if (getpgrp() == prompt_pgrp(p)) {
prompt_TtyOldMode(p);
p->active = 0;
log_DeactivatePrompt(p);
}
}

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: prompt.h,v 1.1.2.9 1998/05/01 19:25:44 brian Exp $
* $Id: prompt.h,v 1.2 1998/05/21 21:48:02 brian Exp $
*/
#define LOCAL_AUTH 0x01
@ -54,7 +54,7 @@ struct prompt {
char from[40]; /* Source of connection */
} src;
struct prompt *lognext; /* Maintained in log.c */
struct prompt *next; /* Maintained in log.c */
u_long logmask; /* Maintained in log.c */
struct termios oldtio; /* Original tty mode */

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: server.c,v 1.16.2.19 1998/05/10 22:20:20 brian Exp $
* $Id: server.c,v 1.18 1998/05/21 21:48:15 brian Exp $
*/
#include <sys/types.h>
@ -67,22 +67,38 @@ static int
server_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
{
struct server *s = descriptor2server(d);
struct prompt *p;
int sets;
sets = 0;
if (r && s->fd >= 0) {
if (*n < s->fd + 1)
*n = s->fd + 1;
FD_SET(s->fd, r);
log_Printf(LogTIMER, "server: fdset(r) %d\n", s->fd);
return 1;
sets++;
}
return 0;
for (p = log_PromptList(); p; p = p->next)
sets += descriptor_UpdateSet(&p->desc, r, w, e, n);
return sets;
}
static int
server_IsSet(struct descriptor *d, const fd_set *fdset)
{
struct server *s = descriptor2server(d);
return s->fd >= 0 && FD_ISSET(s->fd, fdset);
struct prompt *p;
if (s->fd >= 0 && FD_ISSET(s->fd, fdset))
return 1;
for (p = log_PromptList(); p; p = p->next)
if (descriptor_IsSet(&p->desc, fdset))
return 1;
return 0;
}
#define IN_SIZE sizeof(struct sockaddr_in)
@ -99,54 +115,64 @@ server_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
int ssize = ADDRSZ, wfd;
struct prompt *p;
wfd = accept(s->fd, sa, &ssize);
if (wfd < 0) {
log_Printf(LogERROR, "server_Read: accept(): %s\n", strerror(errno));
return;
}
if (s->fd >= 0 && FD_ISSET(s->fd, fdset)) {
wfd = accept(s->fd, sa, &ssize);
if (wfd < 0)
log_Printf(LogERROR, "server_Read: accept(): %s\n", strerror(errno));
} else
wfd = -1;
switch (sa->sa_family) {
case AF_LOCAL:
log_Printf(LogPHASE, "Connected to local client.\n");
break;
case AF_INET:
if (ntohs(in->sin_port) < 1024) {
log_Printf(LogALERT, "Rejected client connection from %s:%u"
"(invalid port number) !\n",
inet_ntoa(in->sin_addr), ntohs(in->sin_port));
close(wfd);
return;
}
log_Printf(LogPHASE, "Connected to client from %s:%u\n",
inet_ntoa(in->sin_addr), in->sin_port);
break;
default:
write(wfd, "Unrecognised access !\n", 22);
close(wfd);
return;
}
if ((p = prompt_Create(s, bundle, wfd)) == NULL) {
write(wfd, "Connection refused.\n", 20);
close(wfd);
} else {
if (wfd >= 0)
switch (sa->sa_family) {
case AF_LOCAL:
p->src.type = "local";
strncpy(p->src.from, s->rm, sizeof p->src.from - 1);
p->src.from[sizeof p->src.from - 1] = '\0';
log_Printf(LogPHASE, "Connected to local client.\n");
break;
case AF_INET:
p->src.type = "tcp";
snprintf(p->src.from, sizeof p->src.from, "%s:%u",
inet_ntoa(in->sin_addr), in->sin_port);
if (ntohs(in->sin_port) < 1024) {
log_Printf(LogALERT, "Rejected client connection from %s:%u"
"(invalid port number) !\n",
inet_ntoa(in->sin_addr), ntohs(in->sin_port));
close(wfd);
wfd = -1;
break;
}
log_Printf(LogPHASE, "Connected to client from %s:%u\n",
inet_ntoa(in->sin_addr), in->sin_port);
break;
default:
write(wfd, "Unrecognised access !\n", 22);
close(wfd);
wfd = -1;
break;
}
prompt_TtyCommandMode(p);
prompt_Required(p);
if (wfd >= 0) {
if ((p = prompt_Create(s, bundle, wfd)) == NULL) {
write(wfd, "Connection refused.\n", 20);
close(wfd);
} else {
switch (sa->sa_family) {
case AF_LOCAL:
p->src.type = "local";
strncpy(p->src.from, s->rm, sizeof p->src.from - 1);
p->src.from[sizeof p->src.from - 1] = '\0';
break;
case AF_INET:
p->src.type = "tcp";
snprintf(p->src.from, sizeof p->src.from, "%s:%u",
inet_ntoa(in->sin_addr), in->sin_port);
break;
}
prompt_TtyCommandMode(p);
prompt_Required(p);
}
}
for (p = log_PromptList(); p; p = p->next)
if (descriptor_IsSet(&p->desc, fdset))
descriptor_Read(&p->desc, bundle, fdset);
}
static void
@ -159,7 +185,6 @@ server_Write(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
struct server server = {
{
SERVER_DESCRIPTOR,
NULL,
server_UpdateSet,
server_IsSet,
server_Read,
@ -266,7 +291,7 @@ server_Close(struct bundle *bundle)
server.fd = -1;
server.port = 0;
/* Drop associated prompts */
bundle_DelPromptDescriptors(bundle, &server);
log_DestroyPrompts(&server);
return 1;
}
return 0;