summaryrefslogtreecommitdiff
path: root/usr.sbin/ppp/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ppp/command.c')
-rw-r--r--usr.sbin/ppp/command.c91
1 files changed, 77 insertions, 14 deletions
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c
index 120d1a25a415..99753c3cfe0e 100644
--- a/usr.sbin/ppp/command.c
+++ b/usr.sbin/ppp/command.c
@@ -47,12 +47,13 @@
#include <unistd.h>
#ifndef NONAT
-#ifdef __FreeBSD__
-#include <alias.h>
-#else
+#ifdef LOCALNAT
#include "alias.h"
+#else
+#include <alias.h>
#endif
#endif
+
#include "layer.h"
#include "defs.h"
#include "command.h"
@@ -435,6 +436,10 @@ command_Expand(char **nargv, int argc, char const *const *oargv,
bundle->ncp.mp.cfg.enddisc.len));
nargv[arg] = subst(nargv[arg], "PROCESSID", pidstr);
nargv[arg] = subst(nargv[arg], "LABEL", bundle_GetLabel(bundle));
+ nargv[arg] = subst(nargv[arg], "DNS0",
+ inet_ntoa(bundle->ncp.ipcp.ns.dns[0]));
+ nargv[arg] = subst(nargv[arg], "DNS1",
+ inet_ntoa(bundle->ncp.ipcp.ns.dns[1]));
}
nargv[arg] = NULL;
}
@@ -553,6 +558,29 @@ FgShellCommand(struct cmdargs const *arg)
return ShellCommand(arg, 0);
}
+static int
+ResolvCommand(struct cmdargs const *arg)
+{
+ if (arg->argc == arg->argn + 1) {
+ if (!strcasecmp(arg->argv[arg->argn], "reload"))
+ ipcp_LoadDNS(&arg->bundle->ncp.ipcp);
+ else if (!strcasecmp(arg->argv[arg->argn], "restore"))
+ ipcp_RestoreDNS(&arg->bundle->ncp.ipcp);
+ else if (!strcasecmp(arg->argv[arg->argn], "rewrite"))
+ ipcp_WriteDNS(&arg->bundle->ncp.ipcp);
+ else if (!strcasecmp(arg->argv[arg->argn], "readonly"))
+ arg->bundle->ncp.ipcp.ns.writable = 0;
+ else if (!strcasecmp(arg->argv[arg->argn], "writable"))
+ arg->bundle->ncp.ipcp.ns.writable = 1;
+ else
+ return -1;
+
+ return 0;
+ }
+
+ return -1;
+}
+
#ifndef NONAT
static struct cmdtab const AliasCommands[] =
{
@@ -672,6 +700,8 @@ static struct cmdtab const Commands[] = {
"Remove a link", "remove"},
{"rename", "mv", RenameCommand, LOCAL_AUTH | LOCAL_CX,
"Rename a link", "rename name"},
+ {"resolv", NULL, ResolvCommand, LOCAL_AUTH,
+ "Manipulate resolv.conf", "resolv readonly|reload|restore|rewrite|writable"},
{"save", NULL, SaveCommand, LOCAL_AUTH,
"Save settings", "save"},
{"set", "setup", SetCommand, LOCAL_AUTH | LOCAL_CX_OPT,
@@ -905,6 +935,18 @@ FindExec(struct bundle *bundle, struct cmdtab const *cmds, int argc, int argn,
}
int
+command_Expand_Interpret(char *buff, int nb, char *argv[MAXARGS], int offset)
+{
+ char buff2[LINE_LEN-offset];
+
+ InterpretArg(buff, buff2);
+ strncpy(buff, buff2, LINE_LEN - offset - 1);
+ buff[LINE_LEN - offset - 1] = '\0';
+
+ return command_Interpret(buff, nb, argv);
+}
+
+int
command_Interpret(char *buff, int nb, char *argv[MAXARGS])
{
char *cp;
@@ -983,7 +1025,7 @@ command_Decode(struct bundle *bundle, char *buff, int nb, struct prompt *prompt,
int argc;
char *argv[MAXARGS];
- if ((argc = command_Interpret(buff, nb, argv)) < 0)
+ if ((argc = command_Expand_Interpret(buff, nb, argv, 0)) < 0)
return 0;
command_Run(bundle, argc, (char const *const *)argv, prompt, label, NULL);
@@ -1668,12 +1710,13 @@ SetVariable(struct cmdargs const *arg)
case VAR_NBNS:
case VAR_DNS:
- if (param == VAR_DNS)
+ if (param == VAR_DNS) {
addr = arg->bundle->ncp.ipcp.cfg.ns.dns;
- else
+ addr[0].s_addr = addr[1].s_addr = INADDR_NONE;
+ } else {
addr = arg->bundle->ncp.ipcp.cfg.ns.nbns;
-
- addr[0].s_addr = addr[1].s_addr = INADDR_ANY;
+ addr[0].s_addr = addr[1].s_addr = INADDR_ANY;
+ }
if (arg->argc > arg->argn) {
ParseAddr(&arg->bundle->ncp.ipcp, arg->argv[arg->argn],
@@ -1682,10 +1725,14 @@ SetVariable(struct cmdargs const *arg)
ParseAddr(&arg->bundle->ncp.ipcp, arg->argv[arg->argn + 1],
addr + 1, &dummyaddr, &dummyint);
- if (addr[1].s_addr == INADDR_ANY)
- addr[1].s_addr = addr[0].s_addr;
- if (addr[0].s_addr == INADDR_ANY)
+ if (addr[0].s_addr == INADDR_ANY) {
addr[0].s_addr = addr[1].s_addr;
+ addr[1].s_addr = INADDR_ANY;
+ }
+ if (addr[0].s_addr == INADDR_NONE) {
+ addr[0].s_addr = addr[1].s_addr;
+ addr[1].s_addr = INADDR_NONE;
+ }
}
break;
@@ -1903,8 +1950,8 @@ static struct cmdtab const SetCommands[] = {
{"lcpretry", "lcpretries", SetVariable, LOCAL_AUTH | LOCAL_CX, "LCP retries",
"set lcpretry value [attempts]", (const void *)VAR_LCPRETRY},
{"log", NULL, log_SetLevel, LOCAL_AUTH, "log level",
- "set log [local] [+|-]async|cbcp|ccp|chat|command|connect|debug|hdlc|id0|"
- "ipcp|lcp|lqm|phase|physical|sync|tcp/ip|timer|tun..."},
+ "set log [local] [+|-]async|cbcp|ccp|chat|command|connect|debug|dns|hdlc|"
+ "id0|ipcp|lcp|lqm|phase|physical|sync|tcp/ip|timer|tun..."},
{"login", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX,
"login script", "set login chat-script", (const void *) VAR_LOGIN},
{"logout", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX,
@@ -1968,7 +2015,7 @@ SetCommand(struct cmdargs const *arg)
arg->prompt, arg->cx);
else if (arg->prompt)
prompt_Printf(arg->prompt, "Use `set ?' to get a list or `set ? <var>' for"
- " syntax help.\n");
+ " syntax help.\n");
else
log_Printf(LogWARN, "set command must have arguments\n");
@@ -1998,6 +2045,10 @@ AddCommand(struct cmdargs const *arg)
addrs = ROUTE_DSTMYADDR;
else if (!strncasecmp(arg->argv[arg->argn], "HISADDR", 7))
addrs = ROUTE_DSTHISADDR;
+ else if (!strncasecmp(arg->argv[arg->argn], "DNS0", 4))
+ addrs = ROUTE_DSTDNS0;
+ else if (!strncasecmp(arg->argv[arg->argn], "DNS1", 4))
+ addrs = ROUTE_DSTDNS1;
}
gw = 1;
} else {
@@ -2007,6 +2058,12 @@ AddCommand(struct cmdargs const *arg)
} else if (strcasecmp(arg->argv[arg->argn], "HISADDR") == 0) {
addrs = ROUTE_DSTHISADDR;
dest = arg->bundle->ncp.ipcp.peer_ip;
+ } else if (strcasecmp(arg->argv[arg->argn], "DNS0") == 0) {
+ addrs = ROUTE_DSTDNS0;
+ dest = arg->bundle->ncp.ipcp.ns.dns[0];
+ } else if (strcasecmp(arg->argv[arg->argn], "DNS1") == 0) {
+ addrs = ROUTE_DSTDNS1;
+ dest = arg->bundle->ncp.ipcp.ns.dns[1];
} else
dest = GetIpAddr(arg->argv[arg->argn]);
netmask = GetIpAddr(arg->argv[arg->argn+1]);
@@ -2045,6 +2102,12 @@ DeleteCommand(struct cmdargs const *arg)
} else if (strcasecmp(arg->argv[arg->argn], "HISADDR") == 0) {
dest = arg->bundle->ncp.ipcp.peer_ip;
addrs = ROUTE_DSTHISADDR;
+ } else if (strcasecmp(arg->argv[arg->argn], "DNS0") == 0) {
+ dest = arg->bundle->ncp.ipcp.ns.dns[0];
+ addrs = ROUTE_DSTDNS0;
+ } else if (strcasecmp(arg->argv[arg->argn], "DNS1") == 0) {
+ dest = arg->bundle->ncp.ipcp.ns.dns[1];
+ addrs = ROUTE_DSTDNS1;
} else {
dest = GetIpAddr(arg->argv[arg->argn]);
if (dest.s_addr == INADDR_NONE) {