diff -u usb.cpp.orig usb.cpp --- usb.cpp.orig 2007-11-10 05:19:31.000000000 +0900 +++ usb.cpp 2008-03-17 01:58:48.000000000 +0900 @@ -45,11 +45,18 @@ #include #include #include +#include #include #include +#include +#include +#include #include +#define MAXWAITDEV 10 /* sec */ +#define MAXWAITPPP 20 /* sec */ + Dialup::Dialup( QWidget* parent ) : DialupBase(parent,0,TRUE) { @@ -246,9 +253,97 @@ return FALSE; } +static bool waitdev( const char *dev ) +{ + struct stat st; + int i; + + for (i = 0; i < MAXWAITDEV; i++) { + if (stat(dev, &st) >= 0) return TRUE; + if (errno != ENOENT) break; + sleep(1); + } + + return FALSE; +} + +static int findppp( const char *iface, int s ) +{ + struct ifreq *ifr; + struct ifconf ifc; + char *cp, *buf; + int len, total; + + len = sizeof(*ifr); + total = 0; + buf = (char *)malloc(len); + if (!buf) return -1; + + for (;;) { + ifc.ifc_buf = buf; + ifc.ifc_len = len; + if (ioctl(s, SIOCGIFCONF, &ifc) >= 0) { + total = ifc.ifc_len; + if (total < len) break; + } + else if (errno != EINVAL || total > 0) { + free(buf); + return -1; + } + + len *= 2; + cp = (char *)realloc(buf, len); + if (!cp) { + if (buf) free(buf); + return -1; + } + buf = cp; + } + + cp = buf; + while (cp < &(buf[total])) { + ifr = (struct ifreq *)cp; + if (ifr -> ifr_addr.sa_family == AF_INET) { + if (!strcmp(iface, ifr -> ifr_name)) { + free(buf); + return 1; + } + } + cp += sizeof(ifr -> ifr_name); +#ifdef AF_INET6 + if (ifr -> ifr_addr.sa_family == AF_INET6) + cp += sizeof(struct sockaddr_in6); + else +#endif + cp += sizeof(struct sockaddr); + } + free(buf); + + return 0; +} + +static int waitppp( const char *iface ) +{ + int i, n, s; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) return -1; + + n = 0; + for (i = 0; i < MAXWAITPPP; i++) { + n = findppp(iface, s); + if (n) break; + sleep(1); + } + close(s); + + return n; +} + static QString dev( const QString& ct ) { // ----NetIndex ADD ST ---- + if (waitdev("/dev/ttyJACM0")) return QString( "ttyJACM0" ); // ----NetIndex ADD ED ---- // ----NetIndex DEL ST ---- @@ -273,7 +368,7 @@ // fclose(f); // } // } -// return QString::null; + return QString::null; // ----NetIndex DEL ED ---- } @@ -448,6 +543,7 @@ cfg.setGroup("Properties"); int dialmode = cfg.readNumEntry("dialmode",0); (void)new PppMon(dialmode==2); + if (waitppp("ppp0") <= 0) return FALSE; return TRUE; }