/* * custom.c * * Copyright (c) 1995-1999 Whistle Communications Corp. * All rights reserved. */ #include "ppp.h" #include "custom.h" /* * DEFINITIONS */ #define RBUF_SIZE 100 /* * INTERNAL FUNCTIONS */ static int CustomDoWhatever(int ac, char *av[], void *arg); static void RecordLinkUpDownReason2(Link l, int up, const char *key, const char *fmt, va_list args); /* * GLOBAL VARIABLES */ const struct cmdtab CustomCmds[] = { { "whatever [...]", "Do whatever", CustomDoWhatever, NULL, NULL }, { NULL }, }; struct in_range gIpcpExcludeRange; /* * CustomDoWhatever() */ static int CustomDoWhatever(int ac, char *av[], void *arg) { /* XXX do whatever */ return(0); } /* * SetStatus() * * Log port status to activity log */ void SetStatus(int code, const char *key, ...) { char buf[100]; va_list args; /* Set code depending on state of other links (if any) */ if (bund && bund->n_links > 1) { int k; lnk->lastStatus = code; for (k = 0; k < bund->n_links; k++) if (bund->links[k] != lnk && bund->links[k]->lastStatus == ADLG_WAN_CONNECTED) break; if (k < bund->n_links) code = ADLG_WAN_MESSAGE; } /* XXX do whatever */ va_start(args, key); vsnlcatf(buf, sizeof(buf), key, args); va_end(args); } /* * RecordLinkUpDown() * * This is called whenever the link itself goes up or down. * Its purpose is to follow more or less what telco usage charges would. * * We kludge here to make multiple links look like a single link. * * Argument: * * -1 The link went from up to down * 0 The link failed to connect * 1 The link has successfully connected */ void RecordLinkUpDown(int which) { char *const buf = (which == 1) ? lnk->upReason : lnk->downReason; /* For logging purposes, treat all links as a single link */ bund->numRecordUp += which; switch (which) { case -1: case 0: if (bund->numRecordUp != 0) return; break; case 1: if (bund->numRecordUp != 1) return; break; } /* XXX do whatever */ /* Reset this buffer in case next time we fail to put a reason in there */ if (buf) *buf = 0; } /* * RecordLinkUpDownReason() * * This is called whenever a reason for the link going up or * down has just become known. Record this reason so that when * the link actually goes up or down, we can record it. * * If this gets called more than once in the "down" case, * the first call prevails. */ void RecordLinkUpDownReason(Link l, int up, const char *key, const char *fmt, ...) { va_list args; int k; if (!bund) return; va_start(args, fmt); if (l == NULL) { for (k = 0; k < bund->n_links; k++) { if (bund && bund->links[k]) RecordLinkUpDownReason2(bund->links[k], up, key, fmt, args); } } else { RecordLinkUpDownReason2(l, up, key, fmt, args); } va_end(args); } static void RecordLinkUpDownReason2(Link l, int up, const char *key, const char *fmt, va_list args) { char **const cpp = up ? &l->upReason : &l->downReason; char *buf; /* Allocate buffer if necessary */ if (!*cpp) *cpp = Malloc(MB_UTIL, RBUF_SIZE); buf = *cpp; /* First "down" reason overrides later ones */ if (!up && *buf) return; /* Record reason */ snprintf(buf, RBUF_SIZE, "%s:", lcats(key)); if (fmt) vsnprintf(buf + strlen(buf), RBUF_SIZE - strlen(buf), fmt, args); }