* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define RCSID "$Id: sys-solaris.c,v 1.14 2005/05/04 21:31:20 carlsonj Exp $"
+#define RCSID "$Id: sys-solaris.c,v 1.16 2008/01/30 14:26:53 carlsonj Exp $"
#include <limits.h>
#include <stdio.h>
#define UDP6_DEV_NAME "/dev/udp6"
#endif /* !defined(UDP6_DEV_NAME) && defined(SOL2) */
-static const char rcsid[] = RCSID;
#if defined(SOL2)
/*
l.lifr_addr = laddr; \
} while (0)
+#define _IN6A_LLX_FROM_EUI64(s, eui64, as) do { \
+ s->s6_addr32[0] = htonl(as); \
+ eui64_copy(eui64, s->s6_addr32[2]); \
+ } while (0)
+
#define IN6_LLADDR_FROM_EUI64(l, s, eui64) \
_IN6_LLX_FROM_EUI64(l, s, eui64, 0xfe800000)
#define IN6_LLTOKEN_FROM_EUI64(l, s, eui64) \
_IN6_LLX_FROM_EUI64(l, s, eui64, 0)
+#define IN6A_LLADDR_FROM_EUI64(s, eui64) \
+ _IN6A_LLX_FROM_EUI64(s, eui64, 0xfe800000)
+
#endif /* defined(INET6) && defined(SOL2) */
#if defined(INET6) && defined(SOL2)
static int if_is_up; /* Interface has been marked up */
static u_int32_t remote_addr; /* IP address of peer */
static u_int32_t default_route_gateway; /* Gateway for default route added */
+static eui64_t default_route_gateway6; /* Gateway for default IPv6 route added */
static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
/* Prototypes for procedures local to this file. */
sifdown(0);
if (default_route_gateway)
cifdefaultroute(0, default_route_gateway, default_route_gateway);
+ if (default_route_gateway6)
+ cif6defaultroute(0, default_route_gateway6, default_route_gateway6);
if (proxy_arp_addr)
cifproxyarp(0, proxy_arp_addr);
#if defined(SOL2)
}
#endif
+ if (stop_bits >= 2)
+ tios.c_cflag |= CSTOPB;
+
tios.c_cflag |= CS8 | CREAD | HUPCL;
if (local || !modem)
tios.c_cflag |= CLOCAL;
return 1;
}
+/*
+ * sif6defaultroute - assign a default route through the address given.
+ */
+int
+sif6defaultroute(u, l, g)
+ int u;
+ eui64_t l, g;
+{
+ struct rtentry rt;
+
+#if defined(__USLC__)
+ g = l; /* use the local address as gateway */
+#endif
+ memset(&rt, 0, sizeof(rt));
+ memset(&rt.rtmsg_dst, 0, sizeof(rt.rtmsg_dst));
+ rt.rtmsg_dst_len = 0;
+ IN6A_LLADDR_FROM_EUI64(&rt.rtmsg_gateway, g);
+ rt.rtmsg_flags = RTF_GATEWAY;
+
+ if (ioctl(ip6fd, SIOCADDRT, &rt) < 0) {
+ error("Can't add default route: %m");
+ return 0;
+ }
+
+ default_route_gateway6 = g;
+ return 1;
+}
+
+/*
+ * cif6defaultroute - delete a default route through the address given.
+ */
+int
+cif6defaultroute(u, l, g)
+ int u;
+ eui64_t l, g;
+{
+ struct rtentry rt;
+
+#if defined(__USLC__)
+ g = l; /* use the local address as gateway */
+#endif
+ memset(&rt, 0, sizeof(rt));
+ memset(&rt.rtmsg_dst, 0, sizeof(rt.rtmsg_dst));
+ rt.rtmsg_dst_len = 0;
+ IN6A_LLADDR_FROM_EUI64(&rt.rtmsg_gateway, g);
+ rt.rtmsg_flags = RTF_GATEWAY;
+
+ if (ioctl(ip6fd, SIOCDELRT, &rt) < 0) {
+ error("Can't delete default route: %m");
+ return 0;
+ }
+
+ default_route_gateway6 = 0;
+ return 1;
+}
+
#endif /* defined(SOL2) && defined(INET6) */
char *name;
struct sockaddr *hwaddr;
{
- char *p, *q;
+ char *q;
int unit, iffd, adrlen;
unsigned char *adrp;
char ifdev[24];
if (name[0] != 0) {
/* logging in */
strncpy(utmpx.ut_user, name, sizeof(utmpx.ut_user));
- strncpy(utmpx.ut_id, ifname, sizeof(utmpx.ut_id));
strncpy(utmpx.ut_line, line, sizeof(utmpx.ut_line));
+ strncpy(utmpx.ut_host, host, sizeof(utmpx.ut_host));
+ if (*host != '\0') {
+ utmpx.ut_syslen = strlen(host) + 1;
+ if (utmpx.ut_syslen > sizeof(utmpx.ut_host))
+ utmpx.ut_syslen = sizeof(utmpx.ut_host);
+ }
utmpx.ut_pid = getpid();
utmpx.ut_type = USER_PROCESS;
} else {
{
int mfd, sfd;
char *pty_name;
- struct termios tios;
mfd = open("/dev/ptmx", O_RDWR);
if (mfd < 0) {