summaryrefslogtreecommitdiff
path: root/noncore/net/opie-smb/qsmb.cpp
Unidiff
Diffstat (limited to 'noncore/net/opie-smb/qsmb.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/opie-smb/qsmb.cpp184
1 files changed, 109 insertions, 75 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
@@ -4,12 +4,13 @@
4 4
5#include <string.h> 5#include <string.h>
6#include <qstring.h> 6#include <qstring.h>
7#include <qstringlist.h> 7#include <qstringlist.h>
8#include <qdir.h> 8#include <qdir.h>
9#include <qfileinfo.h> 9#include <qfileinfo.h>
10#include <qtabwidget.h>
10 11
11#include <qpe/process.h> 12#include <qpe/process.h>
12#include <qlabel.h> 13#include <qlabel.h>
13#include <qlineedit.h> 14#include <qlineedit.h>
14#include <qcombobox.h> 15#include <qcombobox.h>
15#include <qstringlist.h> 16#include <qstringlist.h>
@@ -23,32 +24,37 @@
23#include <signal.h> 24#include <signal.h>
24#include <ctype.h> 25#include <ctype.h>
25 26
26 27
27#include <netinet/in.h> 28#include <netinet/in.h>
28#include <arpa/inet.h> 29#include <arpa/inet.h>
29
30#include <rpc/clnt.h> 30#include <rpc/clnt.h>
31 31
32#include <sys/vfs.h>
33#include <mntent.h>
32 34
33#include <opie2/odebug.h> 35// #include <opie2/odebug.h>
34using namespace Opie::Core; 36// using namespace Opie::Core;
35 37
36 38
37Qsmb::Qsmb( QWidget* parent, const char* name, WFlags fl ) 39Qsmb::Qsmb( QWidget* parent, const char* name, WFlags fl )
38 : FormQPESMBBase( parent, name, fl ) 40 : FormQPESMBBase( parent, name, fl )
39{ 41{
40 connect(CBHost, SIGNAL(activated(int)), this, SLOT(hostSelected(int))); 42 connect(CBHost, SIGNAL(activated(int)), this, SLOT(hostSelected(int)));
41 connect(DoItBtn, SIGNAL(clicked()), this, SLOT(DoItClicked())); 43 connect(DoItBtn, SIGNAL(clicked()), this, SLOT(DoItClicked()));
44 connect(UnmountBtn, SIGNAL(clicked()), this, SLOT(umountIt()));
42 connect(BtnScan, SIGNAL(clicked()), this, SLOT(scanClicked())); 45 connect(BtnScan, SIGNAL(clicked()), this, SLOT(scanClicked()));
43 connect(BtnClear, SIGNAL(clicked()), this, SLOT(clear())); 46 connect(BtnClear, SIGNAL(clicked()), this, SLOT(clear()));
44 47
48 mountpt->setEditable(true);
45 mountpt->insertItem("/mnt/samba1",-1); 49 mountpt->insertItem("/mnt/samba1",-1);
46 mountpt->insertItem("/mnt/samba2",-1); 50 mountpt->insertItem("/mnt/samba2",-1);
47 mountpt->insertItem("/mnt/samba3",-1); 51 mountpt->insertItem("/mnt/samba3",-1);
48 52
53// TextViewOutput
54
49 top_element = NULL; 55 top_element = NULL;
50 scanning = false; 56 scanning = false;
51} 57}
52 58
53Qsmb::~Qsmb() 59Qsmb::~Qsmb()
54{ 60{
@@ -92,27 +98,25 @@ void* runitm(void* arg)
92 caller->DoIt(); 98 caller->DoIt();
93 return(0); 99 return(0);
94} 100}
95 101
96void Qsmb::scan() 102void Qsmb::scan()
97{ 103{
98// int i;
99
100 if (scanning) return; 104 if (scanning) return;
101 scanning = true; 105 scanning = true;
102 106
103 QString match; 107 QString match;
104 QString cmd; 108 QString cmd;
105 LScan->setText("Scanning..."); 109 LScan->setText("Scanning...");
106 qApp->processEvents(); 110 qApp->processEvents();
107 111
108 sockaddr_in my_addr; 112 sockaddr_in my_addr;
109 get_myaddress( &my_addr); 113 get_myaddress( &my_addr);
110 114
111 QString ip = inet_ntoa( my_addr.sin_addr); 115 QString ip = inet_ntoa( my_addr.sin_addr);
112 owarn << "IP Address : " << ip<< oendl; 116 qWarning("IP Address : "+ip);
113 117
114 match = ip.left(5); 118 match = ip.left(5);
115 119
116 QStringList ccmd; 120 QStringList ccmd;
117 TextViewOutput->append("smbfind"); 121 TextViewOutput->append("smbfind");
118 122
@@ -144,19 +148,19 @@ void Qsmb::scan()
144 148
145 TextViewOutput->append("\n\n============================================\n"); 149 TextViewOutput->append("\n\n============================================\n");
146 LScan->setText(""); 150 LScan->setText("");
147 scanning = false; 151 scanning = false;
148} 152}
149 153
150void Qsmb::hostSelected(int index) 154void Qsmb::hostSelected(int /*index*/ )
151{ 155{
152 owarn << "hostSelected" << oendl;
153 QListViewItem *element; 156 QListViewItem *element;
154 QListViewItem *parent; 157// QListViewItem *parent;
155 158
156 QString text = CBHost->currentText(); 159 QString text = CBHost->currentText();
160 ListViewScan->clear();
157 161
158 if (scanning) return; 162 if (scanning) return;
159 scanning = true; 163 scanning = true;
160 164
161 QString cmd; 165 QString cmd;
162 QStringList ccmd; 166 QStringList ccmd;
@@ -183,12 +187,14 @@ void Qsmb::hostSelected(int index)
183 QString tmp = s.readLine(); 187 QString tmp = s.readLine();
184 188
185 if( tmp.find("$") == -1 && tmp.find("Disk") != -1) { 189 if( tmp.find("$") == -1 && tmp.find("Disk") != -1) {
186 QStringList token = QStringList::split(' ', tmp ); 190 QStringList token = QStringList::split(' ', tmp );
187 share = token[0]; 191 share = token[0];
188 comment = token[2]; 192 comment = token[2];
193 share = share.stripWhiteSpace();
194 comment = comment.stripWhiteSpace();
189 element = new QListViewItem(ListViewScan,share, comment); 195 element = new QListViewItem(ListViewScan,share, comment);
190 element->setOpen(true); 196 element->setOpen(true);
191// top_element = element; 197// top_element = element;
192// parent = element; 198// parent = element;
193 } 199 }
194 200
@@ -247,128 +253,156 @@ void Qsmb::hostSelected(int index)
247 253
248 TextViewOutput->append("\n\n============================================\n"); 254 TextViewOutput->append("\n\n============================================\n");
249 LScan->setText(""); 255 LScan->setText("");
250 scanning = false; 256 scanning = false;
251} 257}
252 258
259
253void Qsmb::DoIt() 260void Qsmb::DoIt()
254{ 261{
262
255 QListViewItem *element; 263 QListViewItem *element;
256 element = ListViewScan->selectedItem(); 264 element = ListViewScan->selectedItem();
257 if(!element) { 265 if(!element) {
258 QMessageBox::warning(this, tr("Error!!"),tr("<p><b>No</b> share selected!!</p>"));
259 return; 266 return;
260 } 267 }
261 268
262 if (scanning) return; 269 if (scanning) return;
263 scanning = true; 270 scanning = true;
264 271
265 int i; 272 QString mount = mountpt->currentText();
266 bool err = false; 273 if(isMounted(mount)) {
274 qWarning(mount +" is already mounted");
275 TextViewOutput->append(mount +" is already mounted");
276 return;
277 }
278
279 bool noerr = false;
267 280
268 char share[512]; 281 QString share;
269 QString cmd; 282 QString cmd;
270 QString cmd2; 283 QString cmd2;
271 char result[256];
272// QString result;
273 QString text = mountpt->currentText(); 284 QString text = mountpt->currentText();
274 285 QStringList ccmd;
275 FILE *pipe,*pipe2;
276 286
277 LScan->setText("Mounting..."); 287 LScan->setText("Mounting...");
278 qApp->processEvents(); 288 qApp->processEvents();
279 289
280
281 if(! QFileInfo(text).exists()) { 290 if(! QFileInfo(text).exists()) {
282 QStringList ccmd;
283 ccmd << "mkdir"; 291 ccmd << "mkdir";
284 ccmd << "-p"; 292 ccmd << "-p";
285 ccmd << text; 293 ccmd << text;
286 294
287 owarn<<"cmd: "<< ccmd << oendl; 295 qWarning( "cmd: "+ ccmd.join(" "));
288 runCommand(ccmd); 296 runCommand(ccmd);
289 } 297 }
290 298
299 share = element->text(0);
300 qWarning("selected share is "+share);
291 301
292 strcpy(share,(const char *)element->text(0)); 302 QString service = CBHost->currentText();
303 service = service.stripWhiteSpace();
304 if(mount.left(1) != "/")
305 mount = QDir::currentDirPath()+"/"+mount;
306 mount = mount.stripWhiteSpace();
307 ccmd.clear();
293 308
294 for(i = 0; i < 256; i++) { 309 ccmd << "/usr/bin/smbmount";
295 if(isalpha( share[i])) { 310 ccmd << "//"+ service+"/"+share;
296 strcpy( share, share + i); 311 ccmd << mount;
297 break; 312 ccmd << "-o";
298 } 313 ccmd << "username="+username->text()+",password="+password->text()+"";
299 }
300
301 cmd = "/usr/bin/smbmount //"+CBHost->currentText()+"/"+share+" "+mountpt->currentText()+" -o username="+username->text()+",password="+password->text();
302
303 owarn << "cmd: " << cmd << oendl;
304 TextViewOutput->append(cmd.latin1());
305 314
315 TextViewOutput->append(ccmd.join(" ").latin1());
306 316
307 if(onbootBtn->isChecked()) { 317 if(onbootBtn->isChecked()) {
308 owarn << "Saving Setting permanently..." << oendl; 318 qWarning("Saving Setting permanently...");
309 cmd2 = "echo '" + cmd + "'>/opt/QtPalmtop/etc/samba.env"; 319 QFile sambenv("/opt/QtPalmtop/etc/samba.env");
310 /* run command & read output */ 320 QTextStream smbv(&sambenv);
311 if ((pipe = popen(cmd2.latin1(), "r")) == NULL) { 321 sambenv.open(IO_WriteOnly);
312 snprintf(result, 256, "Error: Can't run %s", cmd.latin1()); 322 smbv << ccmd.join(" ") ;
313 return; 323 sambenv.close();
314 }
315 /* parse output and display in ListViewScan */
316 while(fgets(result, 256, pipe) != NULL) {
317 }
318 } 324 }
319 325
326 noerr = runCommand(ccmd);
320 327
321 /* run command & read output */ 328 LScan->setText("");
322 if ((pipe = popen(cmd.latin1(), "r")) == NULL) {
323 snprintf(result, 256, "Error: Can't run %s", cmd.latin1());
324 TextViewOutput->append(result);
325 return;
326 }
327 329
328 /* parse output and display in ListViewScan */ 330 if(noerr) {
329 while(fgets(result, 256, pipe) != NULL) { 331 element->setText(2, mount);
330 /* put result into TextViewOutput */ 332 TextViewOutput->append("\n\n================CheckMounts==================\n");
331 TextViewOutput->append(result); 333 ccmd = "/bin/mount";
334 runCommand(ccmd);
335 TextViewOutput->append("\n\n============================================\n");
336 qApp->processEvents();
337 } else {
338 //do nothing
332 } 339 }
333 340
341 scanning = false;
342}
334 343
335 TextViewOutput->append("\n\n================CheckMounts==================\n"); 344void Qsmb::umountIt()
336 LScan->setText(""); 345{
346 QString mount = mountpt->currentText();
347 if(!isMounted(mount)) {
348 qWarning(mount +" is not mounted");
349 TextViewOutput->append(mount +" is not mounted");
350 return;
351 }
337 352
338 cmd = "/bin/mount 2>&1"; 353 QStringList ccmd;
339 owarn << "cmd: " << cmd << oendl; 354 QString share;
355 QListViewItem *element;
356 element = ListViewScan->selectedItem();
357 share = element->text(0);
358 qWarning("selected share is "+share);
340 359
341 if ((pipe2 = popen(cmd.latin1(), "r")) == NULL) { 360 if(mount.left(1) != "/")
361 mount = QDir::currentDirPath()+"/"+mount;
362 mount = mount.stripWhiteSpace();
342 363
343 snprintf(result, 256, "Error: Can't run %s", cmd.latin1()); 364 ccmd << "/usr/bin/smbumount";
344// result = "Error: Can't run "+ cmd; 365 ccmd << mount;
366 runCommand(ccmd);
345 367
346 TextViewOutput->append(result); 368 element->setText(2, "");
347 return;
348 }
349 /* parse output and display in ListViewScan */
350 while(fgets(result, 256, pipe2) != NULL) {
351 /* put result into TextViewOutput */
352 TextViewOutput->append(result);
353 }
354 369
355 TextViewOutput->append("\n\n============================================\n"); 370 ccmd = "/bin/mount";
356 scanning = false; 371 runCommand(ccmd);
357} 372}
358 373
359bool Qsmb::runCommand(const QStringList & command) { 374bool Qsmb::runCommand(const QStringList & command) {
360 owarn << "runCommand " << command.join(" ") << oendl; 375 qWarning( "runCommand " + command.join(" ") );
376 TextViewOutput->append(command.join(" "));
361 out = ""; 377 out = "";
362 Process ipkg_status( command); 378 Process ipkg_status( command);
363 bool r = ipkg_status.exec("",out); 379 bool r = ipkg_status.exec("",out);
364 380
365 if(!r) { 381 qWarning("result is %d"+ r );
366 QMessageBox::warning(this, tr("Error!!"),tr("<p>"+out+"</p>")); 382 qWarning("Output " + out );
367 } 383 TextViewOutput->append(out);
368 384
369 owarn << "Output " << out << oendl; 385//very hacky
370 TextViewOutput->append(out.latin1()); 386 if(out.find("failed") !=-1) {
387 r = false;
388 }
371 return r; 389 return r;
372} 390}
373 391
374 392
393bool Qsmb::isMounted(const QString &mountPoint) {
394 struct mntent *me;
395 bool mounted = false;
396 FILE *mntfp = setmntent( "/etc/mtab", "r" );
397 if ( mntfp ){
398 while ( (me = getmntent( mntfp )) != 0 ) {
399 QString deviceName = me->mnt_fsname;
400 QString mountDir = me->mnt_dir;
401 QString fsType = me->mnt_type;
402 if( fsType == "smbfs" && mountDir.find(mountPoint) !=-1)
403 mounted = true;
404 }
405 }
406 endmntent( mntfp );
407 return mounted;
408}