summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opie-smb/qsmb.cpp198
-rw-r--r--noncore/net/opie-smb/qsmb.h22
-rw-r--r--noncore/net/opie-smb/qsmbbase.ui59
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>&amp;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>&amp;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>&amp;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>&amp;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>&amp;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>