+ if( connect(sockfd, (struct sockaddr *) &serv_addr,
+ sizeof(serv_addr)) >= 0)
+ {
+ close(sockfd);
+ return Net_Connected; // we can connect, so we have a network!
+ }
+ else // failed to connect
+ {
+ if(errno == ENETUNREACH)
+ return Net_No; // network is unreachable
+ else
+ return Net_Unknown; // connect failed, but don't know why
+ }
+}
+
+
+int
+wxDialUpManagerImpl::CheckProcNet()
+{
+ // assume that the test doesn't work
+ int netDevice = NetDevice_Unknown;
+
+#ifdef __LINUX__
+ if (wxFileExists(_T("/proc/net/route")))
+ {
+ // cannot use wxFile::Length because file doesn't support seeking, so
+ // use stdio directly
+ FILE *f = fopen("/proc/net/route", "rt");
+ if (f != NULL)
+ {
+ // now we know that we will find all devices we may have
+ netDevice = NetDevice_None;
+
+ char output[256];
+
+ while (fgets(output, 256, f) != NULL)
+ {
+ if ( strstr(output, "eth") ) // network card
+ {
+ netDevice |= NetDevice_LAN;
+ }
+ else if (strstr(output,"ppp") // ppp
+ || strstr(output,"sl") // slip
+ || strstr(output,"pl")) // plip
+ {
+ netDevice |= NetDevice_Modem;
+ }
+ }
+
+ fclose(f);
+ }
+ }
+#endif // __LINUX__
+
+ return netDevice;
+}
+
+
+int
+wxDialUpManagerImpl::CheckIfconfig()
+{
+#ifdef __VMS
+ m_CanUseIfconfig = 0;
+ return -1;
+#else
+ // assume that the test doesn't work
+ int netDevice = NetDevice_Unknown;
+
+ // first time check for ifconfig location
+ if ( m_CanUseIfconfig == -1 ) // unknown
+ {
+ static const wxChar *ifconfigLocations[] =
+ {
+ _T("/sbin"), // Linux, FreeBSD
+ _T("/usr/sbin"), // SunOS, Solaris, AIX, HP-UX
+ _T("/usr/etc"), // IRIX
+ };
+
+ for ( size_t n = 0; n < WXSIZEOF(ifconfigLocations); n++ )
+ {
+ wxString path(ifconfigLocations[n]);
+ path << _T("/ifconfig");
+
+ if ( wxFileExists(path) )
+ {
+ m_IfconfigPath = path;
+ break;
+ }
+ }
+ }
+
+ if ( m_CanUseIfconfig != 0 ) // unknown or yes
+ {
+ wxLogNull ln; // suppress all error messages
+
+ wxASSERT_MSG( m_IfconfigPath.length(),
+ _T("can't use ifconfig if it wasn't found") );
+
+ wxString tmpfile = wxGetTempFileName("_wxdialuptest");
+ wxString cmd = "/bin/sh -c \'";
+ cmd << m_IfconfigPath;
+#if defined(__SOLARIS__) || defined (__SUNOS__)
+ // need to add -a flag
+ cmd << " -a";
+#elif defined(__LINUX__) || defined(__SGI__)
+ // nothing to be added to ifconfig
+#elif defined(__FREEBSD__) || defined(__WXMAC__)
+ // add -l flag
+ cmd << " -l";
+#elif defined(__HPUX__)
+ // VZ: a wild guess (but without it, ifconfig fails completely)
+ cmd << _T(" ppp0");
+#else
+# pragma warning "No ifconfig information for this OS."
+ m_CanUseIfconfig = 0;
+ return -1;
+#endif
+ cmd << " >" << tmpfile << '\'';
+ /* I tried to add an option to wxExecute() to not close stdout,
+ so we could let ifconfig write directly to the tmpfile, but
+ this does not work. That should be faster, as it doesn´t call
+ the shell first. I have no idea why. :-( (KB) */
+ if ( wxExecute(cmd,TRUE /* sync */) == 0 )
+ {
+ m_CanUseIfconfig = 1;
+ wxFFile file;
+ if( file.Open(tmpfile) )
+ {
+ wxString output;
+ if ( file.ReadAll(&output) )
+ {
+ // FIXME shouldn't we grep for "^ppp"? (VZ)
+
+ bool hasModem = FALSE,
+ hasLAN = FALSE;
+
+#if defined(__SOLARIS__) || defined (__SUNOS__)
+ // dialup device under SunOS/Solaris
+ hasModem = strstr(output,"ipdptp") != (char *)NULL;
+ hasLAN = strstr(output, "hme") != (char *)NULL;
+#elif defined(__LINUX__) || defined (__FREEBSD__)
+ hasModem = strstr(output,"ppp") // ppp
+ || strstr(output,"sl") // slip
+ || strstr(output,"pl"); // plip
+ hasLAN = strstr(output, "eth") != NULL;
+#elif defined(__SGI__) // IRIX
+ hasModem = strstr(output, "ppp") != NULL; // PPP
+#elif defined(__HPUX__)
+ // if could run ifconfig on interface, then it exists
+ hasModem = TRUE;
+#endif
+
+ netDevice = NetDevice_None;
+ if ( hasModem )
+ netDevice |= NetDevice_Modem;
+ if ( hasLAN )
+ netDevice |= NetDevice_LAN;
+ }
+ //else: error reading the file
+ }
+ //else: error opening the file
+ }
+ else // could not run ifconfig correctly
+ {
+ m_CanUseIfconfig = 0; // don´t try again
+ }
+
+ (void) wxRemoveFile(tmpfile);
+ }
+
+ return netDevice;