-rw-r--r-- | noncore/net/opie-smb/qsmb.cpp | 198 | ||||
-rw-r--r-- | noncore/net/opie-smb/qsmb.h | 22 | ||||
-rw-r--r-- | noncore/net/opie-smb/qsmbbase.ui | 59 |
3 files changed, 170 insertions, 109 deletions
diff --git a/noncore/net/opie-smb/qsmb.cpp b/noncore/net/opie-smb/qsmb.cpp index 422b9f3..b978b46 100644 --- a/noncore/net/opie-smb/qsmb.cpp +++ b/noncore/net/opie-smb/qsmb.cpp @@ -1,374 +1,408 @@ #include "qsmb.h" #include <qpushbutton.h> #include <qpe/qpeapplication.h> #include <string.h> #include <qstring.h> #include <qstringlist.h> #include <qdir.h> #include <qfileinfo.h> +#include <qtabwidget.h> #include <qpe/process.h> #include <qlabel.h> #include <qlineedit.h> #include <qcombobox.h> #include <qstringlist.h> #include <qcheckbox.h> #include <qtextview.h> #include <qmessagebox.h> #include <qtextstream.h> #include <pthread.h> #include <signal.h> #include <ctype.h> #include <netinet/in.h> #include <arpa/inet.h> - #include <rpc/clnt.h> +#include <sys/vfs.h> +#include <mntent.h> -#include <opie2/odebug.h> -using namespace Opie::Core; +// #include <opie2/odebug.h> +// using namespace Opie::Core; Qsmb::Qsmb( QWidget* parent, const char* name, WFlags fl ) : FormQPESMBBase( parent, name, fl ) { connect(CBHost, SIGNAL(activated(int)), this, SLOT(hostSelected(int))); connect(DoItBtn, SIGNAL(clicked()), this, SLOT(DoItClicked())); + connect(UnmountBtn, SIGNAL(clicked()), this, SLOT(umountIt())); connect(BtnScan, SIGNAL(clicked()), this, SLOT(scanClicked())); connect(BtnClear, SIGNAL(clicked()), this, SLOT(clear())); + mountpt->setEditable(true); mountpt->insertItem("/mnt/samba1",-1); mountpt->insertItem("/mnt/samba2",-1); mountpt->insertItem("/mnt/samba3",-1); - + +// TextViewOutput + top_element = NULL; scanning = false; } Qsmb::~Qsmb() { } void Qsmb::clear() { if (scanning) return; ListViewScan->clear(); TextViewOutput->setText(""); top_element = NULL; } void Qsmb::scanClicked() { if (scanning) return; pthread_create(&tpid, NULL, runit, (void *)this); } void Qsmb::DoItClicked() { - if(! ListViewScan->selectedItem()) { + if( !ListViewScan->selectedItem()) { QMessageBox::warning(this, tr("Error"),tr("<p>No share selected!</p>")); return; } if (scanning) return; pthread_create(&tpid, NULL, runitm, (void *)this); } void* runit(void* arg) { Qsmb* caller = (Qsmb*)arg; caller->scan(); return(0); } void* runitm(void* arg) { Qsmb* caller = (Qsmb*)arg; caller->DoIt(); return(0); } void Qsmb::scan() { -// int i; - if (scanning) return; scanning = true; QString match; QString cmd; LScan->setText("Scanning..."); qApp->processEvents(); sockaddr_in my_addr; get_myaddress( &my_addr); QString ip = inet_ntoa( my_addr.sin_addr); - owarn << "IP Address : " << ip<< oendl; + qWarning("IP Address : "+ip); match = ip.left(5); QStringList ccmd; TextViewOutput->append("smbfind"); QFile lmhosts("/etc/samba/lmhosts"); QTextStream lms(&lmhosts); lmhosts.open(IO_WriteOnly); lms << "127.0.0.1 localhost\n"; /* parse output and display in ListViewScan */ ccmd = "smbfind"; runCommand(ccmd); QTextStream s(&out, IO_ReadOnly); while ( !s.atEnd() ) { QString ip_addr, host, output; QString tmp = s.readLine(); bool ok; tmp.left(1).toInt( &ok, 10 ); if(ok) { QStringList token = QStringList::split(' ', tmp ); ip_addr = token[0]; host = token[1]; CBHost->insertItem( host, -1); lms << ip_addr+" "+host+"\n"; } } lmhosts.close(); TextViewOutput->append("\n\n============================================\n"); LScan->setText(""); scanning = false; } -void Qsmb::hostSelected(int index) +void Qsmb::hostSelected(int /*index*/ ) { - owarn << "hostSelected" << oendl; QListViewItem *element; - QListViewItem *parent; +// QListViewItem *parent; QString text = CBHost->currentText(); + ListViewScan->clear(); if (scanning) return; scanning = true; QString cmd; QStringList ccmd; LScan->setText("Scanning..."); ccmd << "/usr/bin/smbclient"; ccmd << "-L"; ccmd << CBHost->currentText(); ccmd << "-N"; if(username->text().isEmpty()) { //do nothing } else { ccmd << "-U"; ccmd << username->text()+"\%"+ password->text(); } runCommand(ccmd); QTextStream s(&out, IO_ReadOnly); while ( !s.atEnd() ) { QString share; QString comment; QString tmp = s.readLine(); if( tmp.find("$") == -1 && tmp.find("Disk") != -1) { QStringList token = QStringList::split(' ', tmp ); share = token[0]; comment = token[2]; - element = new QListViewItem(ListViewScan,share, comment); + share = share.stripWhiteSpace(); + comment = comment.stripWhiteSpace(); + element = new QListViewItem(ListViewScan, share, comment); element->setOpen(true); // top_element = element; // parent = element; } } // owarn << "i="<< index << "cmd:" << cmd << oendl; TextViewOutput->append(cmd); /* run smbclient & read output */ // if ((pipe = popen(cmd.latin1(), "r")) == NULL) { // snprintf(result, 256, "Error: Can't run %s", cmd.latin1()); // // cmd = "Error: Can't run "+cmd; // TextViewOutput->append(result); // return; // } /* parse output and display in ListViewScan */ // while(fgets(result, 256, pipe) != NULL) { // /* put result into TextViewOutput */ // TextViewOutput->append(result); // if( strchr(result, '$') == NULL ) { // char share[256], *ptr1; // strcpy(share,result); // ptr1 = strchr(share,' '); // share[ptr1 - share]='\0'; // owarn<< "add share: " << share << oendl; // if(top_element != NULL) { // bool found = false; // element = top_element; // while(element != NULL && !found) { // if(strcmp( element->text(0).ascii(), share)==0) { // parent = element; // found = true; // } // element = element->nextSibling(); // } // if(!found) { // element = new QListViewItem(ListViewScan,share); // element->setOpen(true); // parent=element; // } // } else { // element = new QListViewItem(ListViewScan,share); // element->setOpen(true); // top_element = element; // parent = element; // } // } // } TextViewOutput->append("\n\n============================================\n"); LScan->setText(""); scanning = false; } + void Qsmb::DoIt() { + QListViewItem *element; element = ListViewScan->selectedItem(); if(!element) { - QMessageBox::warning(this, tr("Error!!"),tr("<p><b>No</b> share selected!!</p>")); return; } if (scanning) return; scanning = true; - int i; - bool err = false; + QString mount = mountpt->currentText(); + if(isMounted(mount)) { + qWarning(mount +" is already mounted"); + TextViewOutput->append(mount +" is already mounted"); + return; + } + + bool noerr = false; - char share[512]; + QString share; QString cmd; QString cmd2; - char result[256]; -// QString result; QString text = mountpt->currentText(); - - FILE *pipe,*pipe2; + QStringList ccmd; LScan->setText("Mounting..."); qApp->processEvents(); - - if(! QFileInfo(text).exists()) { - QStringList ccmd; + if( !QFileInfo(text).exists()) { ccmd << "mkdir"; ccmd << "-p"; ccmd << text; - owarn<<"cmd: "<< ccmd << oendl; + qWarning( "cmd: "+ ccmd.join(" ")); runCommand(ccmd); } + share = element->text(0); + qWarning("selected share is "+share); - strcpy(share,(const char *)element->text(0)); - - for(i = 0; i < 256; i++) { - if(isalpha( share[i])) { - strcpy( share, share + i); - break; - } - } - - cmd = "/usr/bin/smbmount //"+CBHost->currentText()+"/"+share+" "+mountpt->currentText()+" -o username="+username->text()+",password="+password->text(); - - owarn << "cmd: " << cmd << oendl; - TextViewOutput->append(cmd.latin1()); + QString service = CBHost->currentText(); + service = service.stripWhiteSpace(); + if(mount.left(1) != "/") + mount = QDir::currentDirPath()+"/"+mount; + mount = mount.stripWhiteSpace(); + ccmd.clear(); + + ccmd << "/usr/bin/smbmount"; + ccmd << "//"+ service+"/"+share; + ccmd << mount; + ccmd << "-o"; + ccmd << "username="+username->text()+",password="+password->text()+""; + TextViewOutput->append(ccmd.join(" ").latin1()); if(onbootBtn->isChecked()) { - owarn << "Saving Setting permanently..." << oendl; - cmd2 = "echo '" + cmd + "'>/opt/QtPalmtop/etc/samba.env"; - /* run command & read output */ - if ((pipe = popen(cmd2.latin1(), "r")) == NULL) { - snprintf(result, 256, "Error: Can't run %s", cmd.latin1()); - return; - } - /* parse output and display in ListViewScan */ - while(fgets(result, 256, pipe) != NULL) { - } - } - - - /* run command & read output */ - if ((pipe = popen(cmd.latin1(), "r")) == NULL) { - snprintf(result, 256, "Error: Can't run %s", cmd.latin1()); - TextViewOutput->append(result); - return; - } - - /* parse output and display in ListViewScan */ - while(fgets(result, 256, pipe) != NULL) { - /* put result into TextViewOutput */ - TextViewOutput->append(result); + qWarning("Saving Setting permanently..."); + QFile sambenv("/opt/QtPalmtop/etc/samba.env"); + QTextStream smbv(&sambenv); + sambenv.open(IO_WriteOnly); + smbv << ccmd.join(" ") ; + sambenv.close(); } + noerr = runCommand(ccmd); - TextViewOutput->append("\n\n================CheckMounts==================\n"); LScan->setText(""); - cmd = "/bin/mount 2>&1"; - owarn << "cmd: " << cmd << oendl; - - if ((pipe2 = popen(cmd.latin1(), "r")) == NULL) { + if(noerr) { + element->setText(2, mount); + TextViewOutput->append("\n\n================CheckMounts==================\n"); + ccmd = "/bin/mount"; + runCommand(ccmd); + TextViewOutput->append("\n\n============================================\n"); + qApp->processEvents(); + } else { + //do nothing + } - snprintf(result, 256, "Error: Can't run %s", cmd.latin1()); -// result = "Error: Can't run "+ cmd; + scanning = false; +} - TextViewOutput->append(result); +void Qsmb::umountIt() +{ + QString mount = mountpt->currentText(); + if(!isMounted(mount)) { + qWarning(mount +" is not mounted"); + TextViewOutput->append(mount +" is not mounted"); return; } - /* parse output and display in ListViewScan */ - while(fgets(result, 256, pipe2) != NULL) { - /* put result into TextViewOutput */ - TextViewOutput->append(result); - } - TextViewOutput->append("\n\n============================================\n"); - scanning = false; + QStringList ccmd; + QString share; + QListViewItem *element; + element = ListViewScan->selectedItem(); + share = element->text(0); + qWarning("selected share is "+share); + + if(mount.left(1) != "/") + mount = QDir::currentDirPath()+"/"+mount; + mount = mount.stripWhiteSpace(); + + ccmd << "/usr/bin/smbumount"; + ccmd << mount; + runCommand(ccmd); + + element->setText(2, ""); + + ccmd = "/bin/mount"; + runCommand(ccmd); } bool Qsmb::runCommand(const QStringList & command) { - owarn << "runCommand " << command.join(" ") << oendl; + qWarning( "runCommand " + command.join(" ") ); + TextViewOutput->append(command.join(" ")); out = ""; Process ipkg_status( command); bool r = ipkg_status.exec("",out); - if(!r) { - QMessageBox::warning(this, tr("Error!!"),tr("<p>"+out+"</p>")); - } + qWarning("result is %d"+ r ); + qWarning("Output " + out ); + TextViewOutput->append(out); - owarn << "Output " << out << oendl; - TextViewOutput->append(out.latin1()); +//very hacky + if(out.find("failed") !=-1) { + r = false; + } return r; } +bool Qsmb::isMounted(const QString &mountPoint) { + struct mntent *me; + bool mounted = false; + FILE *mntfp = setmntent( "/etc/mtab", "r" ); + if ( mntfp ){ + while ( (me = getmntent( mntfp )) != 0 ) { + QString deviceName = me->mnt_fsname; + QString mountDir = me->mnt_dir; + QString fsType = me->mnt_type; + if( fsType == "smbfs" && mountDir.find(mountPoint) !=-1) + mounted = true; + } + } + endmntent( mntfp ); + return mounted; +} diff --git a/noncore/net/opie-smb/qsmb.h b/noncore/net/opie-smb/qsmb.h index b406a1e..fba94d0 100644 --- a/noncore/net/opie-smb/qsmb.h +++ b/noncore/net/opie-smb/qsmb.h @@ -1,42 +1,44 @@ #ifndef QSMB_H #define QSMB_H #include "qsmbbase.h" #include <stdlib.h> #include <stdlib.h> #include <stdio.h> #include <qlistview.h> #include <pthread.h> class Qsmb : public FormQPESMBBase { - Q_OBJECT + Q_OBJECT public: - static QString appName() { return QString::fromLatin1("opie-smb"); } - Qsmb( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); - ~Qsmb(); - void scan(); - void DoIt(); + static QString appName() { return QString::fromLatin1("opie-smb"); } + Qsmb( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~Qsmb(); + void scan(); + void DoIt(); private: - QListViewItem *top_element; - QComboBox *hosts; - pthread_t tpid; - bool scanning; + QListViewItem *top_element; + QComboBox *hosts; + pthread_t tpid; + bool scanning; + bool isMounted(const QString &); public slots: void clear(); void scanClicked(); void hostSelected(int); void DoItClicked(); + void umountIt(); QString out; bool runCommand(const QStringList &); }; void* runit(void *arg); void* runitm(void *arg); #endif // QSMB_H diff --git a/noncore/net/opie-smb/qsmbbase.ui b/noncore/net/opie-smb/qsmbbase.ui index 297eb2a..4692282 100644 --- a/noncore/net/opie-smb/qsmbbase.ui +++ b/noncore/net/opie-smb/qsmbbase.ui @@ -1,316 +1,341 @@ <!DOCTYPE UI><UI> <class>FormQPESMBBase</class> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>FormQPESMBBase</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>250</width> - <height>352</height> + <width>259</width> + <height>395</height> </rect> </property> <property stdset="1"> <name>font</name> <font> </font> </property> <property stdset="1"> <name>caption</name> <string>Opie Smb</string> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <grid> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>2</number> </property> <widget row="0" column="0" > <class>QTabWidget</class> <property stdset="1"> <name>name</name> <cstring>TabWidget2</cstring> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>Scan</string> </attribute> <grid> <property stdset="1"> <name>margin</name> <number>2</number> </property> <property stdset="1"> <name>spacing</name> - <number>0</number> + <number>2</number> </property> <widget row="1" column="0" rowspan="1" colspan="4" > <class>QComboBox</class> <property stdset="1"> <name>name</name> <cstring>CBHost</cstring> </property> </widget> <widget row="4" column="1" rowspan="1" colspan="3" > <class>QComboBox</class> <property stdset="1"> <name>name</name> <cstring>mountpt</cstring> </property> </widget> <widget row="0" column="3" > <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>LScan</cstring> </property> <property stdset="1"> <name>text</name> <string></string> </property> </widget> <widget row="4" column="0" > <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>textLabel1</cstring> </property> <property stdset="1"> <name>text</name> <string>mount pt:</string> </property> </widget> <widget row="2" column="0" rowspan="1" colspan="4" > <class>QListView</class> <column> <property> <name>text</name> <string>Shares</string> </property> <property> <name>clickable</name> <bool>true</bool> </property> <property> <name>resizeable</name> <bool>true</bool> </property> </column> <column> <property> <name>text</name> <string>Comment</string> </property> <property> <name>clickable</name> <bool>true</bool> </property> <property> <name>resizeable</name> <bool>true</bool> </property> </column> + <column> + <property> + <name>text</name> + <string>Mount</string> + </property> + <property> + <name>clickable</name> + <bool>true</bool> + </property> + <property> + <name>resizeable</name> + <bool>true</bool> + </property> + </column> <property stdset="1"> <name>name</name> <cstring>ListViewScan</cstring> </property> <property stdset="1"> <name>allColumnsShowFocus</name> <bool>true</bool> </property> </widget> <widget row="0" column="0" rowspan="1" colspan="2" > <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>BtnScan</cstring> </property> <property stdset="1"> <name>text</name> <string>&Scan</string> </property> </widget> <widget row="0" column="2" > <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>BtnClear</cstring> </property> <property stdset="1"> <name>text</name> <string>&Clear</string> </property> </widget> <widget row="3" column="0" rowspan="1" colspan="3" > <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>onbootBtn</cstring> </property> <property stdset="1"> <name>text</name> <string>Reconnect on boot</string> </property> </widget> - <widget row="5" column="0" rowspan="1" colspan="2" > - <class>QPushButton</class> - <property stdset="1"> - <name>name</name> - <cstring>DoItBtn</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>&Mount</string> - </property> - </widget> - <widget row="5" column="2" rowspan="1" colspan="2" > + <widget row="5" column="2" rowspan="2" colspan="2" > <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout6</cstring> </property> <grid> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget row="1" column="0" > <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout2</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>pwdlabel</cstring> </property> <property stdset="1"> <name>text</name> <string>password</string> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>password</cstring> </property> </widget> </hbox> </widget> <widget row="0" column="0" > <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout5</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>usrlabel</cstring> </property> <property stdset="1"> <name>text</name> <string>username</string> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>username</cstring> </property> </widget> </hbox> </widget> </grid> </widget> + <widget row="6" column="0" rowspan="1" colspan="2" > + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>UnmountBtn</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Umount</string> + </property> + </widget> + <widget row="5" column="0" rowspan="1" colspan="2" > + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>DoItBtn</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Mount</string> + </property> + </widget> </grid> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>SMB Output</string> </attribute> <grid> <property stdset="1"> <name>margin</name> - <number>11</number> + <number>2</number> </property> <property stdset="1"> <name>spacing</name> - <number>6</number> + <number>2</number> </property> <widget row="0" column="0" > <class>QTextView</class> <property stdset="1"> <name>name</name> <cstring>TextViewOutput</cstring> </property> <property stdset="1"> <name>textFormat</name> <enum>PlainText</enum> </property> </widget> </grid> </widget> </widget> </grid> </widget> </UI> |