X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fipxcp.c;h=760106306d406d2249b6fbc5c950093e76762064;hp=037491089a125217ce5b9e5d6224543b99755a06;hb=0375e3ce50b9e0bc4e559615039988e7834c7d01;hpb=267d970c5b322243e4efe12c41bed3a420380774 diff --git a/pppd/ipxcp.c b/pppd/ipxcp.c index 0374910..7601063 100644 --- a/pppd/ipxcp.c +++ b/pppd/ipxcp.c @@ -19,7 +19,7 @@ #ifdef IPX_CHANGE #ifndef lint -static char rcsid[] = "$Id: ipxcp.c,v 1.6 1998/03/25 03:08:16 paulus Exp $"; +static char rcsid[] = "$Id: ipxcp.c,v 1.9 1999/03/12 06:07:17 paulus Exp $"; #endif /* @@ -29,6 +29,8 @@ static char rcsid[] = "$Id: ipxcp.c,v 1.6 1998/03/25 03:08:16 paulus Exp $"; #include #include #include +#include +#include #include #include #include @@ -37,6 +39,7 @@ static char rcsid[] = "$Id: ipxcp.c,v 1.6 1998/03/25 03:08:16 paulus Exp $"; #include "fsm.h" #include "ipxcp.h" #include "pathnames.h" +#include "magic.h" /* global vars */ ipxcp_options ipxcp_wantoptions[NUM_PPP]; /* Options that we want to request */ @@ -83,6 +86,50 @@ static fsm_callbacks ipxcp_callbacks = { /* IPXCP callback routines */ "IPXCP" /* String name of protocol */ }; +/* + * Command-line options. + */ +static int setipxnode __P((char **)); +static int setipxname __P((char **)); + +static option_t ipxcp_option_list[] = { + { "ipx", o_bool, &ipxcp_protent.enabled_flag, + "Enable IPXCP (and IPX)", 1 }, + { "+ipx", o_bool, &ipxcp_protent.enabled_flag, + "Enable IPXCP (and IPX)", 1 }, + { "noipx", o_bool, &ipxcp_protent.enabled_flag, + "Disable IPXCP (and IPX)" }, + { "-ipx", o_bool, &ipxcp_protent.enabled_flag, + "Disable IPXCP (and IPX)" } , + { "ipx-network", o_int, &ipxcp_wantoptions[0].our_network, + "Set our IPX network number", 0, &ipxcp_wantoptions[0].neg_nn }, + { "ipxcp-accept-network", o_bool, &ipxcp_wantoptions[0].accept_network, + "Accept peer IPX network number", 1, + &ipxcp_allowoptions[0].accept_network }, + { "ipx-node", o_special, setipxnode, + "Set IPX node number" }, + { "ipxcp-accept-local", o_bool, &ipxcp_wantoptions[0].accept_local, + "Accept our IPX address", 1, + &ipxcp_allowoptions[0].accept_local }, + { "ipxcp-accept-remote", o_bool, &ipxcp_wantoptions[0].accept_remote, + "Accept peer's IPX address", 1, + &ipxcp_allowoptions[0].accept_remote }, + { "ipx-routing", o_int, &ipxcp_wantoptions[0].router, + "Set IPX routing proto number", 0, + &ipxcp_wantoptions[0].neg_router }, + { "ipx-router-name", o_special, setipxname, + "Set IPX router name" }, + { "ipxcp-restart", o_int, &ipxcp_fsm[0].timeouttime, + "Set timeout for IPXCP" }, + { "ipxcp-max-terminate", o_int, &ipxcp_fsm[0].maxtermtransmits, + "Set max #xmits for IPXCP term-reqs" }, + { "ipxcp-max-configure", o_int, &ipxcp_fsm[0].maxconfreqtransmits, + "Set max #xmits for IPXCP conf-reqs" }, + { "ipxcp-max-failure", o_int, &ipxcp_fsm[0].maxnakloops, + "Set max #conf-naks for IPXCP" }, + { NULL } +}; + /* * Protocol entry points. */ @@ -110,6 +157,7 @@ struct protent ipxcp_protent = { NULL, 0, "IPXCP", + ipxcp_option_list, NULL, NULL, NULL @@ -168,6 +216,87 @@ u_int32_t ipxaddr; } +static u_char * +setipxnodevalue(src,dst) +u_char *src, *dst; +{ + int indx; + int item; + + for (;;) { + if (!isxdigit (*src)) + break; + + for (indx = 0; indx < 5; ++indx) { + dst[indx] <<= 4; + dst[indx] |= (dst[indx + 1] >> 4) & 0x0F; + } + + item = toupper (*src) - '0'; + if (item > 9) + item -= 7; + + dst[5] = (dst[5] << 4) | item; + ++src; + } + return src; +} + +static int +setipxnode(argv) + char **argv; +{ + char *end; + + memset (&ipxcp_wantoptions[0].our_node[0], 0, 6); + memset (&ipxcp_wantoptions[0].his_node[0], 0, 6); + + end = setipxnodevalue (*argv, &ipxcp_wantoptions[0].our_node[0]); + if (*end == ':') + end = setipxnodevalue (++end, &ipxcp_wantoptions[0].his_node[0]); + + if (*end == '\0') { + ipxcp_wantoptions[0].neg_node = 1; + return 1; + } + + option_error("invalid parameter '%s' for ipx-node option", *argv); + return 0; +} + +static int +setipxname (argv) + char **argv; +{ + char *dest = ipxcp_wantoptions[0].name; + char *src = *argv; + int count; + char ch; + + ipxcp_wantoptions[0].neg_name = 1; + ipxcp_allowoptions[0].neg_name = 1; + memset (dest, '\0', sizeof (ipxcp_wantoptions[0].name)); + + count = 0; + while (*src) { + ch = *src++; + if (! isalnum (ch) && ch != '_') { + option_error("IPX router name must be alphanumeric or _"); + return 0; + } + + if (count >= sizeof (ipxcp_wantoptions[0].name)) { + option_error("IPX router name is limited to %d characters", + sizeof (ipxcp_wantoptions[0].name) - 1); + return 0; + } + + dest[count++] = toupper (ch); + } + + return 1; +} + /* * ipxcp_init - Initialize IPXCP. */ @@ -1212,38 +1341,38 @@ ipxcp_script(f, script) strproto_lcl[0] = '\0'; if (go->neg_router && ((go->router & BIT(IPX_NONE)) == 0)) { if (go->router & BIT(RIP_SAP)) - strcpy (strproto_lcl, "RIP "); + strlcpy (strproto_lcl, sizeof(strproto_lcl), "RIP "); if (go->router & BIT(NLSP)) - strcat (strproto_lcl, "NLSP "); + strlcat (strproto_lcl, sizeof(strproto_lcl), "NLSP "); } if (strproto_lcl[0] == '\0') - strcpy (strproto_lcl, "NONE "); + strlcpy (strproto_lcl, sizeof(strproto_lcl), "NONE "); strproto_lcl[strlen (strproto_lcl)-1] = '\0'; strproto_rmt[0] = '\0'; if (ho->neg_router && ((ho->router & BIT(IPX_NONE)) == 0)) { if (ho->router & BIT(RIP_SAP)) - strcpy (strproto_rmt, "RIP "); + strlcpy (strproto_rmt, sizeof(strproto_rmt), "RIP "); if (ho->router & BIT(NLSP)) - strcat (strproto_rmt, "NLSP "); + strlcat (strproto_rmt, sizeof(strproto_rmt), "NLSP "); } if (strproto_rmt[0] == '\0') - strcpy (strproto_rmt, "NONE "); + strlcpy (strproto_rmt, sizeof(strproto_rmt), "NONE "); strproto_rmt[strlen (strproto_rmt)-1] = '\0'; - strcpy (strnetwork, ipx_ntoa (go->network)); + strlcpy (strnetwork, sizeof(strnetwork), ipx_ntoa (go->network)); - sprintf (strlocal, - "%02X%02X%02X%02X%02X%02X", - NODE(go->our_node)); + slprintf (strlocal, sizeof(strlocal), + "%02X%02X%02X%02X%02X%02X", + NODE(go->our_node)); - sprintf (strremote, - "%02X%02X%02X%02X%02X%02X", - NODE(ho->his_node)); + slprintf (strremote, sizeof(strremote), + "%02X%02X%02X%02X%02X%02X", + NODE(ho->his_node)); argv[0] = script; argv[1] = ifname; @@ -1259,7 +1388,7 @@ ipxcp_script(f, script) argv[11] = ipparam; argv[12] = strpid; argv[13] = NULL; - run_program(script, argv, 0); + run_program(script, argv, 0, NULL, NULL); } /*