+#ifdef HAVE_SOLARIS
+ ppa = 0;
+
+ ptr = tapfname;
+ while(*ptr && !isdigit((int)*ptr)) ptr++;
+ ppa = atoi(ptr);
+
+ if( (ip_fd = open("/dev/ip", O_RDWR, 0)) < 0){
+ syslog(LOG_ERR, _("Could not open /dev/ip: %m"));
+ return -1;
+ }
+
+ /* Assign a new PPA and get its unit number. */
+ if( (ppa = ioctl(nfd, TUNNEWPPA, ppa)) < 0){
+ syslog(LOG_ERR, _("Can't assign new interface: %m"));
+ return -1;
+ }
+
+ if( (if_fd = open(tapfname, O_RDWR, 0)) < 0){
+ syslog(LOG_ERR, _("Could not open %s twice: %m"), tapfname);
+ return -1;
+ }
+
+ if(ioctl(if_fd, I_PUSH, "ip") < 0){
+ syslog(LOG_ERR, _("Can't push IP module: %m"));
+ return -1;
+ }
+
+ /* Assign ppa according to the unit number returned by tun device */
+ if(ioctl(if_fd, IF_UNITSEL, (char *)&ppa) < 0){
+ syslog(LOG_ERR, _("Can't set PPA %d: %m"), ppa);
+ return -1;
+ }
+
+ if(ioctl(ip_fd, I_LINK, if_fd) < 0){
+ syslog(LOG_ERR, _("Can't link TUN device to IP: %m"));
+ return -1;
+ }
+
+ syslog(LOG_INFO, _("%s is a tun/tap device"), tapfname);
+#endif
+