This is duioctl.c in view mode; [Download] [Up]
/*
** Copyright (c) 1991 Bolt Beranek and Newman, Inc.
** All rights reserved.
**
** Redistribution and use in source and binary forms are permitted
** provided that: (1) source distributions retain this entire copyright
** notice and comment, and (2) distributions including binaries display
** the following acknowledgement: ``This product includes software
** developed by Bolt Beranek and Newman, Inc. and CREN/CSNET'' in the
** documentation or other materials provided with the distribution and in
** all advertising materials mentioning features or use of this software.
** Neither the name of Bolt Beranek and Newman nor CREN/CSNET may be used
** to endorse or promote products derived from this software without
** specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <sys/param.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <net/if_du.h>
#include "dialupip.h"
#define EQ(a, b) (strcmp((a), (b)) == 0)
typedef struct _FLAG {
char *Name;
int Value;
} FLAG;
static FLAG Flags[] = {
{ "ESCAPED ", DS_ESCAPED }, /* Saw a FRAME_ESCAPE */
{ "OACTIVE ", DS_OACTIVE }, /* Actively sending a packet */
{ "LWAITING ", DS_LWAITING }, /* Waiting for a tty */
{ "LACTIVE ", DS_LACTIVE}, /* Have active line */
{ "LDOWN ", DS_LDOWN }, /* Line gone or no perm to call */
{ "FAILCALL ", DS_FAILCALL }, /* Recently failed to call */
{ "MONITORON ", DS_MONITORON }, /* Monitoring activity */
{ "ENABLECALL", DS_ENABLECALL}, /* Line can initiating calls */
{ NULL }
};
static char *WHERE = "duioctl";
extern int optind;
extern char *strcpy();
static void
fatal(p)
char *p;
{
perror(p);
exit(1);
}
static void
printflags(i)
int i;
{
FLAG *fp;
for (fp = Flags; fp->Name; fp++)
(void)printf("\t%c%s\t 0x%04x\n",
(i & fp->Value) ? '*' : ' ', fp->Name, fp->Value);
}
static void
usage()
{
(void)printf("Usage: %s du# %s\n\t%s\n\t%s\n",
progname,
"[CLEARQ] [GWTIMEO] [SWTIMEO time] [GATIMEO] [SATIMEO time]",
"[GSOFTFLAGS] [SSOFTFLAGS val] [SSOFTTIMER time]",
"[BRINGUP] [ENABLECALL] [DISABLECALL]");
(void)printf("time is the number of seconds in decimal;\n");
(void)printf("SOFTFLAGS is a hex sum of the following:\n");
printflags(0);
exit(1);
}
static int
getnumber(param, value)
char *param;
char *value;
{
char *p;
if (value) {
while (*value && isspace(*value))
value++;
if (*value) {
for (p = value; *p && isdigit(*p); p++)
;
if (*p == '\0')
return atoi(value);
}
}
(void)fprintf(stderr, "Bad decimal number \"%s\" for %s.\n", value, param);
exit(1);
/* NOTREACHED */
}
main(argc, argv)
int argc;
char *argv[];
{
struct ifreq ifr;
int s;
int i;
char *device;
/* Set up. */
setprogname(argv[0]);
WHERE = progname;
(void)printf("%s %s\n", WHERE, dip_release());
/* Do we have command line arguments to use? */
while ((i = getopt(argc, argv, "")) != EOF)
switch (i) {
default:
usage();
/* NOTREACHED */
}
argc -= optind;
argv += optind;
if (*argv == NULL)
usage();
device = *argv;
/* Create a socket. */
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
fatal("Can't create socket");
(void)strcpy(ifr.ifr_name, device);
while (*++argv) {
#ifdef SIOCGIFMETRIC
if (EQ(*argv, "GIFMETRIC")) {
if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0)
fatal("Can't SIOCGIFMETRIC");
(void)printf("Metric value is %d\n", GETDATAVAL(ifr));
}
else
#endif
if (EQ(*argv,"GATIMEO")) {
if (ioctl(s, SIOCGATIMEO, (caddr_t)&ifr) < 0)
fatal("Can't SIOCGATIMEO");
(void)printf("ATIMEO value is %d seconds\n", GETDATAVAL(ifr));
}
else if (EQ(*argv, "GWTIMEO")) {
if (ioctl(s, SIOCGWTIMEO, (caddr_t)&ifr) < 0)
fatal("Can't SIOGWTIMEO");
(void)printf("WTIMEO value is %d seconds\n", GETDATAVAL(ifr));
}
else if (EQ(*argv, "SATIMEO")) {
i = getnumber(argv[0], argv[1]);
argv++;
SETDATAVAL(ifr, i);
if (ioctl(s, SIOCSATIMEO, (caddr_t)&ifr) < 0)
fatal("Can't SIOCSATIMEO");
d_log(DLOG_GENERAL, WHERE, "Set ATIMEO on \"%s\" to %d",
device, i);
(void)printf("Set ATIMEO to %d\n", s);
}
else if (EQ(*argv, "SWTIMEO")) {
i = getnumber(argv[0], argv[1]);
argv++;
SETDATAVAL(ifr, i);
if (ioctl(s, SIOCSWTIMEO, (caddr_t)&ifr) < 0)
fatal("Can't SIOCSWTIMEO");
d_log(DLOG_GENERAL, WHERE, "Set WTIMEO on \"%s\" to to %d",
device, i);
(void)printf("Set WTIMEO to %d\n", i);
}
else if (EQ(*argv,"SSOFTTIMER")) {
i = getnumber(argv[0], argv[1]);
argv++;
SETDATAVAL(ifr, i);
if (ioctl(s, SIOCSSOFTTIMER, (caddr_t)&ifr) < 0)
fatal("Can't SIOCSSOFTTIMER");
d_log(DLOG_GENERAL, WHERE, "Set SOFTTIMER on \"%s\" to %d",
i, device);
(void)printf("Set SOFTTIMER to %d\n", i);
}
else if (EQ(*argv, "ENABLECALL")) {
if (ioctl(s, SIOCGSOFTFLAGS, (caddr_t)&ifr) < 0)
fatal("Can't SIOCGSOFTFLAGS to enable call");
i = GETDATAVAL(ifr) | DS_ENABLECALL;
SETDATAVAL(ifr, i);
if (ioctl(s, SIOCSSOFTFLAGS, (caddr_t)&ifr) < 0)
fatal("Can't SIOCSSOFTFLAGS to enable call");
d_log(DLOG_GENERAL, WHERE, "Enabled calling on \"%s\"", device);
(void)printf("Enabled calling\n");
}
else if (EQ(*argv, "DISABLECALL")) {
if (ioctl(s, SIOCGSOFTFLAGS, (caddr_t)&ifr) < 0)
fatal("Can't SIOCGSOFTFLAGS to disable call");
i = GETDATAVAL(ifr) & ~DS_ENABLECALL;
SETDATAVAL(ifr, i);
if (ioctl(s, SIOCSSOFTFLAGS, (caddr_t)&ifr) < 0)
fatal("Can't SIOCSSOFTFLAGS to disable call");
d_log(DLOG_GENERAL, WHERE, "Disabled calling on \"%s\"", device);
(void)printf("Disabled calling\n");
}
else if (EQ(*argv, "GSOFTFLAGS")) {
if (ioctl(s, SIOCGSOFTFLAGS, (caddr_t)&ifr) < 0)
fatal("Can't SIOCGSOFTFLAGS");
i = GETDATAVAL(ifr);
(void)printf("SOFTFLAGS are set to 0x%x where values are:\n", i);
printflags(i);
}
else if (EQ(*argv, "SSOFTFLAGS")) {
if (*++argv == NULL) {
(void)fprintf(stderr, "Missing flag value for SSOFTFLAGS\n");
exit(1);
}
if (sscanf(*argv, "%x", &i) != 1) {
(void)fprintf(stderr, "Bad hex value for SSOFTFLAGS\n");
exit(1);
}
SETDATAVAL(ifr, i);
if (ioctl(s, SIOCSSOFTFLAGS, (caddr_t)&ifr) < 0)
fatal("Can't SIOCSSOFTFLAGS");
d_log(DLOG_GENERAL, WHERE, "Set SOFTFLAGS to 0x%x on %s",
i, device);
(void)printf("Set SOFTFLAGS to 0x%x\n", i);
}
else if (EQ(*argv, "CLEARQ")) {
if (ioctl(s, SIOCCLEARQ, (caddr_t)&ifr) < 0)
fatal("Can't SIOCLEARQ");
d_log(DLOG_GENERAL, WHERE, "Cleared output queue on \"%s\"",
device);
(void)printf("Cleared output queue\n");
}
else if (EQ(*argv, "FAILCALL")) {
if (ioctl(s, SIOCFAILCALL, (caddr_t)&ifr) < 0)
fatal("Can't SIOCFAILCALL");
d_log(DLOG_GENERAL, WHERE, "Marked failed call on \"%s\"", device);
(void)printf("Marked failed call\n");
}
else if (EQ(*argv, "BRINGUP")) {
if (ioctl(s, SIOCBRINGUP, (caddr_t)&ifr) < 0)
fatal("Can't SIOCBRINGUP");
d_log(DLOG_GENERAL, WHERE, "BRINGUP on \"%s\"", device);
(void)printf("Sent BRINGUP request\n");
}
else {
(void)printf("Unknown command \"%s\"\n", *argv);
usage();
}
}
exit(0);
/* NOTREACHED */
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.