diff options
Diffstat (limited to 'usr.sbin/ppp/command.c')
| -rw-r--r-- | usr.sbin/ppp/command.c | 91 |
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) { |
