generic: drop SMB and NFS support

I cannot think of a use case for them with kdirshare service in place,
never needed to access one either

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-06-03 02:03:34 +03:00
parent f28ca2226a
commit 56b3460011
55 changed files with 11 additions and 16254 deletions

View file

@ -161,17 +161,6 @@ set_package_properties(RAW1394 PROPERTIES
PURPOSE "View FireWire devices in kinfocenter" PURPOSE "View FireWire devices in kinfocenter"
) )
# we need a version of samba which has already smbc_set_context(), Alex
set(SAMBA_REQUIRE_SMBC_SET_CONTEXT TRUE)
set(SAMBA_REQUIRE_SMBC_OPTION_SET TRUE)
macro_optional_find_package(Samba)
set_package_properties(Samba PROPERTIES
DESCRIPTION "the SMB client library, a version with smbc_set_context() and smbc_option_set()"
URL "http://www.samba.org"
TYPE OPTIONAL
PURPOSE "Needed to build the SMB kioslave"
)
macro_optional_find_package(LibSSH 0.6.0) macro_optional_find_package(LibSSH 0.6.0)
set_package_properties(LibSSH PROPERTIES set_package_properties(LibSSH PROPERTIES
DESCRIPTION "the SSH library with SFTP support" DESCRIPTION "the SSH library with SFTP support"

View file

@ -23,8 +23,8 @@ build_script:
libxcb-damage0-dev libxcb-xfixes0-dev libxcb-render0-dev libxcb-randr0-dev \ libxcb-damage0-dev libxcb-xfixes0-dev libxcb-render0-dev libxcb-randr0-dev \
libxcb-shape0-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-keysyms1-dev \ libxcb-shape0-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-keysyms1-dev \
libglu1-mesa-dev mesa-common-dev libmtp-dev libusb-1.0-0-dev libssh-dev \ libglu1-mesa-dev mesa-common-dev libmtp-dev libusb-1.0-0-dev libssh-dev \
libsmbclient-dev libdrm-dev libraw1394-dev libsensors4-dev libgphoto2-dev \ libdrm-dev libraw1394-dev libsensors4-dev libgphoto2-dev libegl-dev \
libegl-dev libpci-dev libopenexr-dev liblightdm-gobject-1-dev libkmod-dev \ libpci-dev libopenexr-dev liblightdm-gobject-1-dev libkmod-dev \
libdbusmenu-katie \ libdbusmenu-katie \
sudo ctags cppcheck lrzsz locate \ sudo ctags cppcheck lrzsz locate \
ariya-icons dbus-x11 ccache ariya-icons dbus-x11 ccache

View file

@ -4,7 +4,6 @@ add_subdirectory( infosummary )
add_subdirectory( memory ) add_subdirectory( memory )
add_subdirectory( devinfo ) add_subdirectory( devinfo )
add_subdirectory( info ) add_subdirectory( info )
add_subdirectory( samba )
add_subdirectory( nics ) add_subdirectory( nics )
add_subdirectory( pci ) add_subdirectory( pci )

View file

@ -1,32 +0,0 @@
Samba Status Module:
Michael Glauche <glauche@isa.rwth-aachen.de>
Conversion to kcontrol applet:
Matthias Hoelzer <hoelzer@physik.uni-wuerzburg.de>
Use of K3Process instead of popen, and more error checking
David Faure <David.Faure@insa-lyon.fr>
Added Window and Column resizing:
Harald Koschinski <Harald.Koschinski@arcormail.de>
KTabListBox to QListView conversion and use of QLayout:
Wilco Greven <j.w.greven@student.utwente.nl>
Conversion to KDE2 kcontrol module
Corrected parsing of the smbstatus output
(now works also with shares containing spaces "a share name")
Added three tab pages
-one for viewing mounted network resources (Samba and NFS, works on Linux, maybe Solaris)
-one for viewing samba logfile
-one for some filtering of samba logfile
Added support for viewing NFS-exports mounted by remote hosts on the first
tab
Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>

View file

@ -1,19 +0,0 @@
set(kcm_samba_PART_SRCS
main.cpp
ksmbstatus.cpp
kcmsambaimports.cpp
kcmsambalog.cpp
kcmsambastatistics.cpp )
kde4_add_plugin(kcm_samba ${kcm_samba_PART_SRCS})
target_link_libraries(kcm_samba ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})
install(TARGETS kcm_samba DESTINATION ${KDE4_PLUGIN_INSTALL_DIR} )
########### install files ###############
install( FILES smbstatus.desktop DESTINATION ${KDE4_SERVICES_INSTALL_DIR} )

View file

@ -1,2 +0,0 @@
#!/bin/bash
$XGETTEXT *.cpp -o $podir/kcmsamba.pot

View file

@ -1,90 +0,0 @@
/*
* kcmsambaimports.cpp
*
* Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
*
* Requires the Qt widget libraries, available at no cost at
* http://www.troll.no/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kcmsambaimports.h"
#include "moc_kcmsambaimports.cpp"
#include <QLayout>
#include <QWhatsThis>
#include <klocale.h>
#include <kdialog.h>
#include <stdio.h>
ImportsView::ImportsView(QWidget * parent) :
QWidget(parent), list(this) {
QBoxLayout *topLayout = new QVBoxLayout(this);
topLayout->setMargin(KDialog::marginHint());
topLayout->setSpacing(KDialog::spacingHint());
topLayout->addWidget(&list);
list.setAllColumnsShowFocus(true);
list.setMinimumSize(425, 200);
list.setHeaderLabels(QStringList() << i18n("Type") << i18n("Resource") << i18n("Mounted Under"));
this->setWhatsThis(i18n("This list shows the Samba and NFS shared"
" resources mounted on your system from other hosts. The \"Type\""
" column tells you whether the mounted resource is a Samba or an NFS"
" type of resource. The \"Resource\" column shows the descriptive name"
" of the shared resource. Finally, the third column, which is labeled"
" \"Mounted under\" shows the location on your system where the shared"
" resource is mounted.") );
timer.start(10000);
QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateList()));
updateList();
}
void ImportsView::updateList() {
list.clear();
char *e;
char buf[250];
QByteArray s(""), strSource, strMount, strType;
FILE *f=popen("mount", "r");
if (f==0)
return;
do {
e=fgets(buf, 250, f);
if (e!=0) {
s=buf;
if ((s.contains(" nfs ")) || (s.contains(" smbfs "))) {
strSource=s.left(s.indexOf(" on /"));
strMount=s.mid(s.indexOf(" on /")+4, s.length());
if ((s.contains(" nfs ")) || (s.contains("/remote on ")))
strType="NFS";
else if (s.contains(" smbfs "))
strType="SMB";
int pos(strMount.indexOf(" type "));
if (pos==-1)
pos=strMount.indexOf(" read/");
strMount=strMount.left(pos);
QTreeWidgetItem *item = new QTreeWidgetItem(&list);
item->setText(0, strType);
item->setText(1, strSource);
item->setText(2, strMount);
};
};
} while (!feof(f));
pclose(f);
}

View file

@ -1,49 +0,0 @@
/*
* kcmsambaimports.h
*
* Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
*
* Requires the Qt widget libraries, available at no cost at
* http://www.troll.no/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef kcmsambaimports_h_included
#define kcmsambaimports_h_included
#include <QTimer>
#include <QTreeWidget>
#include <KConfig>
class ImportsView : public QWidget {
Q_OBJECT
public:
explicit ImportsView(QWidget *parent);
virtual ~ImportsView() {
}
void saveSettings() {
}
void loadSettings() {
}
private:
QTreeWidget list;
QTimer timer;
private Q_SLOTS:
void updateList();
};
#endif // main_included

View file

@ -1,232 +0,0 @@
/*
* kcmsambalog.cpp
*
* Copyright (c) 2000 Alexander Neundorf <neundorf@kde.org>
*
* Requires the Qt widget libraries, available at no cost at
* http://www.troll.no/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <QApplication>
#include <QFile>
#include <QLayout>
#include <kmessagebox.h>
#include <kdialog.h>
#include <klocale.h>
#include "kcmsambalog.h"
#include "moc_kcmsambalog.cpp"
#define LOG_SCREEN_XY_OFFSET 10
LogView::LogView(QWidget *parent, KConfig *config) :
QWidget(parent), configFile(config), filesCount(0), connectionsCount(0), logFileName(KUrl::fromPath("/var/log/samba.log"), this), label(i18n("Samba log file: "), this), viewHistory(this), showConnOpen(i18n("Show opened connections"), this), showConnClose(i18n("Show closed connections"), this),
showFileOpen(i18n("Show opened files"), this), showFileClose(i18n("Show closed files"), this), updateButton(i18n("&Update"), this) {
label.setTextInteractionFlags(Qt::TextSelectableByMouse);
label.setBuddy( &logFileName);
QVBoxLayout *mainLayout=new QVBoxLayout(this);
mainLayout->setMargin(KDialog::marginHint());
mainLayout->setSpacing(KDialog::spacingHint());
QHBoxLayout *leLayout=new QHBoxLayout();
mainLayout->addItem(leLayout);
leLayout->addWidget(&label);
leLayout->addWidget(&logFileName, 1);
mainLayout->addWidget(&viewHistory, 1);
QGridLayout *subLayout=new QGridLayout();
mainLayout->addItem(subLayout);
subLayout->addWidget(&showConnOpen, 0, 0);
subLayout->addWidget(&showConnClose, 1, 0);
subLayout->addWidget(&showFileOpen, 0, 1);
subLayout->addWidget(&showFileClose, 1, 1);
mainLayout->addWidget(&updateButton, 0, Qt::AlignLeft);
logFileName.setWhatsThis(i18n("This page presents the contents of"
" your samba log file in a friendly layout. Check that the correct log"
" file for your computer is listed here. If you need to, correct the name"
" or location of the log file, and then click the \"Update\" button.") );
showConnOpen.setWhatsThis(i18n("Check this option if you want to"
" view the details for connections opened to your computer.") );
showConnClose.setWhatsThis(i18n("Check this option if you want to"
" view the events when connections to your computer were closed.") );
showFileOpen.setWhatsThis(i18n("Check this option if you want to"
" see the files which were opened on your computer by remote users."
" Note that file open/close events are not logged unless the samba"
" log level is set to at least 2 (you cannot set the log level"
" using this module).") );
showFileClose.setWhatsThis(i18n("Check this option if you want to"
" see the events when files opened by remote users were closed."
" Note that file open/close events are not logged unless the samba"
" log level is set to at least 2 (you cannot set the log level"
" using this module).") );
updateButton.setWhatsThis(i18n("Click here to refresh the information"
" on this page. The log file (shown above) will be read to obtain the"
" events logged by samba.") );
viewHistory.setAllColumnsShowFocus(true);
viewHistory.setFocusPolicy(Qt::ClickFocus);
QStringList headers;
headers << i18n("Date & Time") << i18n("Event") << i18n("Service/File")
<< i18n("Host/User") << i18n("Date & Time") << i18n("Event")
<< i18n("Service/File") << i18n("Host/User");
viewHistory.setHeaderLabels(headers);
viewHistory.setWhatsThis(i18n("<p>This list shows details of the events"
" logged by samba. Note that events at the file level are not logged"
" unless you have configured the log level for samba to 2 or greater.</p><p>"
" As with many other lists in KDE, you can click on a column heading"
" to sort on that column. Click again to change the sorting direction"
" from ascending to descending or vice versa.</p><p>"
" If the list is empty, try clicking the \"Update\" button. The samba"
" log file will be read and the list refreshed.</p>") );
showConnOpen.setChecked(true);
showConnClose.setChecked(true);
showFileOpen.setChecked(false);
showFileClose.setChecked(false);
connect(&updateButton, SIGNAL(clicked()), this, SLOT(updateList()));
emit contentsChanged(&viewHistory, 0, 0);
label.setMinimumSize(label.sizeHint());
logFileName.setMinimumSize(250, logFileName.sizeHint().height());
viewHistory.setMinimumSize(425, 200);
showConnOpen.setMinimumSize(showConnOpen.sizeHint());
showConnClose.setMinimumSize(showConnClose.sizeHint());
showFileOpen.setMinimumSize(showFileOpen.sizeHint());
showFileClose.setMinimumSize(showFileClose.sizeHint());
updateButton.setFixedSize(updateButton.sizeHint());
}
void LogView::loadSettings() {
if (configFile==0)
return;
KConfigGroup group = configFile->group(LOGGROUPNAME);
logFileName.setUrl(KUrl(group.readPathEntry("SambaLogFile", "/var/log/samba.log")));
showConnOpen.setChecked(group.readEntry("ShowConnectionOpen", true));
showConnClose.setChecked(group.readEntry("ShowConnectionClose", false));
showFileOpen.setChecked(group.readEntry("ShowFileOpen", true));
showFileClose.setChecked(group.readEntry("ShowFileClose", false));
}
void LogView::saveSettings() {
if (configFile==0)
return;
KConfigGroup group = configFile->group(LOGGROUPNAME);
group.writePathEntry("SambaLogFile", logFileName.url().path());
group.writeEntry("ShowConnectionOpen", showConnOpen.isChecked());
group.writeEntry("ShowConnectionClose", showConnClose.isChecked());
group.writeEntry("ShowFileOpen", showFileOpen.isChecked());
group.writeEntry("ShowFileClose", showFileClose.isChecked());
}
#define CONN_OPEN " connect to service "
#define CONN_CLOSE " closed connection to service "
#define FILE_OPEN " opened file "
#define FILE_CLOSE " closed file "
//caution ! high optimized code :-)
void LogView::updateList() {
QFile logFile(logFileName.url().path());
if (logFile.open(QIODevice::ReadOnly)) {
QApplication::setOverrideCursor(Qt::WaitCursor);
viewHistory.clear();
filesCount=0;
connectionsCount=0;
int connOpenLen(strlen(CONN_OPEN));
int connCloseLen(strlen(CONN_CLOSE));
int fileOpenLen(strlen(FILE_OPEN));
int fileCloseLen(strlen(FILE_CLOSE));
char buf[400];
char *c1, *c2, *c3, *c4, *c, time[25];
int timeRead(0);
while (!logFile.atEnd()) {
logFile.readLine(buf, sizeof(buf));
timeRead=0;
if (buf[0]=='[') {
if (strlen(buf)>11)
if (buf[5]=='/') {
buf[20]='\0';
strncpy(time, buf+1, sizeof(time));
time[sizeof(time)-1] = '\0';
timeRead=1;
};
};
if (timeRead==0) {
c1=0;
c2=0;
c3=0;
c4=0;
if (showConnOpen.isChecked())
c1=strstr(buf, CONN_OPEN);
if (c1==0) {
if (showConnClose.isChecked())
c2=strstr(buf, CONN_CLOSE);
if (c2==0) {
if (showFileOpen.isChecked())
c3=strstr(buf, FILE_OPEN);
if (c3==0) {
if (showFileClose.isChecked())
c4=strstr(buf, FILE_CLOSE);
if (c4==0)
continue;
};
};
};
if (c1!=0) {
c=strstr(buf, " as user");
*c='\0';
*c1='\0';
new QTreeWidgetItemX(&viewHistory,time,I18N_NOOP("CONNECTION OPENED"),c1+connOpenLen,buf+2);
connectionsCount++;
} else if (c2!=0) {
*c2='\0';
new QTreeWidgetItemX(&viewHistory,time,I18N_NOOP("CONNECTION CLOSED"),c2+connCloseLen,buf+2);
} else if (c3!=0) {
c=strstr(buf, " read=");
*c='\0';
*c3='\0';
new QTreeWidgetItemX(&viewHistory,time,I18N_NOOP(" FILE OPENED"),c3+fileOpenLen,buf+2);
filesCount++;
} else if (c4!=0) {
c=strstr(buf, " (numopen=");
*c='\0';
*c4='\0';
new QTreeWidgetItemX(&viewHistory,time,I18N_NOOP(" FILE CLOSED"),c4+fileCloseLen,buf+2);
};
};
};
logFile.close();
emit contentsChanged(&viewHistory, filesCount, connectionsCount);
QApplication::restoreOverrideCursor();
} else {
QString tmp = i18n("Could not open file %1", logFileName.url().path());
KMessageBox::error(this, tmp);
};
}

View file

@ -1,83 +0,0 @@
/*
* kcmsambalog.h
*
* Copyright (c) 2000 Alexander Neundorf <neundorf@kde.org>
*
* Requires the Qt widget libraries, available at no cost at
* http://www.troll.no/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef kcmsambalog_h_included
#define kcmsambalog_h_included
#include <QLabel>
#include <QCheckBox>
#include <QPushButton>
#include <QTreeWidget>
#include <QEvent>
#include <KConfig>
#include <KUrlRequester>
#define LOGGROUPNAME "SambaLogFileSettings"
class LogView : public QWidget {
Q_OBJECT
public:
explicit LogView(QWidget *parent=0, KConfig *config=0);
virtual ~LogView() {
}
void saveSettings();
void loadSettings();
private:
KConfig *configFile;
int filesCount, connectionsCount;
KUrlRequester logFileName;
QLabel label;
QTreeWidget viewHistory;
QCheckBox showConnOpen, showConnClose, showFileOpen, showFileClose;
QPushButton updateButton;
private Q_SLOTS:
void updateList();
Q_SIGNALS:
void contentsChanged(QTreeWidget *list, int nrOfFiles, int nrOfConnections);
};
class QTreeWidgetItemX : public QTreeWidgetItem {
public:
//a faster constructor saves a lot time
QTreeWidgetItemX(QTreeWidget *parent, const char *c0, const char *c1 = 0, const char *c2 = 0, const char *c3 = 0, const char *c4 = 0, const char *c5 = 0, const char *c6 = 0, const char *c7 = 0) :
QTreeWidgetItem(parent) {
setText( 0, c0);
setText( 1, c1);
setText( 2, c2);
setText( 3, c3);
if (c4==0)
return;
setText( 4, c4);
if (c5==0)
return;
setText( 5, c5);
if (c6==0)
return;
setText( 6, c6);
if (c7==0)
return;
setText( 7, c7);
}
};
#endif // main_included

View file

@ -1,309 +0,0 @@
/*
* kcmsambastatistics.cpp
*
* Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
*
* Requires the Qt widget libraries, available at no cost at
* http://www.troll.no/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kcmsambastatistics.h"
#include "moc_kcmsambastatistics.cpp"
#include <QApplication>
#include <QLayout>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QComboBox>
#include <QPushButton>
#include <QRegExp>
#include <QTreeWidget>
#include <KDebug>
#include <KDialog>
#include <KGlobal>
#include <KLocale>
StatisticsView::StatisticsView(QWidget *parent) :
QWidget(parent), dataList(0), connectionsCount(0), filesCount(0), calcCount(0) {
viewStatistics = new QTreeWidget( this );
connectionsL = new QLabel( i18n( "Connections: 0" ), this );
connectionsL->setTextInteractionFlags(Qt::TextSelectableByMouse);
filesL = new QLabel( i18n( "File accesses: 0" ), this );
filesL->setTextInteractionFlags(Qt::TextSelectableByMouse);
eventCb = new QComboBox( this );
eventL = new QLabel( i18n( "Event: " ), this );
eventL->setTextInteractionFlags(Qt::TextSelectableByMouse);
eventL->setBuddy(eventCb);
serviceLe = new QLineEdit( this );
serviceL = new QLabel( i18n( "Service/File:" ), this );
serviceL->setTextInteractionFlags(Qt::TextSelectableByMouse);
serviceL->setBuddy(serviceLe);
hostLe = new QLineEdit( this );
hostL = new QLabel( i18n( "Host/User:" ), this );
hostL->setTextInteractionFlags(Qt::TextSelectableByMouse);
hostL->setBuddy(hostLe);
calcButton = new QPushButton( i18n( "&Search" ), this );
clearButton = new QPushButton( i18n( "Clear Results" ), this );
expandedInfoCb = new QCheckBox( i18n( "Show expanded service info" ), this );
expandedUserCb = new QCheckBox( i18n( "Show expanded host info" ), this );
viewStatistics->setAllColumnsShowFocus(true);
viewStatistics->setFocusPolicy(Qt::ClickFocus);
QStringList headers;
headers << i18n("Nr") << i18n("Event") << i18n("Service/File") << i18n("Host/User") << i18n("Hits"); //i18n("Percentage"),100);
viewStatistics->setHeaderLabels(headers);
eventCb->setEditable(false);
eventCb->addItem(i18n("Connection"));
eventCb->addItem(i18n("File Access"));
expandedInfoCb->setChecked(false);
expandedUserCb->setChecked(false);
clearStatistics();
serviceLe->setText("*");
hostLe->setText("*");
viewStatistics->setMinimumSize(375, 200);
connectionsL->setMinimumSize(connectionsL->sizeHint());
filesL->setMinimumSize(filesL->sizeHint());
eventL->setMinimumSize(eventL->sizeHint());
eventCb->setMinimumSize(eventCb->sizeHint());
hostL->setMinimumSize(hostL->sizeHint());
hostLe->setMinimumSize(120, hostLe->sizeHint().height());
serviceL->setMinimumSize(serviceL->sizeHint());
serviceLe->setMinimumSize(120, serviceLe->sizeHint().height());
calcButton->setMinimumSize(calcButton->sizeHint());
clearButton->setMinimumSize(clearButton->sizeHint());
expandedInfoCb->setMinimumSize(expandedInfoCb->sizeHint());
expandedUserCb->setMinimumSize(expandedUserCb->sizeHint());
QVBoxLayout *topLayout=new QVBoxLayout(this);
topLayout->setMargin(KDialog::marginHint());
topLayout->setSpacing(KDialog::spacingHint());
topLayout->addWidget(viewStatistics, 1);
QGridLayout *subLayout=new QGridLayout();
topLayout->addItem(subLayout);
subLayout->setColumnStretch(1, 1);
subLayout->setColumnStretch(2, 1);
QHBoxLayout *twoButtonsLayout=new QHBoxLayout;
twoButtonsLayout->addWidget(calcButton, 1);
twoButtonsLayout->addWidget(clearButton, 1);
subLayout->addWidget(connectionsL, 0, 0);
subLayout->addWidget(filesL, 0, 1);
subLayout->addWidget(eventL, 1, 0);
subLayout->addWidget(serviceL, 1, 1);
subLayout->addWidget(hostL, 1, 2);
subLayout->addWidget(eventCb, 2, 0);
subLayout->addWidget(serviceLe, 2, 1);
subLayout->addWidget(hostLe, 2, 2);
subLayout->addLayout(twoButtonsLayout, 3, 0);
subLayout->addWidget(expandedInfoCb, 3, 1);
subLayout->addWidget(expandedUserCb, 3, 2);
connect(clearButton, SIGNAL(clicked()), this, SLOT(clearStatistics()));
connect(calcButton, SIGNAL(clicked()), this, SLOT(calculate()));
setListInfo(0, 0, 0);
}
void StatisticsView::setListInfo(QTreeWidget *list, int nrOfFiles, int nrOfConnections) {
dataList=list;
filesCount=nrOfFiles;
connectionsCount=nrOfConnections;
connectionsL->setText(i18n("Connections: %1", KGlobal::locale()->formatNumber(connectionsCount, 0)));
filesL->setText(i18n("File accesses: %1", KGlobal::locale()->formatNumber(filesCount, 0)));
clearStatistics();
}
void StatisticsView::calculate() {
if (dataList==0)
return;
QApplication::setOverrideCursor(Qt::WaitCursor);
int connCount(0);
if (eventCb->currentText()==i18n("Connection"))
connCount=1;
//something has to be counted exactly
if ((expandedInfoCb->isChecked()) || (expandedUserCb->isChecked())) {
SambaLog sLog;
QRegExp rService(serviceLe->text(), Qt::CaseInsensitive, QRegExp::Wildcard);
QRegExp rHost(hostLe->text(), Qt::CaseInsensitive, QRegExp::Wildcard);
QString item2, item3;
for (int i = 0; i < dataList->topLevelItemCount(); ++i)
{
QTreeWidgetItem *item = dataList->topLevelItem(i);
if (connCount) {
if ((QString(item->text(1)).contains(i18n("CONNECTION OPENED"))) && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost))) {
if (expandedInfoCb->isChecked())
item2=item->text(2);
else
item2=serviceLe->text();
if (expandedUserCb->isChecked())
item3=item->text(3);
else
item3=hostLe->text();
sLog.addItem(item2, item3);
//count++;
}
} else {
if ((QString(item->text(1)).contains(i18n("FILE OPENED"))) && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost))) {
if (expandedInfoCb->isChecked())
item2=item->text(2);
else
item2=serviceLe->text();
if (expandedUserCb->isChecked())
item3=item->text(3);
else
item3=hostLe->text();
sLog.addItem(item2, item3);
}
}
}
foreach (const LogItem *tmpItem, sLog.items)
{
if (!tmpItem)
{
continue;
}
foreach (const SmallLogItem *tmpStr, tmpItem->accessed) {
if (!tmpStr)
{
continue;
}
calcCount++;
QString number("");
number.sprintf("%6d", calcCount);
QString hits("");
hits.sprintf("%7d", tmpStr->count);
QTreeWidgetItem *item = new QTreeWidgetItem(viewStatistics);
item->setText(0, number);
item->setText(1, eventCb->currentText());
item->setText(2, tmpItem->name);
item->setText(3, tmpStr->name);
item->setText(4, hits);
}
}
}
//no expanded info needed
else {
calcCount++;
int count(0);
QRegExp rService(serviceLe->text(), Qt::CaseInsensitive, QRegExp::Wildcard);
QRegExp rHost(hostLe->text(), Qt::CaseInsensitive, QRegExp::Wildcard);
for (int i = 0; i < dataList->topLevelItemCount(); ++i)
{
QTreeWidgetItem *item = dataList->topLevelItem(i);
if (connCount) {
if ((QString(item->text(1)).contains(i18n("CONNECTION OPENED"))) && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost)))
count++;
} else {
if ((QString(item->text(1)).contains(i18n("FILE OPENED"))) && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost)))
count++;
}
}
QString number("");
number.sprintf("%6d", calcCount);
QString hits("");
hits.sprintf("%7d", count);
QTreeWidgetItem *item = new QTreeWidgetItem(viewStatistics);
item->setText(0, number);
item->setText(1, eventCb->currentText());
item->setText(2, serviceLe->text());
item->setText(3, hostLe->text());
item->setText(4, hits);
};
QApplication::restoreOverrideCursor();
}
void StatisticsView::clearStatistics() {
viewStatistics->clear();
calcCount=0;
}
void SambaLog::printItems() {
kDebug() << "****** printing items: ******";
foreach (const LogItem *tmpItem, items)
{
if (!tmpItem)
{
continue;
}
kDebug() << "SERVICE: " << tmpItem->name;
foreach (const SmallLogItem *tmpLog, tmpItem->accessed) {
if (!tmpLog)
{
continue;
}
kDebug() << " accessed by: " << tmpLog->name << " " << tmpLog->count;
}
}
kDebug() << "------ end of printing ------";
}
LogItem* SambaLog::itemInList(const QString &name) {
foreach (LogItem *tmpItem, items)
{
if (!tmpItem)
{
continue;
}
if (tmpItem->name==name)
{
return tmpItem;
}
}
return 0;
}
void SambaLog::addItem(const QString &share, const QString &user) {
//cout<<" adding connection: -"<<share<<"- -"<<user<<"-"<<endl;
LogItem* tmp(itemInList(share));
if (tmp!=0) {
tmp->count++;
tmp->addItem(user);
} else {
items.append(new LogItem(share,user));
};
}
SmallLogItem* LogItem::itemInList(const QString &name) {
foreach (SmallLogItem *tmpLog, accessed) {
if (tmpLog && tmpLog->name==name) {
return tmpLog;
}
}
return 0;
}
void LogItem::addItem(const QString &host) {
SmallLogItem* tmp(itemInList(host));
if (tmp!=0)
tmp->count++;
else
accessed.append(new SmallLogItem(host));
}

View file

@ -1,112 +0,0 @@
/*
* kcmsambastatistics.h
*
* Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
*
* Requires the Qt widget libraries, available at no cost at
* http://www.troll.no/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef kcmsambastatistics_h_included
#define kcmsambastatistics_h_included
#include <QList>
#include <QWidget>
#include <QTreeWidget>
#include <QLabel>
#include <QComboBox>
#include <QCheckBox>
#include <QLineEdit>
#include <QPushButton>
class KConfig;
class SmallLogItem {
public:
SmallLogItem() :
name(""), count(0) {
}
SmallLogItem(const QString &n) :
name(n), count(1) {
}
QString name;
int count;
};
class LogItem {
public:
LogItem() :
name(""), accessed(), count(0) {
}
LogItem(const QString &n, const QString &a) :
name(n), accessed(), count(1) {
accessed.append(new SmallLogItem(a));
}
~LogItem() {
qDeleteAll(accessed);
accessed.clear();
}
QString name;
QList<SmallLogItem *> accessed;
int count;
SmallLogItem* itemInList(const QString &name);
void addItem(const QString &host);
};
class SambaLog {
public:
~SambaLog() {
qDeleteAll(items);
items.clear();
}
QList<LogItem *> items;
void addItem(const QString &share, const QString &host);
void printItems();
private:
LogItem* itemInList(const QString &name);
};
class StatisticsView : public QWidget {
Q_OBJECT
public:
explicit StatisticsView(QWidget *parent=0);
virtual ~StatisticsView() {
}
void saveSettings() {
}
void loadSettings() {
}
public Q_SLOTS:
void setListInfo(QTreeWidget *list, int nrOfFiles, int nrOfConnections);
private:
QTreeWidget* dataList;
QTreeWidget* viewStatistics;
QLabel* connectionsL, *filesL;
QComboBox* eventCb;
QLabel* eventL;
QLineEdit* serviceLe;
QLabel* serviceL;
QLineEdit* hostLe;
QLabel* hostL;
QPushButton* calcButton, *clearButton;
QCheckBox* expandedInfoCb, *expandedUserCb;
int connectionsCount, filesCount, calcCount;
private Q_SLOTS:
void clearStatistics();
void calculate();
};
#endif // main_included

View file

@ -1,216 +0,0 @@
/*
* ksmbstatus.cpp
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <QLayout>
#include <klocale.h>
#include <kdialog.h>
#include <kstandarddirs.h>
#include "ksmbstatus.h"
#include "moc_ksmbstatus.cpp"
#define Before(ttf,in) in.left(in.indexOf(ttf))
#define After(ttf,in) (in.contains(ttf)?QString(in.mid(in.indexOf(ttf)+QString(ttf).length())):QString(""))
NetMon::NetMon(QWidget * parent) :
QWidget(parent), showmountProc(0), strShare(""), strUser(""), strGroup(""), strMachine(""), strSince(""), strPid(""), iUser(0), iGroup(0), iMachine(0), iPid(0) {
QBoxLayout *topLayout = new QVBoxLayout(this);
topLayout->setMargin(KDialog::marginHint());
topLayout->setSpacing(KDialog::spacingHint());
list = new QTreeWidget(this);
topLayout->addWidget(list);
version=new QLabel(this);
version->setTextInteractionFlags(Qt::TextSelectableByMouse);
topLayout->addWidget(version);
list->setAllColumnsShowFocus(true);
list->setMinimumSize(425, 200);
QStringList headers;
headers << i18n("Type") << i18n("Service") << i18n("Accessed From")
<< i18n("UID") << i18n("GID") << i18n("PID") << i18n("Open Files");
list->setHeaderLabels(headers);
timer = new QTimer(this);
timer->start(15000);
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(update()));
update();
}
void NetMon::processNFSLine(char *bufline, int) {
QByteArray line(bufline);
if (line.contains(":/")) {
QTreeWidgetItem *item = new QTreeWidgetItem(list);
item->setText(0, "NFS");
item->setText(0, After(":",line));
item->setText(0, Before(":/",line));
}
}
void NetMon::processSambaLine(char *bufline, int) {
QByteArray line(bufline);
rownumber++;
if (rownumber == 2)
version->setText(bufline); // second line = samba version
if ((readingpart==header) && line.contains("Service")) {
iUser=line.indexOf("uid");
iGroup=line.indexOf("gid");
iPid=line.indexOf("pid");
iMachine=line.indexOf("machine");
} else if ((readingpart==header) && (line.contains("---"))) {
readingpart=connexions;
} else if ((readingpart==connexions) && (int(line.length())>=iMachine)) {
strShare=line.mid(0, iUser);
strUser=line.mid(iUser, iGroup-iUser);
strGroup=line.mid(iGroup, iPid-iGroup);
strPid=line.mid(iPid, iMachine-iPid);
line=line.mid(iMachine, line.length());
strMachine=line;
QTreeWidgetItem * item = new QTreeWidgetItem(list);
item->setText(0, "SMB");
item->setText(1, strShare);
item->setText(2, strMachine);
item->setText(3, strUser);
item->setText(4, strGroup);
item->setText(5, strPid/*,strSince*/);
} else if (readingpart==connexions)
readingpart=locked_files;
else if ((readingpart==locked_files) && (line.indexOf("No ")==0))
readingpart=finished;
else if (readingpart==locked_files) {
if ((strncmp(bufline, "Pi", 2) !=0) // "Pid DenyMode ..."
&& (strncmp(bufline, "--", 2) !=0)) // "------------"
{
char *tok=strtok(bufline, " ");
if (tok) {
int pid=atoi(tok);
(lo)[pid]++;
}
}
}
}
// called when we get some data from smbstatus
// can be called for any size of buffer (one line, several lines,
// half of one ...)
void NetMon::readFromProcess() {
QProcess *process = qobject_cast<QProcess *>(sender());
if (!process || !process->canReadLine())
return;
qint64 buflen = 8046; // 8k enough?
char buffer[buflen];
buflen = process->readLine(buffer, buflen);
//kDebug()<<"received stuff";
char s[250], *start, *end;
size_t len;
start = buffer;
while ((end = strchr(start, '\n'))) // look for '\n'
{
len = end-start;
if (len>=sizeof(s))
len=sizeof(s)-1;
strncpy(s, start, len);
s[len] = '\0';
//kDebug() << "recived: "<<s;
if (readingpart==nfs)
processNFSLine(s, len);
else
processSambaLine(s, len); // process each line
start=end+1;
}
/* FIXME: is this needed? was here with the Q3Support classes, but seems a little inane
if (readingpart==nfs) {
list->viewport()->update();
list->update();
}
*/
// here we could save the remaining part of line, if ever buffer
// doesn't end with a '\n' ... but will this happen ?
}
void NetMon::smbstatusError()
{
version->setText(i18n("Error: Unable to run smbstatus"));
}
void NetMon::update() {
QProcess *process = new QProcess();
memset(&lo, 0, sizeof(lo));
list->clear();
/* Re-read the Contents ... */
QString smbstatusExe = KStandardDirs::findRootExe("smbstatus");
rownumber=0;
readingpart=header;
nrpid=0;
connect(process, SIGNAL(readyRead()), SLOT(readFromProcess()));
connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(smbstatusError()));
process->start(smbstatusExe);
process->waitForFinished();
if (rownumber==0) { // empty result
version->setText(i18n("Error: Unable to open configuration file \"smb.conf\""));
} else {
// ok -> count the number of locked files for each pid
for (int i = 0; i < list->topLevelItemCount(); ++i)
{
QTreeWidgetItem *row = list->topLevelItem(i);
// cerr<<"NetMon::update: this should be the pid: "<<row->text(5)<<endl;
int pid=row->text(5).toInt();
row->setText(6,QString::number((lo)[pid]));
}
}
delete process;
process=0;
QString showmountExe = KStandardDirs::findRootExe("showmount");
readingpart=nfs;
delete showmountProc;
showmountProc=new QProcess();
connect(showmountProc, SIGNAL(readyRead()), SLOT(readFromProcess()));
//without this timer showmount hangs up to 5 minutes
//if the portmapper daemon isn't running
QTimer::singleShot(5000,this,SLOT(killShowmount()));
//kDebug()<<"starting kill timer with 5 seconds";
connect(showmountProc,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(killShowmount()));
connect(showmountProc,SIGNAL(error(QProcess::ProcessError)),this,SLOT(killShowmount()));
showmountProc->start(showmountExe, QStringList() << "-a" << "localhost");
version->adjustSize();
list->show();
}
void NetMon::killShowmount() {
//kDebug()<<"killShowmount()";
showmountProc->deleteLater();
showmountProc=0;
}

View file

@ -1,61 +0,0 @@
/*
* ksmbstatus.h
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef ksmbstatus_h_included
#define ksmbstatus_h_included
#include <QTimer>
#include <QTreeWidget>
#include <QLabel>
#include <QProcess>
#include <KConfig>
#define SCREEN_XY_OFFSET 20
class NetMon : public QWidget {
Q_OBJECT
public:
explicit NetMon(QWidget *parent);
void saveSettings() {
}
void loadSettings() {
}
private:
QProcess *showmountProc;
QTreeWidget *list;
QLabel *version;
QTimer *timer;
int rownumber;
enum {header, connexions, locked_files, finished, nfs} readingpart;
int lo[65536];
int nrpid;
void processNFSLine(char *bufline, int linelen);
void processSambaLine(char *bufline, int linelen);
QByteArray strShare, strUser, strGroup, strMachine, strSince, strPid;
int iUser, iGroup, iMachine, iPid;
private Q_SLOTS:
void killShowmount();
void update();
void readFromProcess();
void smbstatusError();
};
#endif // main_included

View file

@ -1,107 +0,0 @@
/*
* main.cpp for the samba kcontrol module
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <QLayout>
#include <QTabWidget>
#include <kaboutdata.h>
#include <kcmodule.h>
#include <kdialog.h>
#include "kcmsambaimports.h"
#include "kcmsambalog.h"
#include "kcmsambastatistics.h"
#include "ksmbstatus.h"
#include <KPluginFactory>
class SambaContainer : public KCModule {
Q_OBJECT
public:
SambaContainer(QWidget *parent=0, const QVariantList &list = QVariantList());
virtual ~SambaContainer();
virtual void load();
virtual void save();
private:
KConfig config;
QTabWidget tabs;
NetMon status;
ImportsView imports;
LogView logView;
StatisticsView statisticsView;
};
K_PLUGIN_FACTORY(SambaFactory,
registerPlugin<SambaContainer>();
)
K_EXPORT_PLUGIN(SambaFactory("kcmsamba"))
SambaContainer::SambaContainer(QWidget *parent, const QVariantList&) :
KCModule(SambaFactory::componentData(), parent), config("kcmsambarc"), tabs(this), status(&tabs), imports(&tabs), logView(&tabs, &config), statisticsView(&tabs) {
QVBoxLayout *layout = new QVBoxLayout( this );
layout->setMargin(0);
layout->setSpacing(0);
layout->addWidget(&tabs);
tabs.addTab(&status, i18n("&Exports"));
tabs.addTab(&imports, i18n("&Imports"));
tabs.addTab(&logView, i18n("&Log"));
tabs.addTab(&statisticsView, i18n("&Statistics"));
connect(&logView, SIGNAL(contentsChanged(QTreeWidget*,int,int)), &statisticsView, SLOT(setListInfo(QTreeWidget*,int,int)));
setButtons(Help);
setQuickHelp(i18n("<p>The Samba and NFS Status Monitor is a front end to the programs"
" <em>smbstatus</em> and <em>showmount</em>. Smbstatus reports on current"
" Samba connections, and is part of the suite of Samba tools, which"
" implements the SMB (Session Message Block) protocol, also called the"
" NetBIOS or LanManager protocol. This protocol can be used to provide"
" printer sharing or drive sharing services on a network including"
" machines running the various flavors of Microsoft Windows.</p>"));
KAboutData *about = new KAboutData(I18N_NOOP("kcmsamba"), 0,
ki18n("System Information Control Module"),
0, KLocalizedString(), KAboutData::License_GPL,
ki18n("(c) 2002 KDE Information Control Module Samba Team"));
about->addAuthor(ki18n("Michael Glauche"), KLocalizedString(), "glauche@isa.rwth-aachen.de");
about->addAuthor(ki18n("Matthias Hoelzer"), KLocalizedString(), "hoelzer@kde.org");
about->addAuthor(ki18n("David Faure"), KLocalizedString(), "faure@kde.org");
about->addAuthor(ki18n("Harald Koschinski"), KLocalizedString(), "Harald.Koschinski@arcormail.de");
about->addAuthor(ki18n("Wilco Greven"), KLocalizedString(), "greven@kde.org");
about->addAuthor(ki18n("Alexander Neundorf"), KLocalizedString(), "neundorf@kde.org");
setAboutData(about);
}
SambaContainer::~SambaContainer() {
save();
}
void SambaContainer::load() {
status.loadSettings();
imports.loadSettings();
logView.loadSettings();
statisticsView.loadSettings();
}
void SambaContainer::save() {
status.saveSettings();
imports.saveSettings();
logView.saveSettings();
statisticsView.saveSettings();
config.sync();
}
#include "main.moc"

View file

@ -1,241 +0,0 @@
[Desktop Entry]
Exec=kcmshell4 smbstatus
Icon=preferences-system-network-share-windows-status
Type=Service
X-KDE-ServiceTypes=KCModule
X-KDE-KInfoCenter-Category=network_information
X-KDE-Library=kcm_samba
X-KDE-ParentApp=kinfocenter
X-DocPath=kinfocenter/index.html#smbstatus
Name=Samba Status
Name[af]=Samba Status
Name[ar]=حالة السامبا
Name[as]=Samba
Name[ast]=Estáu de Samba
Name[be]=Стан Samba
Name[be@latin]=Stanovišča słužby Samba
Name[bg]=Сървър Samba
Name[bn]=
Name[bn_IN]=Samba-
Name[br]=Saviad Samba
Name[bs]=Stanje Sambe
Name[ca]=Estat de Samba
Name[ca@valencia]=Estat de Samba
Name[cs]=Stav Samby
Name[csb]=Sztaus Samba
Name[cy]=Cyflwr Samba
Name[da]=Samba-status
Name[de]=Samba-Status
Name[el]=Κατάσταση samba
Name[en_GB]=Samba Status
Name[eo]=Samba stato
Name[es]=Estado de Samba
Name[et]=Samba olek
Name[eu]=Samba-ren egoera
Name[fa]=وضعیت Samba
Name[fi]=Samban tila
Name[fr]=État de Samba
Name[fy]=Samba-tastân
Name[ga]=Stádas Samba
Name[gl]=Estado de Samba
Name[gu]= િિ
Name[he]=מצב Samba
Name[hi]= िि
Name[hne]= िि
Name[hr]=Stanje Sambe
Name[hsb]=Samba status
Name[hu]=Samba
Name[ia]=Stato de Samba
Name[id]=Status Samba
Name[is]=Staða Samba
Name[it]=Stato di Samba
Name[ja]=Samba
Name[ka]=Samba-
Name[kk]=Samba сервері
Name[km]= Samba
Name[kn]= ಿಿಿ
Name[ko]=
Name[ku]=Rewşa Sambayê
Name[lt]=Samba būsena
Name[lv]=Samba statuss
Name[mai]= िि
Name[mk]=Статус на Samba
Name[ml]= ിിി
Name[mr]= िि
Name[ms]=Status Samba
Name[nb]=Samba-status
Name[nds]=Samba-Status
Name[ne]= िि
Name[nl]=Samba-status
Name[nn]=Samba-status
Name[or]= ିି
Name[pa]=
Name[pl]=Stan Samby
Name[pt]=Estado do Samba
Name[pt_BR]=Estado do Samba
Name[ro]=Stare Samba
Name[ru]=Сервер Samba
Name[se]=Samba stáhtus
Name[si]=
Name[sk]=Stav Samby
Name[sl]=Stanje Sambe
Name[sr]=Стање Самбе
Name[sr@ijekavian]=Стање Самбе
Name[sr@ijekavianlatin]=Stanje Sambe
Name[sr@latin]=Stanje Sambe
Name[sv]=Samba-status
Name[ta]= ி
Name[te]= ిి
Name[tg]=Ҳолати Samba
Name[th]= Samba
Name[tr]=Samba Servisi
Name[ug]=Samba ھالىتى
Name[uk]=Стан Samba
Name[uz]=Samba'ning holati
Name[uz@cyrillic]=Samba'нинг ҳолати
Name[vi]=Trng thái Samba
Name[wa]=Estat di Samba
Name[xh]=Isimo se Samba
Name[x-test]=xxSamba Statusxx
Name[zh_CN]=Samba
Name[zh_TW]=Samba
Comment=Samba status monitor
Comment[af]=Samba status monitor
Comment[ar]=مراقب حالة السامبا
Comment[as]=Samba ি
Comment[ast]=Monitor d'estáu de Samba
Comment[be]=Назіральнік стану Samba
Comment[be@latin]=Nazirańnik za stanoviščam słužby Samba
Comment[bg]=Данни за състоянието на сървъра Samba
Comment[bn]= ি
Comment[bn_IN]=Samba ি
Comment[br]=Diskwel saviad Samba
Comment[bs]=Nadgledanje stanja Sambe
Comment[ca]=Monitor de l'estat de Samba
Comment[ca@valencia]=Monitor de l'estat de Samba
Comment[cs]=Monitor stavu Samby
Comment[csb]=Mònitor stónu Sambë
Comment[cy]=Monitr cyflwr samba
Comment[da]=Overvågning af samba-status
Comment[de]=Samba-Statusmonitor
Comment[el]=Εποπτεία της Samba
Comment[en_GB]=Samba status monitor
Comment[eo]=Rigardilo por la stato de Samba
Comment[es]=Monitor de estado de Samba
Comment[et]=Samba oleku jälgimine
Comment[eu]=Samba-ren egoeraren monitorea
Comment[fa]=نمایشگر وضعیت Samba
Comment[fi]=Samban tilan näyttö
Comment[fr]=Indicateur d'état de Samba
Comment[fy]=Sambatastânmonitor
Comment[ga]=Monatóir stádais Samba
Comment[gl]=Vixilante do estado de Samba
Comment[gu]= િિ
Comment[he]=מידע על המצב של Samba
Comment[hi]= िि
Comment[hne]= िि
Comment[hr]=Nadzor stanje Sambe
Comment[hsb]=Samba statusowy monitor
Comment[hu]=Samba állapotmonitor
Comment[ia]=Monitor de stato de Samba
Comment[id]=Monitor status Samba
Comment[is]=Eftirlit með stöðu Samba
Comment[it]=Monitor dello stato di Samba
Comment[ja]=Samba
Comment[ka]=Samba-
Comment[kk]=Samba күйін бақылау
Comment[km]= Samba
Comment[kn]= ಿಿಿ ಿ
Comment[ko]=
Comment[ku]=Temaşekarê Rewşa Sambayê
Comment[lt]=Samba būsenos monitorius
Comment[lv]=Sambas statusa monitors
Comment[mai]= िि
Comment[mk]=Монитор на статусот на Samba
Comment[ml]= ിിി
Comment[mr]= िि
Comment[ms]=Monitor status Samba
Comment[nb]=Overvåking av Samba-status
Comment[nds]=Statuskieker för Samba
Comment[ne]= िि ि
Comment[nl]=Sambastatusmonitor
Comment[nn]=Overvaking av Samba-status
Comment[or]= ିି ି
Comment[pa]= ਿ
Comment[pl]=Monitor stanu Samby
Comment[pt]=Monitor do estado do Samba
Comment[pt_BR]=Monitor de estado do Samba
Comment[ro]=Monitorizează starea serverului Samba
Comment[ru]=Состояние сервера Samba
Comment[se]=Gozit Samba stáhtusa
Comment[si]=
Comment[sk]=Monitor stavu Samby
Comment[sl]=Nadzornik stanja Sambe
Comment[sr]=Надгледање стања Самбе
Comment[sr@ijekavian]=Надгледање стања Самбе
Comment[sr@ijekavianlatin]=Nadgledanje stanja Sambe
Comment[sr@latin]=Nadgledanje stanja Sambe
Comment[sv]=Övervakar Samba-status
Comment[ta]= ி ி
Comment[te]= ిి ి
Comment[tg]=Барномаи ҳолатҳои Samba
Comment[th]= Samba
Comment[tr]=Samba durum izleyici
Comment[ug]=Samba ھالەت كۆزەتكۈچىسى
Comment[uk]=Монітор стану Samba
Comment[uz]=Samba'ning holatini nazorat qiluvchi vosita
Comment[uz@cyrillic]=Samba'нинг ҳолатини назорат қилувчи восита
Comment[vi]=Theo dõi trng thái Samba
Comment[wa]=Corwaitoe di l' estat di Samba
Comment[xh]=Umphathi wemeko we Samba
Comment[x-test]=xxSamba status monitorxx
Comment[zh_CN]=Samba
Comment[zh_TW]=Samba
X-KDE-Keywords=SMB,SAMBA,Windows network,LAN,System Information
X-KDE-Keywords[bs]=SMB,SAMBA,Windows umrežavanje,LAN,Sistemske informacije
X-KDE-Keywords[ca]=SMB,SAMBA,Xarxa Windows,LAN,Informació del sistema
X-KDE-Keywords[ca@valencia]=SMB,SAMBA,Xarxa Windows,LAN,Informació del sistema
X-KDE-Keywords[da]=SMB,SAMBA,Windows netværk,LAN,Systeminformation
X-KDE-Keywords[de]=SMB,Samba,Windows-Netzwerk,LAN,Systeminformationen
X-KDE-Keywords[el]=SMB,SAMBA,δίκτυο Windows,LAN,πληροφορίες συστήματος
X-KDE-Keywords[en_GB]=SMB,SAMBA,Windows network,LAN,System Information
X-KDE-Keywords[es]=SMB,SAMBA,Red Windows,LAN,Información del sistema
X-KDE-Keywords[et]=SMB,SAMBA,Windowsi võrk,LAN,süsteemi teave
X-KDE-Keywords[eu]=SMB,SAMBA,Windows sarea,LAN,sistema-informazioa
X-KDE-Keywords[fi]=SMB,SAMBA,Windows-verkko,LAN,järjestelmätiedot
X-KDE-Keywords[fr]=SMB, SAMBA, réseau Windows, LAN, Informations système
X-KDE-Keywords[ga]=SMB,SAMBA,Líonra Windows,LAN,líonra logánta,Eolas faoin Chóras
X-KDE-Keywords[gl]=SMB,SAMBA,Rede de Windows,LAN,Información do sistema
X-KDE-Keywords[hu]=SMB,SAMBA,Windows hálózat,LAN,Rendszerinformáció
X-KDE-Keywords[ia]=SMB,SAMBA,rete de Windows,LAN,Information de systema
X-KDE-Keywords[it]=SMB,SAMBA,rete di Windows,LAN,Informazioni di sistema
X-KDE-Keywords[kk]=SMB,SAMBA,Windows network,LAN,System Information
X-KDE-Keywords[km]=SMB,SAMBA,Windows network,LAN,System Information
X-KDE-Keywords[ko]=SMB,SAMBA,Windows network,LAN,System Information,,, , ,
X-KDE-Keywords[mr]=SMB, SAMBA, ि , LAN,
X-KDE-Keywords[nb]=SMB,SAMBA,Windows-nettverk,LAN,Systeminformasjon
X-KDE-Keywords[nds]=SMB,SAMBA,Windows-Nettwark,LAN,Systeem-Informatschonen
X-KDE-Keywords[nl]=SMB,SAMBA,Windows-netwerk,LAN,systeeminformatie
X-KDE-Keywords[pa]=SMB,SAMBA,ਿ ,LAN,ਿ
X-KDE-Keywords[pl]=SMB,SAMBA,Sieć Windows,LAN,Informacje o systemie
X-KDE-Keywords[pt]=SMB,SAMBA,rede Windows,LAN,Informação do Sistema
X-KDE-Keywords[pt_BR]=SMB,SAMBA,Rede Windows,LAN,Informação do sistema
X-KDE-Keywords[ro]=SMB,SAMBA,rețea Windows,LAN,informații sistem,rețea locală
X-KDE-Keywords[ru]=SMB,SAMBA,Windows network,LAN,System Information,сеть Windows,локальная сеть,локальная вычислительная сеть,ЛВС
X-KDE-Keywords[sk]=SMB,SAMBA,Sieť Windows,LAN,Systémové informácie
X-KDE-Keywords[sl]=smb,samba,omrežje Windows,lan,krajevno omrežje,sistemski podatki,podatki o sistemu
X-KDE-Keywords[sr]=SMB,SAMBA,Windows network,LAN,System Information,СМБ,Самба,виндоуз мрежа,ЛАН,системске информације
X-KDE-Keywords[sr@ijekavian]=SMB,SAMBA,Windows network,LAN,System Information,СМБ,Самба,виндоуз мрежа,ЛАН,системске информације
X-KDE-Keywords[sr@ijekavianlatin]=SMB,SAMBA,Windows network,LAN,System Information,SMB,Samba,windows mreža,LAN,sistemske informacije
X-KDE-Keywords[sr@latin]=SMB,SAMBA,Windows network,LAN,System Information,SMB,Samba,windows mreža,LAN,sistemske informacije
X-KDE-Keywords[sv]=SMB,SAMBA,Windows-nätverk,LAN,Systeminformation
X-KDE-Keywords[tr]=SMB,SAMBA,Windows ağı,LAN,Yerel Ağ,Sistem Bilgileri
X-KDE-Keywords[uk]=SMB,SAMBA,Windows network,LAN,System Information,мережа,віндоус,віндоуз,віндовс,віндовз,система,інформація,відомості
X-KDE-Keywords[x-test]=xxSMB,SAMBA,Windows network,LAN,System Informationxx
X-KDE-Keywords[zh_CN]=SMB,SAMBA,Windows network,LAN,System Information,Windows ,,,
X-KDE-Keywords[zh_TW]=SMB,SAMBA,Windows network,LAN,System Information
Categories=Qt;KDE;X-KDE-information;

View file

@ -18,12 +18,3 @@ if(GPHOTO2_FOUND)
endif() endif()
add_subdirectory( floppy ) add_subdirectory( floppy )
check_include_files(rpc/rpc.h HAVE_RPC_RPC_H)
add_feature_info("NFS kioslave" HAVE_RPC_RPC_H "The RPC library is needed to build the NFS kioslave")
if(HAVE_RPC_RPC_H)
add_subdirectory(nfs)
endif()
if(SAMBA_FOUND)
add_subdirectory(smb)
endif()

View file

@ -1,2 +0,0 @@
Written and maintained by:
Alexander Neundorf, neundorf@kde.org

View file

@ -1,42 +0,0 @@
## Check for XDR types
include(CheckTypeSize)
cmake_reset_check_state()
set(CMAKE_EXTRA_INCLUDE_FILES "rpc/rpc.h")
check_type_size(xdr_u_int64_t HAVE_XDR_U_INT64_T)
check_type_size(xdr_uint64_t HAVE_XDR_UINT64_T)
check_type_size(xdr_u_hyper HAVE_XDR_U_HYPER)
check_type_size(xdr_u_longlong_t HAVE_XDR_U_LONGLONG_T)
cmake_reset_check_state()
if (NOT HAVE_XDR_U_INT64_T AND NOT HAVE_XDR_UINT64_T AND NOT HAVE_XDR_U_HYPER AND NOT HAVE_XDR_U_LONGLONG_T)
message(FATAL_ERROR "Could not find 64-bit XDR data types!")
endif (NOT HAVE_XDR_U_INT64_T AND NOT HAVE_XDR_UINT64_T AND NOT HAVE_XDR_U_HYPER AND NOT HAVE_XDR_U_LONGLONG_T)
if (HAVE_XDR_U_INT64_T)
add_definitions(-DHAVE_XDR_U_INT64_T)
endif (HAVE_XDR_U_INT64_T)
if (HAVE_XDR_UINT64_T)
add_definitions(-DHAVE_XDR_UINT64_T)
endif (HAVE_XDR_UINT64_T)
if (HAVE_XDR_U_HYPER)
add_definitions(-DHAVE_XDR_U_HYPER)
endif (HAVE_XDR_U_HYPER)
if (HAVE_XDR_U_LONGLONG_T)
add_definitions(-DHAVE_XDR_U_LONGLONG_T)
endif (HAVE_XDR_U_LONGLONG_T)
set(kio_nfs_PART_SRCS kio_nfs.cpp nfsv2.cpp nfsv3.cpp rpc_nfs3_prot_xdr.c rpc_nfs2_prot_xdr.c )
kde4_add_plugin(kio_nfs ${kio_nfs_PART_SRCS})
target_link_libraries(kio_nfs ${KDE4_KIO_LIBS})
install(TARGETS kio_nfs DESTINATION ${KDE4_PLUGIN_INSTALL_DIR} )
########### install files ###############
install( FILES nfs.protocol DESTINATION ${KDE4_SERVICES_INSTALL_DIR} )

View file

@ -1,2 +0,0 @@
#!/bin/bash
$XGETTEXT *.cpp -o $podir/kio_nfs.pot

View file

@ -1,3 +0,0 @@
This contains a kio slave for NFS version 2 and 3.
Mathias

View file

@ -1,5 +0,0 @@
-maybe use rpcgen ?
-cache handling: how long should file handles be cached ?
should the stat'ed structures be cached ? no, IMHO
Alex

View file

@ -1,739 +0,0 @@
/* This file is part of the KDE project
Copyright(C) 2000 Alexander Neundorf <neundorf@kde.org>,
2014 Mathias Tillman <master.homer@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kio_nfs.h"
#include <config-workspace.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utsname.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QtNetwork/QHostInfo>
#include <KDebug>
#include <KLocalizedString>
#include <kio/global.h>
#include "nfsv2.h"
#include "nfsv3.h"
using namespace KIO;
using namespace std;
extern "C" int Q_DECL_EXPORT kdemain(int argc, char** argv);
int kdemain(int argc, char** argv)
{
if (argc != 4) {
fprintf(stderr, "Usage: kio_nfs protocol domain-socket1 domain-socket2\n");
exit(-1);
}
kDebug(7121) << "NFS: kdemain: starting";
NFSSlave slave(argv[2], argv[3]);
slave.dispatchLoop();
return 0;
}
NFSSlave::NFSSlave(const QByteArray& pool, const QByteArray& app)
: KIO::SlaveBase("nfs", pool, app),
m_protocol(NULL)
{
kDebug(7121) << pool << app;
}
NFSSlave::~NFSSlave()
{
if (m_protocol != NULL) {
delete m_protocol;
}
}
void NFSSlave::openConnection()
{
kDebug(7121) << "openConnection";
if (m_protocol != NULL) {
m_protocol->openConnection();
} else {
bool connectionError = false;
int version = 4;
while (version > 1) {
kDebug(7121) << "Trying NFS version" << version;
// We need to create a new NFS protocol handler
switch (version) {
case 4: {
// TODO
kDebug(7121) << "NFSv4 is not supported at this time";
}
break;
case 3: {
m_protocol = new NFSProtocolV3(this);
}
break;
case 2: {
m_protocol = new NFSProtocolV2(this);
}
break;
}
// Unimplemented protocol version
if (m_protocol == NULL) {
version--;
continue;
}
m_protocol->setHost(m_host);
if (m_protocol->isCompatible(connectionError)) {
break;
}
version--;
delete m_protocol;
m_protocol = NULL;
}
if (m_protocol == NULL) {
// If we could not find a compatible protocol, send an error.
if (!connectionError) {
error(KIO::ERR_COULD_NOT_CONNECT, i18n("%1: Unsupported NFS version", m_host));
} else {
error(KIO::ERR_COULD_NOT_CONNECT, m_host);
}
} else {
// Otherwise we open the connection
m_protocol->openConnection();
}
}
}
void NFSSlave::closeConnection()
{
kDebug(7121);
if (m_protocol != NULL) {
m_protocol->closeConnection();
}
}
void NFSSlave::setHost(const QString& host, quint16 /*port*/, const QString& /*user*/, const QString& /*pass*/)
{
kDebug(7121);
if (m_protocol != NULL) {
// New host? New protocol!
if (m_host != host) {
kDebug(7121) << "Deleting old protocol";
delete m_protocol;
m_protocol = NULL;
} else {
m_protocol->setHost(host);
}
}
m_host = host;
}
void NFSSlave::put(const KUrl& url, int _mode, KIO::JobFlags _flags)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->put(url, _mode, _flags);
}
}
void NFSSlave::get(const KUrl& url)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->get(url);
}
}
void NFSSlave::listDir(const KUrl& url)
{
kDebug(7121) << url;
if (verifyProtocol()) {
m_protocol->listDir(url);
}
}
void NFSSlave::symlink(const QString& target, const KUrl& dest, KIO::JobFlags _flags)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->symlink(target, dest, _flags);
}
}
void NFSSlave::stat(const KUrl& url)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->stat(url);
}
}
void NFSSlave::mkdir(const KUrl& url, int permissions)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->mkdir(url, permissions);
}
}
void NFSSlave::del(const KUrl& url, bool isfile)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->del(url, isfile);
}
}
void NFSSlave::chmod(const KUrl& url, int permissions)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->chmod(url, permissions);
}
}
void NFSSlave::rename(const KUrl& src, const KUrl& dest, KIO::JobFlags flags)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->rename(src, dest, flags);
}
}
void NFSSlave::copy(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags)
{
kDebug(7121);
if (verifyProtocol()) {
m_protocol->copy(src, dest, mode, flags);
}
}
bool NFSSlave::verifyProtocol()
{
const bool haveProtocol = (m_protocol != NULL);
if (!haveProtocol) {
openConnection();
if (m_protocol == NULL) {
// We have failed.... :(
kDebug(7121) << "Could not find a compatible protocol version!!";
return false;
}
// If we are not connected @openConnection will have sent an
// error message to the client, so it's safe to return here.
if (!m_protocol->isConnected()) {
return false;
}
} else if (!m_protocol->isConnected()) {
m_protocol->openConnection();
if (!m_protocol->isConnected()) {
return false;
}
}
if (m_protocol->isConnected()) {
return true;
}
finished();
return false;
}
NFSFileHandle::NFSFileHandle()
{
init();
}
NFSFileHandle::NFSFileHandle(const NFSFileHandle& src)
{
init();
(*this) = src;
}
NFSFileHandle::NFSFileHandle(const fhandle3& src)
{
init();
(*this) = src;
}
NFSFileHandle::NFSFileHandle(const fhandle& src)
{
init();
(*this) = src;
}
NFSFileHandle::NFSFileHandle(const nfs_fh3& src)
{
init();
(*this) = src;
}
NFSFileHandle::NFSFileHandle(const nfs_fh& src)
{
init();
(*this) = src;
}
NFSFileHandle::~NFSFileHandle()
{
if (m_handle != NULL) {
delete [] m_handle;
}
if (m_linkHandle != NULL) {
delete [] m_linkHandle;
}
}
void NFSFileHandle::init()
{
m_handle = NULL;
m_size = 0;
m_linkHandle = NULL;
m_linkSize = 0;
m_isInvalid = true;
m_isLink = false;
}
void NFSFileHandle::toFH(nfs_fh3& fh) const
{
fh.data.data_len = m_size;
fh.data.data_val = m_handle;
}
void NFSFileHandle::toFH(nfs_fh& fh) const
{
memcpy(fh.data, m_handle, m_size);
}
void NFSFileHandle::toFHLink(nfs_fh3& fh) const
{
fh.data.data_len = m_linkSize;
fh.data.data_val = m_linkHandle;
}
void NFSFileHandle::toFHLink(nfs_fh& fh) const
{
memcpy(fh.data, m_linkHandle, m_size);
}
NFSFileHandle& NFSFileHandle::operator=(const NFSFileHandle& src)
{
if (src.m_size > 0) {
if (m_handle != NULL) {
delete [] m_handle;
m_handle = NULL;
}
m_size = src.m_size;
m_handle = new char[m_size];
memcpy(m_handle, src.m_handle, m_size);
}
if (src.m_linkSize > 0) {
if (m_linkHandle != NULL) {
delete [] m_linkHandle;
m_linkHandle = NULL;
}
m_linkSize = src.m_linkSize;
m_linkHandle = new char[m_linkSize];
memcpy(m_linkHandle, src.m_linkHandle, m_linkSize);
}
m_isInvalid = src.m_isInvalid;
m_isLink = src.m_isLink;
return *this;
}
NFSFileHandle& NFSFileHandle::operator=(const fhandle3& src)
{
if (m_handle != NULL) {
delete [] m_handle;
m_handle = NULL;
}
m_size = src.fhandle3_len;
m_handle = new char[m_size];
memcpy(m_handle, src.fhandle3_val, m_size);
m_isInvalid = false;
return *this;
}
NFSFileHandle& NFSFileHandle::operator=(const fhandle& src)
{
if (m_handle != NULL) {
delete [] m_handle;
m_handle = NULL;
}
m_size = NFS_FHSIZE;
m_handle = new char[m_size];
memcpy(m_handle, src, m_size);
m_isInvalid = false;
return *this;
}
NFSFileHandle& NFSFileHandle::operator=(const nfs_fh3& src)
{
if (m_handle != NULL) {
delete [] m_handle;
m_handle = NULL;
}
m_size = src.data.data_len;
m_handle = new char[m_size];
memcpy(m_handle, src.data.data_val, m_size);
m_isInvalid = false;
return *this;
}
NFSFileHandle& NFSFileHandle::operator=(const nfs_fh& src)
{
if (m_handle != NULL) {
delete [] m_handle;
m_handle = NULL;
}
m_size = NFS_FHSIZE;
m_handle = new char[m_size];
memcpy(m_handle, src.data, m_size);
m_isInvalid = false;
return *this;
}
void NFSFileHandle::setLinkSource(const nfs_fh3& src)
{
if (m_linkHandle != NULL) {
delete [] m_linkHandle;
m_linkHandle = NULL;
}
m_linkSize = src.data.data_len;
m_linkHandle = new char[m_linkSize];
memcpy(m_linkHandle, src.data.data_val, m_linkSize);
m_isLink = true;
}
void NFSFileHandle::setLinkSource(const nfs_fh& src)
{
if (m_linkHandle != NULL) {
delete [] m_linkHandle;
m_linkHandle = NULL;
}
m_linkSize = NFS_FHSIZE;
m_linkHandle = new char[m_linkSize];
memcpy(m_linkHandle, src.data, m_linkSize);
m_isLink = true;
}
NFSProtocol::NFSProtocol(NFSSlave* slave)
: m_slave(slave)
{
}
void NFSProtocol::copy(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags)
{
if (src.isLocalFile()) {
copyTo(src, dest, mode, flags);
} else if (dest.isLocalFile()) {
copyFrom(src, dest, mode, flags);
} else {
copySame(src, dest, mode, flags);
}
}
void NFSProtocol::addExportedDir(const QString& path)
{
m_exportedDirs.append(path);
}
const QStringList& NFSProtocol::getExportedDirs()
{
return m_exportedDirs;
}
bool NFSProtocol::isExportedDir(const QString& path)
{
// If the path is the root filesystem we always return true.
if (QFileInfo(path).isRoot()) {
return true;
}
for (QStringList::const_iterator it = m_exportedDirs.constBegin(); it != m_exportedDirs.constEnd(); ++it) {
if (path.length() < (*it).length() && (*it).startsWith(path)) {
QString rest = (*it).mid(path.length());
if (rest.isEmpty() || rest[0] == QDir::separator()) {
kDebug(7121) << "isExportedDir" << path << "returning true";
return true;
}
}
}
return false;
}
void NFSProtocol::removeExportedDir(const QString& path)
{
m_exportedDirs.removeOne(path);
}
void NFSProtocol::addFileHandle(const QString& path, NFSFileHandle fh)
{
m_handleCache.insert(path, fh);
}
NFSFileHandle NFSProtocol::getFileHandle(const QString& path)
{
if (!isConnected()) {
return NFSFileHandle();
}
if (!isValidPath(path)) {
kDebug(7121) << path << "is not a valid path";
return NFSFileHandle();
}
// The handle may already be in the cache, check it now.
// The exported dirs are always in the cache.
if (m_handleCache.contains(path)) {
return m_handleCache[path];
}
// Loop detected, abort.
if (QFileInfo(path).path() == path) {
return NFSFileHandle();
}
// Look up the file handle from the procotol
NFSFileHandle childFH = lookupFileHandle(path);
if (!childFH.isInvalid()) {
m_handleCache.insert(path, childFH);
}
return childFH;
}
void NFSProtocol::removeFileHandle(const QString& path)
{
m_handleCache.remove(path);
}
bool NFSProtocol::isValidPath(const QString& path)
{
if (path.isEmpty() || path == QDir::separator()) {
return true;
}
for (QStringList::const_iterator it = m_exportedDirs.constBegin(); it != m_exportedDirs.constEnd(); ++it) {
if ((path.length() == (*it).length() && path.startsWith((*it))) || (path.startsWith((*it) + QDir::separator()))) {
return true;
}
}
return false;
}
bool NFSProtocol::isValidLink(const QString& parentDir, const QString& linkDest)
{
if (linkDest.isEmpty()) {
return false;
}
if (QFileInfo(linkDest).isAbsolute()) {
return (!getFileHandle(linkDest).isInvalid());
} else {
QString absDest = QFileInfo(parentDir, linkDest).filePath();
absDest = QDir::cleanPath(absDest);
return (!getFileHandle(absDest).isInvalid());
}
return false;
}
int NFSProtocol::openConnection(const QString& host, int prog, int vers, CLIENT*& client, int& sock)
{
if (host.isEmpty()) {
return KIO::ERR_UNKNOWN_HOST;
}
struct sockaddr_in server_addr;
if (host[0] >= '0' && host[0] <= '9') {
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(host.toLatin1());
} else {
struct hostent* hp = gethostbyname(host.toLatin1());
if (hp == 0) {
return KIO::ERR_UNKNOWN_HOST;
}
server_addr.sin_family = AF_INET;
memcpy(&server_addr.sin_addr, hp->h_addr, hp->h_length);
}
server_addr.sin_port = 0;
sock = RPC_ANYSOCK;
client = clnttcp_create(&server_addr, prog, vers, &sock, 0, 0);
if (client == 0) {
server_addr.sin_port = 0;
sock = RPC_ANYSOCK;
timeval pertry_timeout;
pertry_timeout.tv_sec = 3;
pertry_timeout.tv_usec = 0;
client = clntudp_create(&server_addr, prog, vers, pertry_timeout, &sock);
if (client == 0) {
::close(sock);
return KIO::ERR_COULD_NOT_CONNECT;
}
}
QString hostName = QHostInfo::localHostName();
QString domainName = QHostInfo::localDomainName();
if (!domainName.isEmpty()) {
hostName = hostName + QLatin1Char('.') + domainName;
}
client->cl_auth = authunix_create(hostName.toUtf8().data(), geteuid(), getegid(), 0, 0);
return 0;
}
bool NFSProtocol::checkForError(int clientStat, int nfsStat, const QString& text)
{
if (clientStat != RPC_SUCCESS) {
kDebug(7121) << "RPC error" << clientStat << text;
m_slave->error(KIO::ERR_INTERNAL_SERVER, i18n("RPC error %1", clientStat));
return false;
}
if (nfsStat != NFS_OK) {
kDebug(7121) << "NFS error:" << nfsStat << text;
switch (nfsStat) {
case NFSERR_PERM:
m_slave->error(KIO::ERR_ACCESS_DENIED, text);
break;
case NFSERR_NOENT:
m_slave->error(KIO::ERR_DOES_NOT_EXIST, text);
break;
//does this mapping make sense ?
case NFSERR_IO:
m_slave->error(KIO::ERR_INTERNAL_SERVER, text);
break;
//does this mapping make sense ?
case NFSERR_NXIO:
m_slave->error(KIO::ERR_DOES_NOT_EXIST, text);
break;
case NFSERR_ACCES:
m_slave->error(KIO::ERR_ACCESS_DENIED, text);
break;
case NFSERR_EXIST:
m_slave->error(KIO::ERR_FILE_ALREADY_EXIST, text);
break;
//does this mapping make sense ?
case NFSERR_NODEV:
m_slave->error(KIO::ERR_DOES_NOT_EXIST, text);
break;
case NFSERR_NOTDIR:
m_slave->error(KIO::ERR_IS_FILE, text);
break;
case NFSERR_ISDIR:
m_slave->error(KIO::ERR_IS_DIRECTORY, text);
break;
//does this mapping make sense ?
case NFSERR_FBIG:
m_slave->error(KIO::ERR_INTERNAL_SERVER, text);
break;
//does this mapping make sense ?
case NFSERR_NOSPC:
m_slave->error(KIO::ERR_INTERNAL_SERVER, i18n("No space left on device"));
break;
case NFSERR_ROFS:
m_slave->error(KIO::ERR_COULD_NOT_WRITE, i18n("Read only file system"));
break;
case NFSERR_NAMETOOLONG:
m_slave->error(KIO::ERR_INTERNAL_SERVER, i18n("Filename too long"));
break;
case NFSERR_NOTEMPTY:
m_slave->error(KIO::ERR_COULD_NOT_RMDIR, text);
break;
//does this mapping make sense ?
case NFSERR_DQUOT:
m_slave->error(KIO::ERR_INTERNAL_SERVER, i18n("Disk quota exceeded"));
break;
case NFSERR_STALE:
m_slave->error(KIO::ERR_DOES_NOT_EXIST, text);
break;
default:
m_slave->error(KIO::ERR_UNKNOWN, i18n("NFS error %1 - %2", nfsStat, text));
break;
}
return false;
}
return true;
}
void NFSProtocol::createVirtualDirEntry(UDSEntry& entry)
{
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory");
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
entry.insert(KIO::UDSEntry::UDS_USER, QString::fromLatin1("root"));
entry.insert(KIO::UDSEntry::UDS_GROUP, QString::fromLatin1("root"));
// Dummy size.
entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
}
#include "moc_kio_nfs.cpp"

View file

@ -1,208 +0,0 @@
/* This file is part of the KDE project
Copyright (C) 2000 Alexander Neundorf <neundorf@kde.org>,
2014 Mathias Tillman <master.homer@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef KIO_NFS_H
#define KIO_NFS_H
#include <kio/slavebase.h>
#include <kio/global.h>
#include <kconfiggroup.h>
#include <QtCore/QHash>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QTimer>
#include "rpc_nfs2_prot.h"
#include "rpc_nfs3_prot.h"
class NFSProtocol;
class NFSSlave : public QObject, public KIO::SlaveBase
{
Q_OBJECT
public:
NFSSlave(const QByteArray& pool, const QByteArray& app);
~NFSSlave();
void openConnection();
void closeConnection();
void setHost(const QString& host, quint16 port, const QString& user, const QString& pass);
void put(const KUrl& url, int _mode, KIO::JobFlags _flags);
void get(const KUrl& url);
void listDir(const KUrl& url);
void symlink(const QString& target, const KUrl& dest, KIO::JobFlags);
void stat(const KUrl& url);
void mkdir(const KUrl& url, int permissions);
void del(const KUrl& url, bool isfile);
void chmod(const KUrl& url, int permissions);
void rename(const KUrl& src, const KUrl& dest, KIO::JobFlags flags);
void copy(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
protected:
// Verifies the current protocol and connection state, returns true if valid.
bool verifyProtocol();
private:
NFSProtocol* m_protocol;
// We need to cache this because the @openConnection call is responsible
// for creating the protocol, and the @setHost call might happen before that.
QString m_host;
};
class NFSFileHandle
{
public:
NFSFileHandle();
NFSFileHandle(const NFSFileHandle& handle);
NFSFileHandle(const fhandle3& src);
NFSFileHandle(const fhandle& src);
NFSFileHandle(const nfs_fh3& src);
NFSFileHandle(const nfs_fh& src);
~NFSFileHandle();
// Copies the handle data to an nfs file handle
void toFH(nfs_fh3& fh) const;
void toFH(nfs_fh& fh) const;
// Copies the source link handle data to an nfs file handle
void toFHLink(nfs_fh3& fh) const;
void toFHLink(nfs_fh& fh) const;
NFSFileHandle& operator=(const NFSFileHandle& src);
NFSFileHandle& operator=(const fhandle3& src);
NFSFileHandle& operator=(const fhandle& src);
NFSFileHandle& operator=(const nfs_fh3& src);
NFSFileHandle& operator=(const nfs_fh& src);
bool isInvalid() const
{
return m_isInvalid;
}
void setInvalid()
{
m_isInvalid = true;
}
bool isLink() const
{
return m_isLink;
}
bool isBadLink() const
{
return (m_isLink && m_linkSize == 0);
}
void setLinkSource(const nfs_fh3& src);
void setLinkSource(const nfs_fh& src);
void setBadLink()
{
m_isLink = true;
m_linkSize = 0;
}
private:
void init();
char* m_handle;
unsigned int m_size;
// Set to the link source's handle.
char* m_linkHandle;
unsigned int m_linkSize;
bool m_isInvalid;
bool m_isLink;
};
typedef QMap<QString, NFSFileHandle> NFSFileHandleMap;
class NFSProtocol
{
public:
NFSProtocol(NFSSlave* slave);
virtual ~NFSProtocol() {}
virtual bool isCompatible(bool &connectionError) = 0;
virtual bool isConnected() const = 0;
virtual void openConnection() = 0;
virtual void closeConnection() = 0;
virtual void setHost(const QString& host) = 0;
virtual void put(const KUrl& url, int _mode, KIO::JobFlags _flags) = 0;
virtual void get(const KUrl& url) = 0;
virtual void listDir(const KUrl& url) = 0;
virtual void symlink(const QString& target, const KUrl& dest, KIO::JobFlags) = 0;
virtual void stat(const KUrl& url) = 0;
virtual void mkdir(const KUrl& url, int permissions) = 0;
virtual void del(const KUrl& url, bool isfile) = 0;
virtual void chmod(const KUrl& url, int permissions) = 0;
virtual void rename(const KUrl& src, const KUrl& dest, KIO::JobFlags flags) = 0;
void copy(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
protected:
// Copy from NFS to NFS
virtual void copySame(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags) = 0;
// Copy from NFS to local
virtual void copyFrom(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags) = 0;
// Copy from local to NFS
virtual void copyTo(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags) = 0;
// Look up a file handle
virtual NFSFileHandle lookupFileHandle(const QString& path) = 0;
// Modify the exported dirs.
void addExportedDir(const QString& path);
const QStringList& getExportedDirs();
bool isExportedDir(const QString& path);
void removeExportedDir(const QString& path);
// File handle cache functions.
void addFileHandle(const QString& path, NFSFileHandle fh);
NFSFileHandle getFileHandle(const QString& path);
void removeFileHandle(const QString& path);
// Make sure that the path is actually a part of an nfs share.
bool isValidPath(const QString& path);
bool isValidLink(const QString& parentDir, const QString& linkDest);
int openConnection(const QString& host, int prog, int vers, CLIENT*& client, int& sock);
bool checkForError(int clientStat, int nfsStat, const QString& text);
void createVirtualDirEntry(KIO::UDSEntry& entry);
private:
NFSSlave* m_slave;
NFSFileHandleMap m_handleCache;
QStringList m_exportedDirs;
};
#endif

View file

@ -1,20 +0,0 @@
[Protocol]
exec=kio_nfs
protocol=nfs
input=none
output=filesystem
listing=Name,Type,Size,Date,AccessDate,CreationDate,Access,Owner,Group,Link
reading=true
writing=true
makedir=true
deleting=true
linking=true
moving=true
copyToFile=true
copyFromFile=true
maxInstances=20
maxInstancesPerHost=5
X-DocPath=kioslave/nfs/index.html
Icon=folder-remote
Class=:internet

File diff suppressed because it is too large Load diff

View file

@ -1,107 +0,0 @@
/* This file is part of the KDE project
Copyright (C) 2000 Alexander Neundorf <neundorf@kde.org>,
2014 Mathias Tillman <master.homer@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef KIO_NFSV2_H
#define KIO_NFSV2_H
#include "kio_nfs.h"
// This is needed on Solaris so that rpc.h defines clnttcp_create etc.
#ifndef PORTMAP
#define PORTMAP
#endif
#include <rpc/rpc.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
class NFSProtocolV2 : public NFSProtocol
{
public:
NFSProtocolV2(NFSSlave* slave);
~NFSProtocolV2();
bool isCompatible(bool& connectionError);
bool isConnected() const;
void openConnection();
void closeConnection();
void setHost(const QString& host);
void put(const KUrl& url, int _mode, KIO::JobFlags _flags);
void get(const KUrl& url);
void listDir(const KUrl& url);
void symlink(const QString& target, const KUrl& dest, KIO::JobFlags);
void stat(const KUrl& url);
void mkdir(const KUrl& url, int permissions);
void del(const KUrl& url, bool isfile);
void chmod(const KUrl& url, int permissions);
void rename(const KUrl& src, const KUrl& dest, KIO::JobFlags flags);
protected:
void copySame(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
void copyFrom(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
void copyTo(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
NFSFileHandle lookupFileHandle(const QString& path);
private:
bool create(const QString& path, int mode, int& rpcStatus, diropres& result);
bool getAttr(const QString& path, int& rpcStatus, attrstat& result);
bool lookupHandle(const QString& path, int& rpcStatus, diropres& result);
bool readLink(const QString& path, int& rpcStatus, readlinkres& result, char* dataBuffer);
// Calls @remove, but with dummy rpcStatus and result arguments
bool remove(const QString& path);
bool remove(const QString& path, int& rpcStatus, nfsstat& result);
// Calls @rename, but with dummy rpcStatus and result arguments
bool rename(const QString& src, const QString& dest);
bool rename(const QString& src, const QString& dest, int& rpcStatus, nfsstat& result);
bool setAttr(const QString& path, const sattr& attributes, int& rpcStatus, nfsstat& result);
bool symLink(const QString& target, const QString& dest, int& rpcStatus, nfsstat& result);
// UDS helper functions
void completeUDSEntry(KIO::UDSEntry& entry, const fattr& attributes);
void completeBadLinkUDSEntry(KIO::UDSEntry& entry, const fattr& attributes);
NFSSlave* m_slave;
QString m_currentHost;
CLIENT* m_mountClient;
int m_mountSock;
CLIENT* m_nfsClient;
int m_nfsSock;
timeval clnt_timeout;
QHash<long, QString> m_usercache;
QHash<long, QString> m_groupcache;
};
#endif

File diff suppressed because it is too large Load diff

View file

@ -1,118 +0,0 @@
/* This file is part of the KDE project
Copyright (C) 2000 Alexander Neundorf <neundorf@kde.org>,
2014 Mathias Tillman <master.homer@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef KIO_NFSV3_H
#define KIO_NFSV3_H
#include "kio_nfs.h"
// This is needed on Solaris so that rpc.h defines clnttcp_create etc.
#ifndef PORTMAP
#define PORTMAP
#endif
#include <rpc/rpc.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
class NFSProtocolV3 : public NFSProtocol
{
public:
NFSProtocolV3(NFSSlave* slave);
~NFSProtocolV3();
bool isCompatible(bool& connectionError);
bool isConnected() const;
void openConnection();
void closeConnection();
void setHost(const QString& host);
void put(const KUrl& url, int _mode, KIO::JobFlags _flags);
void get(const KUrl& url);
void listDir(const KUrl& url);
void symlink(const QString& target, const KUrl& dest, KIO::JobFlags);
void stat(const KUrl& url);
void mkdir(const KUrl& url, int permissions);
void del(const KUrl& url, bool isfile);
void chmod(const KUrl& url, int permissions);
void rename(const KUrl& src, const KUrl& dest, KIO::JobFlags flags);
protected:
void copySame(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
void copyFrom(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
void copyTo(const KUrl& src, const KUrl& dest, int mode, KIO::JobFlags flags);
// For servers that don't support the READDIRPLUS command.
void listDirCompat(const KUrl& url);
// Look up a file handle.
NFSFileHandle lookupFileHandle(const QString& path);
private:
bool create(const QString& path, int mode, int& rpcStatus, CREATE3res& result);
bool getAttr(const QString& path, int& rpcStatus, GETATTR3res& result);
bool lookupHandle(const QString& path, int& rpcStatus, LOOKUP3res& result);
bool readLink(const QString& path, int& rpcStatus, READLINK3res& result, char* dataBuffer);
// Calls @remove, but with dummy rpcStatus and result arguments
bool remove(const QString& path);
bool remove(const QString& path, int& rpcStatus, REMOVE3res& result);
// Calls @rename, but with dummy rpcStatus and result arguments
bool rename(const QString& src, const QString& dest);
bool rename(const QString& src, const QString& dest, int& rpcStatus, RENAME3res& result);
bool setAttr(const QString& path, const sattr3& attributes, int& rpcStatus, SETATTR3res& result);
bool symLink(const QString& target, const QString& dest, int& rpcStatus, SYMLINK3res& result);
// Initialises the optimal read, write and read dir buffer sizes
void initPreferredSizes(const NFSFileHandle& fh);
// UDS helper functions
void completeUDSEntry(KIO::UDSEntry& entry, const fattr3& attributes);
void completeBadLinkUDSEntry(KIO::UDSEntry& entry, const fattr3& attributes);
NFSSlave* m_slave;
QString m_currentHost;
CLIENT* m_mountClient;
int m_mountSock;
CLIENT* m_nfsClient;
int m_nfsSock;
timeval clnt_timeout;
QHash<long, QString> m_usercache;
QHash<long, QString> m_groupcache;
// The optimal read and write buffer sizes and read dir size, cached values
uint32 m_readBufferSize;
uint32 m_writeBufferSize;
uint32 m_readDirSize;
};
#endif

View file

@ -1,665 +0,0 @@
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#ifndef _RPC_NFS2_PROT_H_RPCGEN
#define _RPC_NFS2_PROT_H_RPCGEN
// This is needed on Solaris so that rpc.h defines clnttcp_create etc.
#ifndef PORTMAP
#define PORTMAP
#endif
#include <rpc/rpc.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
* program developed by the user or with the express written consent of
* Sun Microsystems, Inc.
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
*
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
*
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
*
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
*
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
/*
* Copyright (c) 1987, 1990 by Sun Microsystems, Inc.
*/
/* from @(#)nfs_prot.x 1.3 91/03/11 TIRPC 1.0 */
#ifndef RPCSVC_NFS_PROT_H
#define RPCSVC_NFS_PROT_H
#define NFS_PORT 2049
#define NFS_MAXDATA 8192
#define NFS_MAXPATHLEN 1024
#define NFS_MAXNAMLEN 255
#define NFS_FHSIZE 32
#define NFS_COOKIESIZE 4
#define NFS_FIFO_DEV -1
#define NFSMODE_FMT 0170000
#define NFSMODE_DIR 0040000
#define NFSMODE_CHR 0020000
#define NFSMODE_BLK 0060000
#define NFSMODE_REG 0100000
#define NFSMODE_LNK 0120000
#define NFSMODE_SOCK 0140000
#define NFSMODE_FIFO 0010000
enum nfsstat {
NFS_OK = 0,
NFSERR_PERM = 1,
NFSERR_NOENT = 2,
NFSERR_IO = 5,
NFSERR_NXIO = 6,
NFSERR_ACCES = 13,
NFSERR_EXIST = 17,
NFSERR_NODEV = 19,
NFSERR_NOTDIR = 20,
NFSERR_ISDIR = 21,
NFSERR_INVAL = 22,
NFSERR_FBIG = 27,
NFSERR_NOSPC = 28,
NFSERR_ROFS = 30,
NFSERR_NAMETOOLONG = 63,
NFSERR_NOTEMPTY = 66,
NFSERR_DQUOT = 69,
NFSERR_STALE = 70,
NFSERR_WFLUSH = 99,
};
typedef enum nfsstat nfsstat;
enum ftype {
NFNON = 0,
NFREG = 1,
NFDIR = 2,
NFBLK = 3,
NFCHR = 4,
NFLNK = 5,
NFSOCK = 6,
NFBAD = 7,
NFFIFO = 8,
};
typedef enum ftype ftype;
struct nfs_fh {
char data[NFS_FHSIZE];
};
typedef struct nfs_fh nfs_fh;
struct nfstime {
u_int seconds;
u_int useconds;
};
typedef struct nfstime nfstime;
struct fattr {
ftype type;
u_int mode;
u_int nlink;
u_int uid;
u_int gid;
u_int size;
u_int blocksize;
u_int rdev;
u_int blocks;
u_int fsid;
u_int fileid;
nfstime atime;
nfstime mtime;
nfstime ctime;
};
typedef struct fattr fattr;
struct sattr {
u_int mode;
u_int uid;
u_int gid;
u_int size;
nfstime atime;
nfstime mtime;
};
typedef struct sattr sattr;
typedef char *filename;
typedef char *nfspath;
struct attrstat {
nfsstat status;
union {
fattr attributes;
} attrstat_u;
};
typedef struct attrstat attrstat;
struct sattrargs {
nfs_fh file;
sattr attributes;
};
typedef struct sattrargs sattrargs;
struct diropargs {
nfs_fh dir;
filename name;
};
typedef struct diropargs diropargs;
struct diropokres {
nfs_fh file;
fattr attributes;
};
typedef struct diropokres diropokres;
struct diropres {
nfsstat status;
union {
diropokres diropres;
} diropres_u;
};
typedef struct diropres diropres;
struct readlinkres {
nfsstat status;
union {
nfspath data;
} readlinkres_u;
};
typedef struct readlinkres readlinkres;
struct readargs {
nfs_fh file;
u_int offset;
u_int count;
u_int totalcount;
};
typedef struct readargs readargs;
struct readokres {
fattr attributes;
struct {
u_int data_len;
char *data_val;
} data;
};
typedef struct readokres readokres;
struct readres {
nfsstat status;
union {
readokres reply;
} readres_u;
};
typedef struct readres readres;
struct writeargs {
nfs_fh file;
u_int beginoffset;
u_int offset;
u_int totalcount;
struct {
u_int data_len;
char *data_val;
} data;
};
typedef struct writeargs writeargs;
struct createargs {
diropargs where;
sattr attributes;
};
typedef struct createargs createargs;
struct renameargs {
diropargs from;
diropargs to;
};
typedef struct renameargs renameargs;
struct linkargs {
nfs_fh from;
diropargs to;
};
typedef struct linkargs linkargs;
struct symlinkargs {
diropargs from;
nfspath to;
sattr attributes;
};
typedef struct symlinkargs symlinkargs;
typedef char nfscookie[NFS_COOKIESIZE];
struct readdirargs {
nfs_fh dir;
nfscookie cookie;
u_int count;
};
typedef struct readdirargs readdirargs;
struct entry {
u_int fileid;
filename name;
nfscookie cookie;
struct entry *nextentry;
};
typedef struct entry entry;
struct dirlist {
entry *entries;
bool_t eof;
};
typedef struct dirlist dirlist;
struct readdirres {
nfsstat status;
union {
dirlist reply;
} readdirres_u;
};
typedef struct readdirres readdirres;
struct statfsokres {
u_int tsize;
u_int bsize;
u_int blocks;
u_int bfree;
u_int bavail;
};
typedef struct statfsokres statfsokres;
struct statfsres {
nfsstat status;
union {
statfsokres reply;
} statfsres_u;
};
typedef struct statfsres statfsres;
#define MNTPATHLEN 1024
#define MNTNAMLEN 255
#define FHSIZE 32
typedef char fhandle[FHSIZE];
struct fhstatus {
u_int fhs_status;
union {
fhandle fhs_fhandle;
} fhstatus_u;
};
typedef struct fhstatus fhstatus;
typedef char *dirpath;
typedef char *name;
typedef struct mountbody *mountlist;
struct mountbody {
name ml_hostname;
dirpath ml_directory;
mountlist ml_next;
};
typedef struct mountbody mountbody;
typedef struct groupnode *groups;
struct groupnode {
name gr_name;
groups gr_next;
};
typedef struct groupnode groupnode;
typedef struct exportnode *exports;
struct exportnode {
dirpath ex_dir;
groups ex_groups;
exports ex_next;
};
typedef struct exportnode exportnode;
struct ppathcnf {
int pc_link_max;
short pc_max_canon;
short pc_max_input;
short pc_name_max;
short pc_path_max;
short pc_pipe_buf;
u_char pc_vdisable;
char pc_xxx;
short pc_mask[2];
};
typedef struct ppathcnf ppathcnf;
#endif /*!RPCSVC_NFS_PROT_H*/
#define NFS_PROGRAM 100003
#define NFS_VERSION 2
#if defined(__STDC__) || defined(__cplusplus)
#define NFSPROC_NULL 0
extern void * nfsproc_null_2(CLIENT *);
extern void * nfsproc_null_2_svc(struct svc_req *);
#define NFSPROC_GETATTR 1
extern attrstat * nfsproc_getattr_2(nfs_fh , CLIENT *);
extern attrstat * nfsproc_getattr_2_svc(nfs_fh , struct svc_req *);
#define NFSPROC_SETATTR 2
extern attrstat * nfsproc_setattr_2(sattrargs , CLIENT *);
extern attrstat * nfsproc_setattr_2_svc(sattrargs , struct svc_req *);
#define NFSPROC_ROOT 3
extern void * nfsproc_root_2(CLIENT *);
extern void * nfsproc_root_2_svc(struct svc_req *);
#define NFSPROC_LOOKUP 4
extern diropres * nfsproc_lookup_2(diropargs , CLIENT *);
extern diropres * nfsproc_lookup_2_svc(diropargs , struct svc_req *);
#define NFSPROC_READLINK 5
extern readlinkres * nfsproc_readlink_2(nfs_fh , CLIENT *);
extern readlinkres * nfsproc_readlink_2_svc(nfs_fh , struct svc_req *);
#define NFSPROC_READ 6
extern readres * nfsproc_read_2(readargs , CLIENT *);
extern readres * nfsproc_read_2_svc(readargs , struct svc_req *);
#define NFSPROC_WRITECACHE 7
extern void * nfsproc_writecache_2(CLIENT *);
extern void * nfsproc_writecache_2_svc(struct svc_req *);
#define NFSPROC_WRITE 8
extern attrstat * nfsproc_write_2(writeargs , CLIENT *);
extern attrstat * nfsproc_write_2_svc(writeargs , struct svc_req *);
#define NFSPROC_CREATE 9
extern diropres * nfsproc_create_2(createargs , CLIENT *);
extern diropres * nfsproc_create_2_svc(createargs , struct svc_req *);
#define NFSPROC_REMOVE 10
extern nfsstat * nfsproc_remove_2(diropargs , CLIENT *);
extern nfsstat * nfsproc_remove_2_svc(diropargs , struct svc_req *);
#define NFSPROC_RENAME 11
extern nfsstat * nfsproc_rename_2(renameargs , CLIENT *);
extern nfsstat * nfsproc_rename_2_svc(renameargs , struct svc_req *);
#define NFSPROC_LINK 12
extern nfsstat * nfsproc_link_2(linkargs , CLIENT *);
extern nfsstat * nfsproc_link_2_svc(linkargs , struct svc_req *);
#define NFSPROC_SYMLINK 13
extern nfsstat * nfsproc_symlink_2(symlinkargs , CLIENT *);
extern nfsstat * nfsproc_symlink_2_svc(symlinkargs , struct svc_req *);
#define NFSPROC_MKDIR 14
extern diropres * nfsproc_mkdir_2(createargs , CLIENT *);
extern diropres * nfsproc_mkdir_2_svc(createargs , struct svc_req *);
#define NFSPROC_RMDIR 15
extern nfsstat * nfsproc_rmdir_2(diropargs , CLIENT *);
extern nfsstat * nfsproc_rmdir_2_svc(diropargs , struct svc_req *);
#define NFSPROC_READDIR 16
extern readdirres * nfsproc_readdir_2(readdirargs , CLIENT *);
extern readdirres * nfsproc_readdir_2_svc(readdirargs , struct svc_req *);
#define NFSPROC_STATFS 17
extern statfsres * nfsproc_statfs_2(nfs_fh , CLIENT *);
extern statfsres * nfsproc_statfs_2_svc(nfs_fh , struct svc_req *);
extern int nfs_program_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define NFSPROC_NULL 0
extern void * nfsproc_null_2();
extern void * nfsproc_null_2_svc();
#define NFSPROC_GETATTR 1
extern attrstat * nfsproc_getattr_2();
extern attrstat * nfsproc_getattr_2_svc();
#define NFSPROC_SETATTR 2
extern attrstat * nfsproc_setattr_2();
extern attrstat * nfsproc_setattr_2_svc();
#define NFSPROC_ROOT 3
extern void * nfsproc_root_2();
extern void * nfsproc_root_2_svc();
#define NFSPROC_LOOKUP 4
extern diropres * nfsproc_lookup_2();
extern diropres * nfsproc_lookup_2_svc();
#define NFSPROC_READLINK 5
extern readlinkres * nfsproc_readlink_2();
extern readlinkres * nfsproc_readlink_2_svc();
#define NFSPROC_READ 6
extern readres * nfsproc_read_2();
extern readres * nfsproc_read_2_svc();
#define NFSPROC_WRITECACHE 7
extern void * nfsproc_writecache_2();
extern void * nfsproc_writecache_2_svc();
#define NFSPROC_WRITE 8
extern attrstat * nfsproc_write_2();
extern attrstat * nfsproc_write_2_svc();
#define NFSPROC_CREATE 9
extern diropres * nfsproc_create_2();
extern diropres * nfsproc_create_2_svc();
#define NFSPROC_REMOVE 10
extern nfsstat * nfsproc_remove_2();
extern nfsstat * nfsproc_remove_2_svc();
#define NFSPROC_RENAME 11
extern nfsstat * nfsproc_rename_2();
extern nfsstat * nfsproc_rename_2_svc();
#define NFSPROC_LINK 12
extern nfsstat * nfsproc_link_2();
extern nfsstat * nfsproc_link_2_svc();
#define NFSPROC_SYMLINK 13
extern nfsstat * nfsproc_symlink_2();
extern nfsstat * nfsproc_symlink_2_svc();
#define NFSPROC_MKDIR 14
extern diropres * nfsproc_mkdir_2();
extern diropres * nfsproc_mkdir_2_svc();
#define NFSPROC_RMDIR 15
extern nfsstat * nfsproc_rmdir_2();
extern nfsstat * nfsproc_rmdir_2_svc();
#define NFSPROC_READDIR 16
extern readdirres * nfsproc_readdir_2();
extern readdirres * nfsproc_readdir_2_svc();
#define NFSPROC_STATFS 17
extern statfsres * nfsproc_statfs_2();
extern statfsres * nfsproc_statfs_2_svc();
extern int nfs_program_2_freeresult ();
#endif /* K&R C */
#define MOUNTPROG 100005
#define MOUNTVERS 1
#if defined(__STDC__) || defined(__cplusplus)
#define MOUNTPROC_NULL 0
extern void * mountproc_null_1(CLIENT *);
extern void * mountproc_null_1_svc(struct svc_req *);
#define MOUNTPROC_MNT 1
extern fhstatus * mountproc_mnt_1(dirpath , CLIENT *);
extern fhstatus * mountproc_mnt_1_svc(dirpath , struct svc_req *);
#define MOUNTPROC_DUMP 2
extern mountlist * mountproc_dump_1(CLIENT *);
extern mountlist * mountproc_dump_1_svc(struct svc_req *);
#define MOUNTPROC_UMNT 3
extern void * mountproc_umnt_1(dirpath , CLIENT *);
extern void * mountproc_umnt_1_svc(dirpath , struct svc_req *);
#define MOUNTPROC_UMNTALL 4
extern void * mountproc_umntall_1(CLIENT *);
extern void * mountproc_umntall_1_svc(struct svc_req *);
#define MOUNTPROC_EXPORT 5
extern exports * mountproc_export_1(CLIENT *);
extern exports * mountproc_export_1_svc(struct svc_req *);
#define MOUNTPROC_EXPORTALL 6
extern exports * mountproc_exportall_1(CLIENT *);
extern exports * mountproc_exportall_1_svc(struct svc_req *);
extern int mountprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define MOUNTPROC_NULL 0
extern void * mountproc_null_1();
extern void * mountproc_null_1_svc();
#define MOUNTPROC_MNT 1
extern fhstatus * mountproc_mnt_1();
extern fhstatus * mountproc_mnt_1_svc();
#define MOUNTPROC_DUMP 2
extern mountlist * mountproc_dump_1();
extern mountlist * mountproc_dump_1_svc();
#define MOUNTPROC_UMNT 3
extern void * mountproc_umnt_1();
extern void * mountproc_umnt_1_svc();
#define MOUNTPROC_UMNTALL 4
extern void * mountproc_umntall_1();
extern void * mountproc_umntall_1_svc();
#define MOUNTPROC_EXPORT 5
extern exports * mountproc_export_1();
extern exports * mountproc_export_1_svc();
#define MOUNTPROC_EXPORTALL 6
extern exports * mountproc_exportall_1();
extern exports * mountproc_exportall_1_svc();
extern int mountprog_1_freeresult ();
#endif /* K&R C */
#define MOUNTVERS_POSIX 2
#if defined(__STDC__) || defined(__cplusplus)
extern void * mountproc_null_2(CLIENT *);
extern void * mountproc_null_2_svc(struct svc_req *);
extern fhstatus * mountproc_mnt_2(dirpath , CLIENT *);
extern fhstatus * mountproc_mnt_2_svc(dirpath , struct svc_req *);
extern mountlist * mountproc_dump_2(CLIENT *);
extern mountlist * mountproc_dump_2_svc(struct svc_req *);
extern void * mountproc_umnt_2(dirpath , CLIENT *);
extern void * mountproc_umnt_2_svc(dirpath , struct svc_req *);
extern void * mountproc_umntall_2(CLIENT *);
extern void * mountproc_umntall_2_svc(struct svc_req *);
extern exports * mountproc_export_2(CLIENT *);
extern exports * mountproc_export_2_svc(struct svc_req *);
extern exports * mountproc_exportall_2(CLIENT *);
extern exports * mountproc_exportall_2_svc(struct svc_req *);
#define MOUNTPROC_PATHCONF 7
extern ppathcnf * mountproc_pathconf_2(dirpath , CLIENT *);
extern ppathcnf * mountproc_pathconf_2_svc(dirpath , struct svc_req *);
extern int mountprog_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
extern void * mountproc_null_2();
extern void * mountproc_null_2_svc();
extern fhstatus * mountproc_mnt_2();
extern fhstatus * mountproc_mnt_2_svc();
extern mountlist * mountproc_dump_2();
extern mountlist * mountproc_dump_2_svc();
extern void * mountproc_umnt_2();
extern void * mountproc_umnt_2_svc();
extern void * mountproc_umntall_2();
extern void * mountproc_umntall_2_svc();
extern exports * mountproc_export_2();
extern exports * mountproc_export_2_svc();
extern exports * mountproc_exportall_2();
extern exports * mountproc_exportall_2_svc();
#define MOUNTPROC_PATHCONF 7
extern ppathcnf * mountproc_pathconf_2();
extern ppathcnf * mountproc_pathconf_2_svc();
extern int mountprog_2_freeresult ();
#endif /* K&R C */
/* the xdr functions */
#if defined(__STDC__) || defined(__cplusplus)
extern bool_t xdr_nfsstat (XDR *, nfsstat*);
extern bool_t xdr_ftype (XDR *, ftype*);
extern bool_t xdr_nfs_fh (XDR *, nfs_fh*);
extern bool_t xdr_nfstime (XDR *, nfstime*);
extern bool_t xdr_fattr (XDR *, fattr*);
extern bool_t xdr_sattr (XDR *, sattr*);
extern bool_t xdr_filename (XDR *, filename*);
extern bool_t xdr_nfspath (XDR *, nfspath*);
extern bool_t xdr_attrstat (XDR *, attrstat*);
extern bool_t xdr_sattrargs (XDR *, sattrargs*);
extern bool_t xdr_diropargs (XDR *, diropargs*);
extern bool_t xdr_diropokres (XDR *, diropokres*);
extern bool_t xdr_diropres (XDR *, diropres*);
extern bool_t xdr_readlinkres (XDR *, readlinkres*);
extern bool_t xdr_readargs (XDR *, readargs*);
extern bool_t xdr_readokres (XDR *, readokres*);
extern bool_t xdr_readres (XDR *, readres*);
extern bool_t xdr_writeargs (XDR *, writeargs*);
extern bool_t xdr_createargs (XDR *, createargs*);
extern bool_t xdr_renameargs (XDR *, renameargs*);
extern bool_t xdr_linkargs (XDR *, linkargs*);
extern bool_t xdr_symlinkargs (XDR *, symlinkargs*);
extern bool_t xdr_nfscookie (XDR *, nfscookie);
extern bool_t xdr_readdirargs (XDR *, readdirargs*);
extern bool_t xdr_entry (XDR *, entry*);
extern bool_t xdr_dirlist (XDR *, dirlist*);
extern bool_t xdr_readdirres (XDR *, readdirres*);
extern bool_t xdr_statfsokres (XDR *, statfsokres*);
extern bool_t xdr_statfsres (XDR *, statfsres*);
extern bool_t xdr_fhandle (XDR *, fhandle);
extern bool_t xdr_fhstatus (XDR *, fhstatus*);
extern bool_t xdr_dirpath (XDR *, dirpath*);
extern bool_t xdr_name (XDR *, name*);
extern bool_t xdr_mountlist (XDR *, mountlist*);
extern bool_t xdr_mountbody (XDR *, mountbody*);
extern bool_t xdr_groups (XDR *, groups*);
extern bool_t xdr_groupnode (XDR *, groupnode*);
extern bool_t xdr_exports (XDR *, exports*);
extern bool_t xdr_exportnode (XDR *, exportnode*);
extern bool_t xdr_ppathcnf (XDR *, ppathcnf*);
#else /* K&R C */
extern bool_t xdr_nfsstat ();
extern bool_t xdr_ftype ();
extern bool_t xdr_nfs_fh ();
extern bool_t xdr_nfstime ();
extern bool_t xdr_fattr ();
extern bool_t xdr_sattr ();
extern bool_t xdr_filename ();
extern bool_t xdr_nfspath ();
extern bool_t xdr_attrstat ();
extern bool_t xdr_sattrargs ();
extern bool_t xdr_diropargs ();
extern bool_t xdr_diropokres ();
extern bool_t xdr_diropres ();
extern bool_t xdr_readlinkres ();
extern bool_t xdr_readargs ();
extern bool_t xdr_readokres ();
extern bool_t xdr_readres ();
extern bool_t xdr_writeargs ();
extern bool_t xdr_createargs ();
extern bool_t xdr_renameargs ();
extern bool_t xdr_linkargs ();
extern bool_t xdr_symlinkargs ();
extern bool_t xdr_nfscookie ();
extern bool_t xdr_readdirargs ();
extern bool_t xdr_entry ();
extern bool_t xdr_dirlist ();
extern bool_t xdr_readdirres ();
extern bool_t xdr_statfsokres ();
extern bool_t xdr_statfsres ();
extern bool_t xdr_fhandle ();
extern bool_t xdr_fhstatus ();
extern bool_t xdr_dirpath ();
extern bool_t xdr_name ();
extern bool_t xdr_mountlist ();
extern bool_t xdr_mountbody ();
extern bool_t xdr_groups ();
extern bool_t xdr_groupnode ();
extern bool_t xdr_exports ();
extern bool_t xdr_exportnode ();
extern bool_t xdr_ppathcnf ();
#endif /* K&R C */
#ifdef __cplusplus
}
#endif
#endif /* !_RPC_NFS2_PROT_H_RPCGEN */

View file

@ -1,574 +0,0 @@
%/*
% * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
% * unrestricted use provided that this legend is included on all tape
% * media and as a part of the software program in whole or part. Users
% * may copy or modify Sun RPC without charge, but are not authorized
% * to license or distribute it to anyone else except as part of a product or
% * program developed by the user or with the express written consent of
% * Sun Microsystems, Inc.
% *
% * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
% * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
% * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
% *
% * Sun RPC is provided with no support and without any obligation on the
% * part of Sun Microsystems, Inc. to assist in its use, correction,
% * modification or enhancement.
% *
% * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
% * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
% * OR ANY PART THEREOF.
% *
% * In no event will Sun Microsystems, Inc. be liable for any lost revenue
% * or profits or other special, indirect and consequential damages, even if
% * Sun has been advised of the possibility of such damages.
% *
% * Sun Microsystems, Inc.
% * 2550 Garcia Avenue
% * Mountain View, California 94043
% */
%/*
% * Copyright (c) 1987, 1990 by Sun Microsystems, Inc.
% */
%
%/* from @(#)nfs_prot.x 1.3 91/03/11 TIRPC 1.0 */
#ifdef RPC_HDR
%#ifndef _rpcsvc_nfs_prot_h
%#define _rpcsvc_nfs_prot_h
#endif
const NFS_PORT = 2049;
const NFS_MAXDATA = 8192;
const NFS_MAXPATHLEN = 1024;
const NFS_MAXNAMLEN = 255;
const NFS_FHSIZE = 32;
const NFS_COOKIESIZE = 4;
const NFS_FIFO_DEV = -1; /* size kludge for named pipes */
/*
* File types
*/
const NFSMODE_FMT = 0170000; /* type of file */
const NFSMODE_DIR = 0040000; /* directory */
const NFSMODE_CHR = 0020000; /* character special */
const NFSMODE_BLK = 0060000; /* block special */
const NFSMODE_REG = 0100000; /* regular */
const NFSMODE_LNK = 0120000; /* symbolic link */
const NFSMODE_SOCK = 0140000; /* socket */
const NFSMODE_FIFO = 0010000; /* fifo */
/*
* Error status
*/
enum nfsstat {
NFS_OK= 0, /* no error */
NFSERR_PERM=1, /* Not owner */
NFSERR_NOENT=2, /* No such file or directory */
NFSERR_IO=5, /* I/O error */
NFSERR_NXIO=6, /* No such device or address */
NFSERR_ACCES=13, /* Permission denied */
NFSERR_EXIST=17, /* File exists */
NFSERR_NODEV=19, /* No such device */
NFSERR_NOTDIR=20, /* Not a directory*/
NFSERR_ISDIR=21, /* Is a directory */
NFSERR_INVAL=22, /* invalid argument */
NFSERR_FBIG=27, /* File too large */
NFSERR_NOSPC=28, /* No space left on device */
NFSERR_ROFS=30, /* Read-only file system */
NFSERR_NAMETOOLONG=63, /* File name too long */
NFSERR_NOTEMPTY=66, /* Directory not empty */
NFSERR_DQUOT=69, /* Disc quota exceeded */
NFSERR_STALE=70, /* Stale NFS file handle */
NFSERR_WFLUSH=99 /* write cache flushed */
};
/*
* File types
*/
enum ftype {
NFNON = 0, /* non-file */
NFREG = 1, /* regular file */
NFDIR = 2, /* directory */
NFBLK = 3, /* block special */
NFCHR = 4, /* character special */
NFLNK = 5, /* symbolic link */
NFSOCK = 6, /* unix domain sockets */
NFBAD = 7, /* unused */
NFFIFO = 8 /* named pipe */
};
/*
* File access handle
*/
struct nfs_fh {
opaque data[NFS_FHSIZE];
};
/*
* Timeval
*/
struct nfstime {
unsigned seconds;
unsigned useconds;
};
/*
* File attributes
*/
struct fattr {
ftype type; /* file type */
unsigned mode; /* protection mode bits */
unsigned nlink; /* # hard links */
unsigned uid; /* owner user id */
unsigned gid; /* owner group id */
unsigned size; /* file size in bytes */
unsigned blocksize; /* prefered block size */
unsigned rdev; /* special device # */
unsigned blocks; /* Kb of disk used by file */
unsigned fsid; /* device # */
unsigned fileid; /* inode # */
nfstime atime; /* time of last access */
nfstime mtime; /* time of last modification */
nfstime ctime; /* time of last change */
};
/*
* File attributes which can be set
*/
struct sattr {
unsigned mode; /* protection mode bits */
unsigned uid; /* owner user id */
unsigned gid; /* owner group id */
unsigned size; /* file size in bytes */
nfstime atime; /* time of last access */
nfstime mtime; /* time of last modification */
};
typedef string filename<NFS_MAXNAMLEN>;
typedef string nfspath<NFS_MAXPATHLEN>;
/*
* Reply status with file attributes
*/
union attrstat switch (nfsstat status) {
case NFS_OK:
fattr attributes;
default:
void;
};
struct sattrargs {
nfs_fh file;
sattr attributes;
};
/*
* Arguments for directory operations
*/
struct diropargs {
nfs_fh dir; /* directory file handle */
filename name; /* name (up to NFS_MAXNAMLEN bytes) */
};
struct diropokres {
nfs_fh file;
fattr attributes;
};
/*
* Results from directory operation
*/
union diropres switch (nfsstat status) {
case NFS_OK:
diropokres diropres;
default:
void;
};
union readlinkres switch (nfsstat status) {
case NFS_OK:
nfspath data;
default:
void;
};
/*
* Arguments to remote read
*/
struct readargs {
nfs_fh file; /* handle for file */
unsigned offset; /* byte offset in file */
unsigned count; /* immediate read count */
unsigned totalcount; /* total read count (from this offset)*/
};
/*
* Status OK portion of remote read reply
*/
struct readokres {
fattr attributes; /* attributes, need for pagin*/
opaque data<NFS_MAXDATA>;
};
union readres switch (nfsstat status) {
case NFS_OK:
readokres reply;
default:
void;
};
/*
* Arguments to remote write
*/
struct writeargs {
nfs_fh file; /* handle for file */
unsigned beginoffset; /* beginning byte offset in file */
unsigned offset; /* current byte offset in file */
unsigned totalcount; /* total write count (to this offset)*/
opaque data<NFS_MAXDATA>;
};
struct createargs {
diropargs where;
sattr attributes;
};
struct renameargs {
diropargs from;
diropargs to;
};
struct linkargs {
nfs_fh from;
diropargs to;
};
struct symlinkargs {
diropargs from;
nfspath to;
sattr attributes;
};
typedef opaque nfscookie[NFS_COOKIESIZE];
/*
* Arguments to readdir
*/
struct readdirargs {
nfs_fh dir; /* directory handle */
nfscookie cookie;
unsigned count; /* number of directory bytes to read */
};
struct entry {
unsigned fileid;
filename name;
nfscookie cookie;
entry *nextentry;
};
struct dirlist {
entry *entries;
bool eof;
};
union readdirres switch (nfsstat status) {
case NFS_OK:
dirlist reply;
default:
void;
};
struct statfsokres {
unsigned tsize; /* preferred transfer size in bytes */
unsigned bsize; /* fundamental file system block size */
unsigned blocks; /* total blocks in file system */
unsigned bfree; /* free blocks in fs */
unsigned bavail; /* free blocks avail to non-superuser */
};
union statfsres switch (nfsstat status) {
case NFS_OK:
statfsokres reply;
default:
void;
};
/*
* Remote file service routines
*/
program NFS_PROGRAM {
version NFS_VERSION {
void
NFSPROC_NULL(void) = 0;
attrstat
NFSPROC_GETATTR(nfs_fh) = 1;
attrstat
NFSPROC_SETATTR(sattrargs) = 2;
void
NFSPROC_ROOT(void) = 3;
diropres
NFSPROC_LOOKUP(diropargs) = 4;
readlinkres
NFSPROC_READLINK(nfs_fh) = 5;
readres
NFSPROC_READ(readargs) = 6;
void
NFSPROC_WRITECACHE(void) = 7;
attrstat
NFSPROC_WRITE(writeargs) = 8;
diropres
NFSPROC_CREATE(createargs) = 9;
nfsstat
NFSPROC_REMOVE(diropargs) = 10;
nfsstat
NFSPROC_RENAME(renameargs) = 11;
nfsstat
NFSPROC_LINK(linkargs) = 12;
nfsstat
NFSPROC_SYMLINK(symlinkargs) = 13;
diropres
NFSPROC_MKDIR(createargs) = 14;
nfsstat
NFSPROC_RMDIR(diropargs) = 15;
readdirres
NFSPROC_READDIR(readdirargs) = 16;
statfsres
NFSPROC_STATFS(nfs_fh) = 17;
} = 2;
} = 100003;
/* Mount v2 */
const MNTPATHLEN = 1024; /* maximum bytes in a pathname argument */
const MNTNAMLEN = 255; /* maximum bytes in a name argument */
const FHSIZE = 32; /* size in bytes of a file handle */
/*
* The fhandle is the file handle that the server passes to the client.
* All file operations are done using the file handles to refer to a file
* or a directory. The file handle can contain whatever information the
* server needs to distinguish an individual file.
*/
typedef opaque fhandle[FHSIZE];
/*
* If a status of zero is returned, the call completed successfully, and
* a file handle for the directory follows. A non-zero status indicates
* some sort of error. The status corresponds with UNIX error numbers.
*/
union fhstatus switch (unsigned fhs_status) {
case 0:
fhandle fhs_fhandle;
default:
void;
};
/*
* The type dirpath is the pathname of a directory
*/
typedef string dirpath<MNTPATHLEN>;
/*
* The type name is used for arbitrary names (hostnames, groupnames)
*/
typedef string name<MNTNAMLEN>;
/*
* A list of who has what mounted
*/
typedef struct mountbody *mountlist;
struct mountbody {
name ml_hostname;
dirpath ml_directory;
mountlist ml_next;
};
/*
* A list of netgroups
*/
typedef struct groupnode *groups;
struct groupnode {
name gr_name;
groups gr_next;
};
/*
* A list of what is exported and to whom
*/
typedef struct exportnode *exports;
struct exportnode {
dirpath ex_dir;
groups ex_groups;
exports ex_next;
};
/*
* POSIX pathconf information
*/
struct ppathcnf {
int pc_link_max; /* max links allowed */
short pc_max_canon; /* max line len for a tty */
short pc_max_input; /* input a tty can eat all at once */
short pc_name_max; /* max file name length (dir entry) */
short pc_path_max; /* max path name length (/x/y/x/.. ) */
short pc_pipe_buf; /* size of a pipe (bytes) */
u_char pc_vdisable; /* safe char to turn off c_cc[i] */
char pc_xxx; /* alignment padding; cc_t == char */
short pc_mask[2]; /* validity and boolean bits */
};
program MOUNTPROG {
/*
* Version one of the mount protocol communicates with version two
* of the NFS protocol. The only connecting point is the fhandle
* structure, which is the same for both protocols.
*/
version MOUNTVERS {
/*
* Does no work. It is made available in all RPC services
* to allow server reponse testing and timing
*/
void
MOUNTPROC_NULL(void) = 0;
/*
* If fhs_status is 0, then fhs_fhandle contains the
* file handle for the directory. This file handle may
* be used in the NFS protocol. This procedure also adds
* a new entry to the mount list for this client mounting
* the directory.
* Unix authentication required.
*/
fhstatus
MOUNTPROC_MNT(dirpath) = 1;
/*
* Returns the list of remotely mounted filesystems. The
* mountlist contains one entry for each hostname and
* directory pair.
*/
mountlist
MOUNTPROC_DUMP(void) = 2;
/*
* Removes the mount list entry for the directory
* Unix authentication required.
*/
void
MOUNTPROC_UMNT(dirpath) = 3;
/*
* Removes all of the mount list entries for this client
* Unix authentication required.
*/
void
MOUNTPROC_UMNTALL(void) = 4;
/*
* Returns a list of all the exported filesystems, and which
* machines are allowed to import it.
*/
exports
MOUNTPROC_EXPORT(void) = 5;
/*
* Identical to MOUNTPROC_EXPORT above
*/
exports
MOUNTPROC_EXPORTALL(void) = 6;
} = 1;
/*
* Version two of the mount protocol communicates with version two
* of the NFS protocol.
* The only difference from version one is the addition of a POSIX
* pathconf call.
*/
version MOUNTVERS_POSIX {
/*
* Does no work. It is made available in all RPC services
* to allow server reponse testing and timing
*/
void
MOUNTPROC_NULL(void) = 0;
/*
* If fhs_status is 0, then fhs_fhandle contains the
* file handle for the directory. This file handle may
* be used in the NFS protocol. This procedure also adds
* a new entry to the mount list for this client mounting
* the directory.
* Unix authentication required.
*/
fhstatus
MOUNTPROC_MNT(dirpath) = 1;
/*
* Returns the list of remotely mounted filesystems. The
* mountlist contains one entry for each hostname and
* directory pair.
*/
mountlist
MOUNTPROC_DUMP(void) = 2;
/*
* Removes the mount list entry for the directory
* Unix authentication required.
*/
void
MOUNTPROC_UMNT(dirpath) = 3;
/*
* Removes all of the mount list entries for this client
* Unix authentication required.
*/
void
MOUNTPROC_UMNTALL(void) = 4;
/*
* Returns a list of all the exported filesystems, and which
* machines are allowed to import it.
*/
exports
MOUNTPROC_EXPORT(void) = 5;
/*
* Identical to MOUNTPROC_EXPORT above
*/
exports
MOUNTPROC_EXPORTALL(void) = 6;
/*
* POSIX pathconf info (Sun hack)
*/
ppathcnf
MOUNTPROC_PATHCONF(dirpath) = 7;
} = 2;
} = 100005;
#ifdef RPC_HDR
%#endif /*!_rpcsvc_nfs_prot_h*/
#endif

View file

@ -1,865 +0,0 @@
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include "rpc_nfs2_prot.h"
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
* program developed by the user or with the express written consent of
* Sun Microsystems, Inc.
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
*
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
*
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
*
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
*
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
/*
* Copyright (c) 1987, 1990 by Sun Microsystems, Inc.
*/
/* from @(#)nfs_prot.x 1.3 91/03/11 TIRPC 1.0 */
bool_t
xdr_nfsstat (XDR *xdrs, nfsstat *objp)
{
if (!xdr_enum (xdrs, (enum_t *) objp))
return FALSE;
return TRUE;
}
bool_t
xdr_ftype (XDR *xdrs, ftype *objp)
{
if (!xdr_enum (xdrs, (enum_t *) objp))
return FALSE;
return TRUE;
}
bool_t
xdr_nfs_fh (XDR *xdrs, nfs_fh *objp)
{
if (!xdr_opaque (xdrs, objp->data, NFS_FHSIZE))
return FALSE;
return TRUE;
}
bool_t
xdr_nfstime (XDR *xdrs, nfstime *objp)
{
if (!xdr_u_int (xdrs, &objp->seconds))
return FALSE;
if (!xdr_u_int (xdrs, &objp->useconds))
return FALSE;
return TRUE;
}
bool_t
xdr_fattr (XDR *xdrs, fattr *objp)
{
register int32_t *buf;
if (xdrs->x_op == XDR_ENCODE) {
if (!xdr_ftype (xdrs, &objp->type))
return FALSE;
buf = XDR_INLINE (xdrs, 10 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->mode))
return FALSE;
if (!xdr_u_int (xdrs, &objp->nlink))
return FALSE;
if (!xdr_u_int (xdrs, &objp->uid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->gid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->size))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocksize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->rdev))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocks))
return FALSE;
if (!xdr_u_int (xdrs, &objp->fsid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->fileid))
return FALSE;
} else {
IXDR_PUT_U_LONG(buf, objp->mode);
IXDR_PUT_U_LONG(buf, objp->nlink);
IXDR_PUT_U_LONG(buf, objp->uid);
IXDR_PUT_U_LONG(buf, objp->gid);
IXDR_PUT_U_LONG(buf, objp->size);
IXDR_PUT_U_LONG(buf, objp->blocksize);
IXDR_PUT_U_LONG(buf, objp->rdev);
IXDR_PUT_U_LONG(buf, objp->blocks);
IXDR_PUT_U_LONG(buf, objp->fsid);
IXDR_PUT_U_LONG(buf, objp->fileid);
}
if (!xdr_nfstime (xdrs, &objp->atime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->mtime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->ctime))
return FALSE;
return TRUE;
} else if (xdrs->x_op == XDR_DECODE) {
if (!xdr_ftype (xdrs, &objp->type))
return FALSE;
buf = XDR_INLINE (xdrs, 10 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->mode))
return FALSE;
if (!xdr_u_int (xdrs, &objp->nlink))
return FALSE;
if (!xdr_u_int (xdrs, &objp->uid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->gid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->size))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocksize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->rdev))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocks))
return FALSE;
if (!xdr_u_int (xdrs, &objp->fsid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->fileid))
return FALSE;
} else {
objp->mode = IXDR_GET_U_LONG(buf);
objp->nlink = IXDR_GET_U_LONG(buf);
objp->uid = IXDR_GET_U_LONG(buf);
objp->gid = IXDR_GET_U_LONG(buf);
objp->size = IXDR_GET_U_LONG(buf);
objp->blocksize = IXDR_GET_U_LONG(buf);
objp->rdev = IXDR_GET_U_LONG(buf);
objp->blocks = IXDR_GET_U_LONG(buf);
objp->fsid = IXDR_GET_U_LONG(buf);
objp->fileid = IXDR_GET_U_LONG(buf);
}
if (!xdr_nfstime (xdrs, &objp->atime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->mtime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->ctime))
return FALSE;
return TRUE;
}
if (!xdr_ftype (xdrs, &objp->type))
return FALSE;
if (!xdr_u_int (xdrs, &objp->mode))
return FALSE;
if (!xdr_u_int (xdrs, &objp->nlink))
return FALSE;
if (!xdr_u_int (xdrs, &objp->uid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->gid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->size))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocksize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->rdev))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocks))
return FALSE;
if (!xdr_u_int (xdrs, &objp->fsid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->fileid))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->atime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->mtime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->ctime))
return FALSE;
return TRUE;
}
bool_t
xdr_sattr (XDR *xdrs, sattr *objp)
{
register int32_t *buf;
if (xdrs->x_op == XDR_ENCODE) {
buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->mode))
return FALSE;
if (!xdr_u_int (xdrs, &objp->uid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->gid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->size))
return FALSE;
} else {
IXDR_PUT_U_LONG(buf, objp->mode);
IXDR_PUT_U_LONG(buf, objp->uid);
IXDR_PUT_U_LONG(buf, objp->gid);
IXDR_PUT_U_LONG(buf, objp->size);
}
if (!xdr_nfstime (xdrs, &objp->atime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->mtime))
return FALSE;
return TRUE;
} else if (xdrs->x_op == XDR_DECODE) {
buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->mode))
return FALSE;
if (!xdr_u_int (xdrs, &objp->uid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->gid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->size))
return FALSE;
} else {
objp->mode = IXDR_GET_U_LONG(buf);
objp->uid = IXDR_GET_U_LONG(buf);
objp->gid = IXDR_GET_U_LONG(buf);
objp->size = IXDR_GET_U_LONG(buf);
}
if (!xdr_nfstime (xdrs, &objp->atime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->mtime))
return FALSE;
return TRUE;
}
if (!xdr_u_int (xdrs, &objp->mode))
return FALSE;
if (!xdr_u_int (xdrs, &objp->uid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->gid))
return FALSE;
if (!xdr_u_int (xdrs, &objp->size))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->atime))
return FALSE;
if (!xdr_nfstime (xdrs, &objp->mtime))
return FALSE;
return TRUE;
}
bool_t
xdr_filename (XDR *xdrs, filename *objp)
{
if (!xdr_string (xdrs, objp, NFS_MAXNAMLEN))
return FALSE;
return TRUE;
}
bool_t
xdr_nfspath (XDR *xdrs, nfspath *objp)
{
if (!xdr_string (xdrs, objp, NFS_MAXPATHLEN))
return FALSE;
return TRUE;
}
bool_t
xdr_attrstat (XDR *xdrs, attrstat *objp)
{
if (!xdr_nfsstat (xdrs, &objp->status))
return FALSE;
switch (objp->status) {
case NFS_OK:
if (!xdr_fattr (xdrs, &objp->attrstat_u.attributes))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_sattrargs (XDR *xdrs, sattrargs *objp)
{
if (!xdr_nfs_fh (xdrs, &objp->file))
return FALSE;
if (!xdr_sattr (xdrs, &objp->attributes))
return FALSE;
return TRUE;
}
bool_t
xdr_diropargs (XDR *xdrs, diropargs *objp)
{
if (!xdr_nfs_fh (xdrs, &objp->dir))
return FALSE;
if (!xdr_filename (xdrs, &objp->name))
return FALSE;
return TRUE;
}
bool_t
xdr_diropokres (XDR *xdrs, diropokres *objp)
{
if (!xdr_nfs_fh (xdrs, &objp->file))
return FALSE;
if (!xdr_fattr (xdrs, &objp->attributes))
return FALSE;
return TRUE;
}
bool_t
xdr_diropres (XDR *xdrs, diropres *objp)
{
if (!xdr_nfsstat (xdrs, &objp->status))
return FALSE;
switch (objp->status) {
case NFS_OK:
if (!xdr_diropokres (xdrs, &objp->diropres_u.diropres))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_readlinkres (XDR *xdrs, readlinkres *objp)
{
if (!xdr_nfsstat (xdrs, &objp->status))
return FALSE;
switch (objp->status) {
case NFS_OK:
if (!xdr_nfspath (xdrs, &objp->readlinkres_u.data))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_readargs (XDR *xdrs, readargs *objp)
{
if (!xdr_nfs_fh (xdrs, &objp->file))
return FALSE;
if (!xdr_u_int (xdrs, &objp->offset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->count))
return FALSE;
if (!xdr_u_int (xdrs, &objp->totalcount))
return FALSE;
return TRUE;
}
bool_t
xdr_readokres (XDR *xdrs, readokres *objp)
{
if (!xdr_fattr (xdrs, &objp->attributes))
return FALSE;
if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, NFS_MAXDATA))
return FALSE;
return TRUE;
}
bool_t
xdr_readres (XDR *xdrs, readres *objp)
{
if (!xdr_nfsstat (xdrs, &objp->status))
return FALSE;
switch (objp->status) {
case NFS_OK:
if (!xdr_readokres (xdrs, &objp->readres_u.reply))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_writeargs (XDR *xdrs, writeargs *objp)
{
register int32_t *buf;
if (xdrs->x_op == XDR_ENCODE) {
if (!xdr_nfs_fh (xdrs, &objp->file))
return FALSE;
buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->beginoffset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->offset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->totalcount))
return FALSE;
} else {
IXDR_PUT_U_LONG(buf, objp->beginoffset);
IXDR_PUT_U_LONG(buf, objp->offset);
IXDR_PUT_U_LONG(buf, objp->totalcount);
}
if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, NFS_MAXDATA))
return FALSE;
return TRUE;
} else if (xdrs->x_op == XDR_DECODE) {
if (!xdr_nfs_fh (xdrs, &objp->file))
return FALSE;
buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->beginoffset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->offset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->totalcount))
return FALSE;
} else {
objp->beginoffset = IXDR_GET_U_LONG(buf);
objp->offset = IXDR_GET_U_LONG(buf);
objp->totalcount = IXDR_GET_U_LONG(buf);
}
if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, NFS_MAXDATA))
return FALSE;
return TRUE;
}
if (!xdr_nfs_fh (xdrs, &objp->file))
return FALSE;
if (!xdr_u_int (xdrs, &objp->beginoffset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->offset))
return FALSE;
if (!xdr_u_int (xdrs, &objp->totalcount))
return FALSE;
if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, NFS_MAXDATA))
return FALSE;
return TRUE;
}
bool_t
xdr_createargs (XDR *xdrs, createargs *objp)
{
if (!xdr_diropargs (xdrs, &objp->where))
return FALSE;
if (!xdr_sattr (xdrs, &objp->attributes))
return FALSE;
return TRUE;
}
bool_t
xdr_renameargs (XDR *xdrs, renameargs *objp)
{
if (!xdr_diropargs (xdrs, &objp->from))
return FALSE;
if (!xdr_diropargs (xdrs, &objp->to))
return FALSE;
return TRUE;
}
bool_t
xdr_linkargs (XDR *xdrs, linkargs *objp)
{
if (!xdr_nfs_fh (xdrs, &objp->from))
return FALSE;
if (!xdr_diropargs (xdrs, &objp->to))
return FALSE;
return TRUE;
}
bool_t
xdr_symlinkargs (XDR *xdrs, symlinkargs *objp)
{
if (!xdr_diropargs (xdrs, &objp->from))
return FALSE;
if (!xdr_nfspath (xdrs, &objp->to))
return FALSE;
if (!xdr_sattr (xdrs, &objp->attributes))
return FALSE;
return TRUE;
}
bool_t
xdr_nfscookie (XDR *xdrs, nfscookie objp)
{
if (!xdr_opaque (xdrs, objp, NFS_COOKIESIZE))
return FALSE;
return TRUE;
}
bool_t
xdr_readdirargs (XDR *xdrs, readdirargs *objp)
{
if (!xdr_nfs_fh (xdrs, &objp->dir))
return FALSE;
if (!xdr_nfscookie (xdrs, objp->cookie))
return FALSE;
if (!xdr_u_int (xdrs, &objp->count))
return FALSE;
return TRUE;
}
bool_t
xdr_entry (XDR *xdrs, entry *objp)
{
if (!xdr_u_int (xdrs, &objp->fileid))
return FALSE;
if (!xdr_filename (xdrs, &objp->name))
return FALSE;
if (!xdr_nfscookie (xdrs, objp->cookie))
return FALSE;
if (!xdr_pointer (xdrs, (char **)&objp->nextentry, sizeof (entry), (xdrproc_t) xdr_entry))
return FALSE;
return TRUE;
}
bool_t
xdr_dirlist (XDR *xdrs, dirlist *objp)
{
if (!xdr_pointer (xdrs, (char **)&objp->entries, sizeof (entry), (xdrproc_t) xdr_entry))
return FALSE;
if (!xdr_bool (xdrs, &objp->eof))
return FALSE;
return TRUE;
}
bool_t
xdr_readdirres (XDR *xdrs, readdirres *objp)
{
if (!xdr_nfsstat (xdrs, &objp->status))
return FALSE;
switch (objp->status) {
case NFS_OK:
if (!xdr_dirlist (xdrs, &objp->readdirres_u.reply))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_statfsokres (XDR *xdrs, statfsokres *objp)
{
register int32_t *buf;
if (xdrs->x_op == XDR_ENCODE) {
buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->tsize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bsize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocks))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bfree))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bavail))
return FALSE;
} else {
IXDR_PUT_U_LONG(buf, objp->tsize);
IXDR_PUT_U_LONG(buf, objp->bsize);
IXDR_PUT_U_LONG(buf, objp->blocks);
IXDR_PUT_U_LONG(buf, objp->bfree);
IXDR_PUT_U_LONG(buf, objp->bavail);
}
return TRUE;
} else if (xdrs->x_op == XDR_DECODE) {
buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_u_int (xdrs, &objp->tsize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bsize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocks))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bfree))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bavail))
return FALSE;
} else {
objp->tsize = IXDR_GET_U_LONG(buf);
objp->bsize = IXDR_GET_U_LONG(buf);
objp->blocks = IXDR_GET_U_LONG(buf);
objp->bfree = IXDR_GET_U_LONG(buf);
objp->bavail = IXDR_GET_U_LONG(buf);
}
return TRUE;
}
if (!xdr_u_int (xdrs, &objp->tsize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bsize))
return FALSE;
if (!xdr_u_int (xdrs, &objp->blocks))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bfree))
return FALSE;
if (!xdr_u_int (xdrs, &objp->bavail))
return FALSE;
return TRUE;
}
bool_t
xdr_statfsres (XDR *xdrs, statfsres *objp)
{
if (!xdr_nfsstat (xdrs, &objp->status))
return FALSE;
switch (objp->status) {
case NFS_OK:
if (!xdr_statfsokres (xdrs, &objp->statfsres_u.reply))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_fhandle (XDR *xdrs, fhandle objp)
{
if (!xdr_opaque (xdrs, objp, FHSIZE))
return FALSE;
return TRUE;
}
bool_t
xdr_fhstatus (XDR *xdrs, fhstatus *objp)
{
if (!xdr_u_int (xdrs, &objp->fhs_status))
return FALSE;
switch (objp->fhs_status) {
case 0:
if (!xdr_fhandle (xdrs, objp->fhstatus_u.fhs_fhandle))
return FALSE;
break;
default:
break;
}
return TRUE;
}
bool_t
xdr_dirpath (XDR *xdrs, dirpath *objp)
{
if (!xdr_string (xdrs, objp, MNTPATHLEN))
return FALSE;
return TRUE;
}
bool_t
xdr_name (XDR *xdrs, name *objp)
{
if (!xdr_string (xdrs, objp, MNTNAMLEN))
return FALSE;
return TRUE;
}
bool_t
xdr_mountlist (XDR *xdrs, mountlist *objp)
{
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct mountbody), (xdrproc_t) xdr_mountbody))
return FALSE;
return TRUE;
}
bool_t
xdr_mountbody (XDR *xdrs, mountbody *objp)
{
if (!xdr_name (xdrs, &objp->ml_hostname))
return FALSE;
if (!xdr_dirpath (xdrs, &objp->ml_directory))
return FALSE;
if (!xdr_mountlist (xdrs, &objp->ml_next))
return FALSE;
return TRUE;
}
bool_t
xdr_groups (XDR *xdrs, groups *objp)
{
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct groupnode), (xdrproc_t) xdr_groupnode))
return FALSE;
return TRUE;
}
bool_t
xdr_groupnode (XDR *xdrs, groupnode *objp)
{
if (!xdr_name (xdrs, &objp->gr_name))
return FALSE;
if (!xdr_groups (xdrs, &objp->gr_next))
return FALSE;
return TRUE;
}
bool_t
xdr_exports (XDR *xdrs, exports *objp)
{
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct exportnode), (xdrproc_t) xdr_exportnode))
return FALSE;
return TRUE;
}
bool_t
xdr_exportnode (XDR *xdrs, exportnode *objp)
{
if (!xdr_dirpath (xdrs, &objp->ex_dir))
return FALSE;
if (!xdr_groups (xdrs, &objp->ex_groups))
return FALSE;
if (!xdr_exports (xdrs, &objp->ex_next))
return FALSE;
return TRUE;
}
bool_t
xdr_ppathcnf (XDR *xdrs, ppathcnf *objp)
{
register int32_t *buf;
int i;
if (xdrs->x_op == XDR_ENCODE) {
buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_int (xdrs, &objp->pc_link_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_max_canon))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_max_input))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_name_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_path_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
return FALSE;
} else {
IXDR_PUT_LONG(buf, objp->pc_link_max);
IXDR_PUT_SHORT(buf, objp->pc_max_canon);
IXDR_PUT_SHORT(buf, objp->pc_max_input);
IXDR_PUT_SHORT(buf, objp->pc_name_max);
IXDR_PUT_SHORT(buf, objp->pc_path_max);
IXDR_PUT_SHORT(buf, objp->pc_pipe_buf);
}
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
return FALSE;
if (!xdr_char (xdrs, &objp->pc_xxx))
return FALSE;
buf = XDR_INLINE (xdrs, ( 2 ) * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
sizeof (short), (xdrproc_t) xdr_short))
return FALSE;
} else {
{
register short *genp;
for (i = 0, genp = objp->pc_mask;
i < 2; ++i) {
IXDR_PUT_SHORT(buf, *genp++);
}
}
}
return TRUE;
} else if (xdrs->x_op == XDR_DECODE) {
buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_int (xdrs, &objp->pc_link_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_max_canon))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_max_input))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_name_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_path_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
return FALSE;
} else {
objp->pc_link_max = IXDR_GET_LONG(buf);
objp->pc_max_canon = IXDR_GET_SHORT(buf);
objp->pc_max_input = IXDR_GET_SHORT(buf);
objp->pc_name_max = IXDR_GET_SHORT(buf);
objp->pc_path_max = IXDR_GET_SHORT(buf);
objp->pc_pipe_buf = IXDR_GET_SHORT(buf);
}
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
return FALSE;
if (!xdr_char (xdrs, &objp->pc_xxx))
return FALSE;
buf = XDR_INLINE (xdrs, ( 2 ) * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
sizeof (short), (xdrproc_t) xdr_short))
return FALSE;
} else {
{
register short *genp;
for (i = 0, genp = objp->pc_mask;
i < 2; ++i) {
*genp++ = IXDR_GET_SHORT(buf);
}
}
}
return TRUE;
}
if (!xdr_int (xdrs, &objp->pc_link_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_max_canon))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_max_input))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_name_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_path_max))
return FALSE;
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
return FALSE;
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
return FALSE;
if (!xdr_char (xdrs, &objp->pc_xxx))
return FALSE;
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
sizeof (short), (xdrproc_t) xdr_short))
return FALSE;
return TRUE;
}

File diff suppressed because it is too large Load diff

View file

@ -1,920 +0,0 @@
/*
* To compile this file into the proper files:
* rpcgen -C -N nfs.x
* rpcgen -C -N -m nfs.x > programs.c
* rpcgen -C -N -s tcp nfs.x > run_example.c
* rpcgen -C -N -Ss nfs.x > server_template.c
* rm nfs_clnt.c nfs_svc.c
* mv nfs_xdr.c xdr.c
*/
const PROGRAM = 100003;
const VERSION = 3;
const NFS3_FHSIZE = 64;
const NFS3_COOKIEVERFSIZE = 8;
const NFS3_CREATEVERFSIZE = 8;
const NFS3_WRITEVERFSIZE = 8;
%#if defined(HAVE_XDR_U_INT64_T)
%#define xdr_uint64_t xdr_u_int64_t
%#elif !defined(HAVE_XDR_UINT64_T)
%#if defined(HAVE_XDR_U_HYPER)
%#define xdr_uint64_t xdr_u_hyper
%#define xdr_int64_t xdr_hyper
%#elif defined(HAVE_XDR_U_LONGLONG_T)
%#define xdr_uint64_t xdr_u_longlong_t
%#define xdr_int64_t xdr_longlong_t
%#endif
%#endif
typedef uint64_t uint64;
typedef int64_t int64;
typedef unsigned long uint32;
typedef long int32;
typedef string filename3<>;
typedef string nfspath3<>;
typedef uint64 fileid3;
typedef uint64 cookie3;
typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
typedef opaque createverf3[NFS3_CREATEVERFSIZE];
typedef opaque writeverf3[NFS3_WRITEVERFSIZE];
typedef uint32 uid3;
typedef uint32 gid3;
typedef uint64 size3;
typedef uint64 offset3;
typedef uint32 mode3;
typedef uint32 count3;
enum nfsstat3 {
NFS3_OK = 0,
NFS3ERR_PERM = 1,
NFS3ERR_NOENT = 2,
NFS3ERR_IO = 5,
NFS3ERR_NXIO = 6,
NFS3ERR_ACCES = 13,
NFS3ERR_EXIST = 17,
NFS3ERR_XDEV = 18,
NFS3ERR_NODEV = 19,
NFS3ERR_NOTDIR = 20,
NFS3ERR_ISDIR = 21,
NFS3ERR_INVAL = 22,
NFS3ERR_FBIG = 27,
NFS3ERR_NOSPC = 28,
NFS3ERR_ROFS = 30,
NFS3ERR_MLINK = 31,
NFS3ERR_NAMETOOLONG = 63,
NFS3ERR_NOTEMPTY = 66,
NFS3ERR_DQUOT = 69,
NFS3ERR_STALE = 70,
NFS3ERR_REMOTE = 71,
NFS3ERR_BADHANDLE = 10001,
NFS3ERR_NOT_SYNC = 10002,
NFS3ERR_BAD_COOKIE = 10003,
NFS3ERR_NOTSUPP = 10004,
NFS3ERR_TOOSMALL = 10005,
NFS3ERR_SERVERFAULT = 10006,
NFS3ERR_BADTYPE = 10007,
NFS3ERR_JUKEBOX = 10008
};
enum ftype3 {
NF3REG = 1,
NF3DIR = 2,
NF3BLK = 3,
NF3CHR = 4,
NF3LNK = 5,
NF3SOCK = 6,
NF3FIFO = 7
};
struct specdata3 {
uint32 specdata1;
uint32 specdata2;
};
struct nfs_fh3 {
opaque data<NFS3_FHSIZE>;
};
struct nfstime3 {
uint32 seconds;
uint32 nseconds;
};
struct fattr3 {
ftype3 type;
mode3 mode;
uint32 nlink;
uid3 uid;
gid3 gid;
size3 size;
size3 used;
specdata3 rdev;
uint64 fsid;
fileid3 fileid;
nfstime3 atime;
nfstime3 mtime;
nfstime3 ctime;
};
union post_op_attr switch (bool attributes_follow) {
case TRUE:
fattr3 attributes;
case FALSE:
void;
};
struct wcc_attr {
size3 size;
nfstime3 mtime;
nfstime3 ctime;
};
union pre_op_attr switch (bool attributes_follow) {
case TRUE:
wcc_attr attributes;
case FALSE:
void;
};
struct wcc_data {
pre_op_attr before;
post_op_attr after;
};
union post_op_fh3 switch (bool handle_follows) {
case TRUE:
nfs_fh3 handle;
case FALSE:
void;
};
enum time_how {
DONT_CHANGE = 0,
SET_TO_SERVER_TIME = 1,
SET_TO_CLIENT_TIME = 2
};
union set_mode3 switch (bool set_it) {
case TRUE:
mode3 mode;
default:
void;
};
union set_uid3 switch (bool set_it) {
case TRUE:
uid3 uid;
default:
void;
};
union set_gid3 switch (bool set_it) {
case TRUE:
gid3 gid;
default:
void;
};
union set_size3 switch (bool set_it) {
case TRUE:
size3 size;
default:
void;
};
union set_atime switch (time_how set_it) {
case SET_TO_CLIENT_TIME:
nfstime3 atime;
default:
void;
};
union set_mtime switch (time_how set_it) {
case SET_TO_CLIENT_TIME:
nfstime3 mtime;
default:
void;
};
struct sattr3 {
set_mode3 mode;
set_uid3 uid;
set_gid3 gid;
set_size3 size;
set_atime atime;
set_mtime mtime;
};
struct diropargs3 {
nfs_fh3 dir;
filename3 name;
};
program NFS_PROGRAM {
version NFS_V3 {
void
NFSPROC3_NULL(void) = 0;
GETATTR3res
NFSPROC3_GETATTR(GETATTR3args) = 1;
SETATTR3res
NFSPROC3_SETATTR(SETATTR3args) = 2;
LOOKUP3res
NFSPROC3_LOOKUP(LOOKUP3args) = 3;
ACCESS3res
NFSPROC3_ACCESS(ACCESS3args) = 4;
READLINK3res
NFSPROC3_READLINK(READLINK3args) = 5;
READ3res
NFSPROC3_READ(READ3args) = 6;
WRITE3res
NFSPROC3_WRITE(WRITE3args) = 7;
CREATE3res
NFSPROC3_CREATE(CREATE3args) = 8;
MKDIR3res
NFSPROC3_MKDIR(MKDIR3args) = 9;
SYMLINK3res
NFSPROC3_SYMLINK(SYMLINK3args) = 10;
MKNOD3res
NFSPROC3_MKNOD(MKNOD3args) = 11;
REMOVE3res
NFSPROC3_REMOVE(REMOVE3args) = 12;
RMDIR3res
NFSPROC3_RMDIR(RMDIR3args) = 13;
RENAME3res
NFSPROC3_RENAME(RENAME3args) = 14;
LINK3res
NFSPROC3_LINK(LINK3args) = 15;
READDIR3res
NFSPROC3_READDIR(READDIR3args) = 16;
READDIRPLUS3res
NFSPROC3_READDIRPLUS(READDIRPLUS3args) = 17;
FSSTAT3res
NFSPROC3_FSSTAT(FSSTAT3args) = 18;
FSINFO3res
NFSPROC3_FSINFO(FSINFO3args) = 19;
PATHCONF3res
NFSPROC3_PATHCONF(PATHCONF3args) = 20;
COMMIT3res
NFSPROC3_COMMIT(COMMIT3args) = 21;
} = 3;
} = 100003;
struct GETATTR3args {
nfs_fh3 object;
};
struct GETATTR3resok {
fattr3 obj_attributes;
};
union GETATTR3res switch (nfsstat3 status) {
case NFS3_OK:
GETATTR3resok resok;
default:
void;
};
union sattrguard3 switch (bool check) {
case TRUE:
nfstime3 obj_ctime;
case FALSE:
void;
};
struct SETATTR3args {
nfs_fh3 object;
sattr3 new_attributes;
sattrguard3 guard;
};
struct SETATTR3resok {
wcc_data obj_wcc;
};
struct SETATTR3resfail {
wcc_data obj_wcc;
};
union SETATTR3res switch (nfsstat3 status) {
case NFS3_OK:
SETATTR3resok resok;
default:
SETATTR3resfail resfail;
};
struct LOOKUP3args {
diropargs3 what;
};
struct LOOKUP3resok {
nfs_fh3 object;
post_op_attr obj_attributes;
post_op_attr dir_attributes;
};
struct LOOKUP3resfail {
post_op_attr dir_attributes;
};
union LOOKUP3res switch (nfsstat3 status) {
case NFS3_OK:
LOOKUP3resok resok;
default:
LOOKUP3resfail resfail;
};
const ACCESS3_READ = 0x0001;
const ACCESS3_LOOKUP = 0x0002;
const ACCESS3_MODIFY = 0x0004;
const ACCESS3_EXTEND = 0x0008;
const ACCESS3_DELETE = 0x0010;
const ACCESS3_EXECUTE = 0x0020;
struct ACCESS3args {
nfs_fh3 object;
uint32 access;
};
struct ACCESS3resok {
post_op_attr obj_attributes;
uint32 access;
};
struct ACCESS3resfail {
post_op_attr obj_attributes;
};
union ACCESS3res switch (nfsstat3 status) {
case NFS3_OK:
ACCESS3resok resok;
default:
ACCESS3resfail resfail;
};
struct READLINK3args {
nfs_fh3 symlink;
};
struct READLINK3resok {
post_op_attr symlink_attributes;
nfspath3 data;
};
struct READLINK3resfail {
post_op_attr symlink_attributes;
};
union READLINK3res switch (nfsstat3 status) {
case NFS3_OK:
READLINK3resok resok;
default:
READLINK3resfail resfail;
};
struct READ3args {
nfs_fh3 file;
offset3 offset;
count3 count;
};
struct READ3resok {
post_op_attr file_attributes;
count3 count;
bool eof;
opaque data<>;
};
struct READ3resfail {
post_op_attr file_attributes;
};
union READ3res switch (nfsstat3 status) {
case NFS3_OK:
READ3resok resok;
default:
READ3resfail resfail;
};
enum stable_how {
UNSTABLE = 0,
DATA_SYNC = 1,
FILE_SYNC = 2
};
struct WRITE3args {
nfs_fh3 file;
offset3 offset;
count3 count;
stable_how stable;
opaque data<>;
};
struct WRITE3resok {
wcc_data file_wcc;
count3 count;
stable_how committed;
writeverf3 verf;
};
struct WRITE3resfail {
wcc_data file_wcc;
};
union WRITE3res switch (nfsstat3 status) {
case NFS3_OK:
WRITE3resok resok;
default:
WRITE3resfail resfail;
};
enum createmode3 {
UNCHECKED = 0,
GUARDED = 1,
EXCLUSIVE = 2
};
union createhow3 switch (createmode3 mode) {
case UNCHECKED:
case GUARDED:
sattr3 obj_attributes;
case EXCLUSIVE:
createverf3 verf;
};
struct CREATE3args {
diropargs3 where;
createhow3 how;
};
struct CREATE3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct CREATE3resfail {
wcc_data dir_wcc;
};
union CREATE3res switch (nfsstat3 status) {
case NFS3_OK:
CREATE3resok resok;
default:
CREATE3resfail resfail;
};
struct MKDIR3args {
diropargs3 where;
sattr3 attributes;
};
struct MKDIR3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct MKDIR3resfail {
wcc_data dir_wcc;
};
union MKDIR3res switch (nfsstat3 status) {
case NFS3_OK:
MKDIR3resok resok;
default:
MKDIR3resfail resfail;
};
struct symlinkdata3 {
sattr3 symlink_attributes;
nfspath3 symlink_data;
};
struct SYMLINK3args {
diropargs3 where;
symlinkdata3 symlink;
};
struct SYMLINK3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct SYMLINK3resfail {
wcc_data dir_wcc;
};
union SYMLINK3res switch (nfsstat3 status) {
case NFS3_OK:
SYMLINK3resok resok;
default:
SYMLINK3resfail resfail;
};
struct devicedata3 {
sattr3 dev_attributes;
specdata3 spec;
};
union mknoddata3 switch (ftype3 type) {
case NF3CHR:
case NF3BLK:
devicedata3 device;
case NF3SOCK:
case NF3FIFO:
sattr3 pipe_attributes;
default:
void;
};
struct MKNOD3args {
diropargs3 where;
mknoddata3 what;
};
struct MKNOD3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct MKNOD3resfail {
wcc_data dir_wcc;
};
union MKNOD3res switch (nfsstat3 status) {
case NFS3_OK:
MKNOD3resok resok;
default:
MKNOD3resfail resfail;
};
struct REMOVE3args {
diropargs3 object;
};
struct REMOVE3resok {
wcc_data dir_wcc;
};
struct REMOVE3resfail {
wcc_data dir_wcc;
};
union REMOVE3res switch (nfsstat3 status) {
case NFS3_OK:
REMOVE3resok resok;
default:
REMOVE3resfail resfail;
};
struct RMDIR3args {
diropargs3 object;
};
struct RMDIR3resok {
wcc_data dir_wcc;
};
struct RMDIR3resfail {
wcc_data dir_wcc;
};
union RMDIR3res switch (nfsstat3 status) {
case NFS3_OK:
RMDIR3resok resok;
default:
RMDIR3resfail resfail;
};
struct RENAME3args {
diropargs3 from;
diropargs3 to;
};
struct RENAME3resok {
wcc_data fromdir_wcc;
wcc_data todir_wcc;
};
struct RENAME3resfail {
wcc_data fromdir_wcc;
wcc_data todir_wcc;
};
union RENAME3res switch (nfsstat3 status) {
case NFS3_OK:
RENAME3resok resok;
default:
RENAME3resfail resfail;
};
struct LINK3args {
nfs_fh3 file;
diropargs3 link;
};
struct LINK3resok {
post_op_attr file_attributes;
wcc_data linkdir_wcc;
};
struct LINK3resfail {
post_op_attr file_attributes;
wcc_data linkdir_wcc;
};
union LINK3res switch (nfsstat3 status) {
case NFS3_OK:
LINK3resok resok;
default:
LINK3resfail resfail;
};
struct READDIR3args {
nfs_fh3 dir;
cookie3 cookie;
cookieverf3 cookieverf;
count3 count;
};
struct entry3 {
fileid3 fileid;
filename3 name;
cookie3 cookie;
entry3 *nextentry;
};
struct dirlist3 {
entry3 *entries;
bool eof;
};
struct READDIR3resok {
post_op_attr dir_attributes;
cookieverf3 cookieverf;
dirlist3 reply;
};
struct READDIR3resfail {
post_op_attr dir_attributes;
};
union READDIR3res switch (nfsstat3 status) {
case NFS3_OK:
READDIR3resok resok;
default:
READDIR3resfail resfail;
};
struct READDIRPLUS3args {
nfs_fh3 dir;
cookie3 cookie;
cookieverf3 cookieverf;
count3 dircount;
count3 maxcount;
};
struct entryplus3 {
fileid3 fileid;
filename3 name;
cookie3 cookie;
post_op_attr name_attributes;
post_op_fh3 name_handle;
entryplus3 *nextentry;
};
struct dirlistplus3 {
entryplus3 *entries;
bool eof;
};
struct READDIRPLUS3resok {
post_op_attr dir_attributes;
cookieverf3 cookieverf;
dirlistplus3 reply;
};
struct READDIRPLUS3resfail {
post_op_attr dir_attributes;
};
union READDIRPLUS3res switch (nfsstat3 status) {
case NFS3_OK:
READDIRPLUS3resok resok;
default:
READDIRPLUS3resfail resfail;
};
struct FSSTAT3args {
nfs_fh3 fsroot;
};
struct FSSTAT3resok {
post_op_attr obj_attributes;
size3 tbytes;
size3 fbytes;
size3 abytes;
size3 tfiles;
size3 ffiles;
size3 afiles;
uint32 invarsec;
};
struct FSSTAT3resfail {
post_op_attr obj_attributes;
};
union FSSTAT3res switch (nfsstat3 status) {
case NFS3_OK:
FSSTAT3resok resok;
default:
FSSTAT3resfail resfail;
};
const FSF3_LINK = 0x0001;
const FSF3_SYMLINK = 0x0002;
const FSF3_HOMOGENEOUS = 0x0008;
const FSF3_CANSETTIME = 0x0010;
struct FSINFO3args {
nfs_fh3 fsroot;
};
struct FSINFO3resok {
post_op_attr obj_attributes;
uint32 rtmax;
uint32 rtpref;
uint32 rtmult;
uint32 wtmax;
uint32 wtpref;
uint32 wtmult;
uint32 dtpref;
size3 maxfilesize;
nfstime3 time_delta;
uint32 properties;
};
struct FSINFO3resfail {
post_op_attr obj_attributes;
};
union FSINFO3res switch (nfsstat3 status) {
case NFS3_OK:
FSINFO3resok resok;
default:
FSINFO3resfail resfail;
};
struct PATHCONF3args {
nfs_fh3 object;
};
struct PATHCONF3resok {
post_op_attr obj_attributes;
uint32 linkmax;
uint32 name_max;
bool no_trunc;
bool chown_restricted;
bool case_insensitive;
bool case_preserving;
};
struct PATHCONF3resfail {
post_op_attr obj_attributes;
};
union PATHCONF3res switch (nfsstat3 status) {
case NFS3_OK:
PATHCONF3resok resok;
default:
PATHCONF3resfail resfail;
};
struct COMMIT3args {
nfs_fh3 file;
offset3 offset;
count3 count;
};
struct COMMIT3resok {
wcc_data file_wcc;
writeverf3 verf;
};
struct COMMIT3resfail {
wcc_data file_wcc;
};
union COMMIT3res switch (nfsstat3 status) {
case NFS3_OK:
COMMIT3resok resok;
default:
COMMIT3resfail resfail;
};
const MNTPATHLEN3 = 1024; /* Maximum bytes in a path name */
const MNTNAMLEN3 = 255; /* Maximum bytes in a name */
const FHSIZE3 = 64; /* Maximum bytes in a V3 file handle */
typedef opaque fhandle3<FHSIZE3>;
typedef string dirpath3<MNTPATHLEN3>;
typedef string name3<MNTNAMLEN3>;
enum mountstat3 {
MNT3_OK = 0, /* no error */
MNT3ERR_PERM = 1, /* Not owner */
MNT3ERR_NOENT = 2, /* No such file or directory */
MNT3ERR_IO = 5, /* I/O error */
MNT3ERR_ACCES = 13, /* Permission denied */
MNT3ERR_NOTDIR = 20, /* Not a directory */
MNT3ERR_INVAL = 22, /* Invalid argument */
MNT3ERR_NAMETOOLONG = 63, /* Filename too long */
MNT3ERR_NOTSUPP = 10004, /* Operation not supported */
MNT3ERR_SERVERFAULT = 10006 /* A failure on the server */
};
program MOUNT_PROGRAM {
version MOUNT_V3 {
void MOUNTPROC3_NULL(void) = 0;
mountres3 MOUNTPROC3_MNT(dirpath3) = 1;
mountlist3 MOUNTPROC3_DUMP(void) = 2;
void MOUNTPROC3_UMNT(dirpath3) = 3;
void MOUNTPROC3_UMNTALL(void) = 4;
exports3 MOUNTPROC3_EXPORT(void) = 5;
} = 3;
} = 100005;
struct mountres3_ok {
fhandle3 fhandle;
int auth_flavors<>;
};
union mountres3 switch (mountstat3 fhs_status) {
case MNT3_OK:
mountres3_ok mountinfo;
default:
void;
};
typedef struct mountbody3 *mountlist3;
struct mountbody3 {
name3 ml_hostname;
dirpath3 ml_directory;
mountlist3 ml_next;
};
typedef struct groupnode3 *groups3;
struct groupnode3 {
name3 gr_name;
groups3 gr_next;
};
typedef struct exportnode3 *exports3;
struct exportnode3 {
dirpath3 ex_dir;
groups3 ex_groups;
exports3 ex_next;
};

File diff suppressed because it is too large Load diff

View file

@ -1,30 +0,0 @@
check_include_files(utime.h HAVE_UTIME_H)
configure_file(config-smb.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-smb.h)
set(kio_smb_PART_SRCS
kio_smb.cpp
kio_smb_auth.cpp
kio_smb_browse.cpp
kio_smb_config.cpp
kio_smb_dir.cpp
kio_smb_file.cpp
kio_smb_internal.cpp
kio_smb_mount.cpp
)
include_directories(${SAMBA_INCLUDE_DIR})
kde4_add_plugin(kio_smb ${kio_smb_PART_SRCS})
target_link_libraries(kio_smb ${KDE4_KIO_LIBS} ${SAMBA_LIBRARIES})
install(TARGETS kio_smb DESTINATION ${KDE4_PLUGIN_INSTALL_DIR})
########### install files ###############
install( FILES smb.protocol DESTINATION ${KDE4_SERVICES_INSTALL_DIR})
install( FILES smb-network.desktop DESTINATION ${KDE4_DATA_INSTALL_DIR}/remoteview)

View file

@ -1,2 +0,0 @@
#!/bin/bash
$XGETTEXT *.cpp -o $podir/kio_smb.pot

View file

@ -1,2 +0,0 @@
/* Define to 1 if you have the <utime.h> header file. */
#cmakedefine HAVE_UTIME_H 1

View file

@ -1,75 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE
//
// File: Top level implementation file for kio_smb.cpp
//
// Abstract: member function implementations for SMBSlave
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include "kio_smb.h"
#include "kio_smb_internal.h"
#include <kcomponentdata.h>
#include <kdemacros.h>
#include <QApplication>
//===========================================================================
SMBSlave::SMBSlave(const QByteArray& pool, const QByteArray& app)
: SlaveBase( "smb", pool, app ), m_openFd(-1)
{
m_initialized_smbc = false;
//read in the default workgroup info...
reparseConfiguration();
//initialize the library...
auth_initialize_smbc();
}
//===========================================================================
SMBSlave::~SMBSlave()
{
}
//===========================================================================
int KDE_EXPORT kdemain( int argc, char **argv )
{
QApplication app(argc, argv);
KComponentData componentData("kio_smb");
if( argc != 4 )
{
kDebug(KIO_SMB) << "Usage: kio_smb protocol domain-socket1 domain-socket2"
<< endl;
return -1;
}
SMBSlave slave( argv[2], argv[3] );
slave.dispatchLoop();
return 0;
}

View file

@ -1,299 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE
//
// File: kio_smb.h
//
// Abstract: The main kio slave class declaration. For convenience,
// in concurrent devlopment, the implementation for this class
// is separated into several .cpp files -- the file containing
// the implementation should be noted in the comments for each
// member function.
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#ifndef KIO_SMB_H_INCLUDED
#define KIO_SMB_H_INCLUDED
#include "config-smb.h"
//--------------
// KDE includes
//--------------
#include <kdebug.h>
#include <kio/global.h>
#include <kio/slavebase.h>
#include <kurl.h>
#include <klocale.h>
//-----------------------------
// Standard C library includes
//-----------------------------
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <QObject>
//-------------------------------
// Samba client library includes
//-------------------------------
extern "C"
{
#include <libsmbclient.h>
}
//---------------------------
// kio_smb internal includes
//---------------------------
#include "kio_smb_internal.h"
#define MAX_XFER_BUF_SIZE 65534
#define KIO_SMB 7106
using namespace KIO;
//===========================================================================
class SMBSlave : public QObject, public KIO::SlaveBase
{
Q_OBJECT
private:
//---------------------------------------------------------------------
// please make sure your private data does not duplicate existing data
//---------------------------------------------------------------------
bool m_initialized_smbc;
/**
* From Controlcenter
*/
QString m_default_user;
// QString m_default_workgroup; //currently unused, Alex <neundorf@kde.org>
QString m_default_password;
QString m_default_encoding;
/**
* we store the current url, it's needed for
* callback authorization method
*/
SMBUrl m_current_url;
/**
* From Controlcenter, show SHARE$ or not
*/
// bool m_showHiddenShares; //currently unused, Alex <neundorf@kde.org>
/**
* libsmbclient need global variables to store in,
* else it crashes on exit next method after use cache_stat,
* looks like gcc (C/C++) failure
*/
struct stat st;
protected:
//---------------------------------------------
// Authentication functions (kio_smb_auth.cpp)
//---------------------------------------------
// (please prefix functions with auth)
/**
* Description : Initializes the libsmbclient
* Return : true on success false with errno set on error
*/
bool auth_initialize_smbc();
bool checkPassword(SMBUrl &url);
//---------------------------------------------
// Cache functions (kio_smb_auth.cpp)
//---------------------------------------------
//Stat methods
//-----------------------------------------
// Browsing functions (kio_smb_browse.cpp)
//-----------------------------------------
// (please prefix functions with browse)
/**
* Description : Return a stat of given SMBUrl. Calls cache_stat and
* pack it in UDSEntry. UDSEntry will not be cleared
* Parameter : SMBUrl the url to stat
* ignore_errors do not call error(), but warning()
* Return : false if any error occurred (errno), else true
*/
bool browse_stat_path(const SMBUrl& url, UDSEntry& udsentry, bool ignore_errors);
/**
* Description : call smbc_stat and return stats of the url
* Parameter : SMBUrl the url to stat
* Return : stat* of the url
* Note : it has some problems with stat in method, looks like
* something leave(or removed) on the stack. If your
* method segfault on returning try to change the stat*
* variable
*/
int cache_stat( const SMBUrl& url, struct stat* st );
//---------------------------------------------
// Configuration functions (kio_smb_config.cpp)
//---------------------------------------------
// (please prefix functions with config)
//---------------------------------------
// Directory functions (kio_smb_dir.cpp)
//---------------------------------------
// (please prefix functions with dir)
//--------------------------------------
// File IO functions (kio_smb_file.cpp)
//--------------------------------------
// (please prefix functions with file)
//----------------------------
// Misc functions (this file)
//----------------------------
/**
* Description : correct a given URL
* valid URL's are
*
* smb://[[domain;]user[:password]@]server[:port][/share[/path[/file]]]
* smb:/[[domain;]user[:password]@][group/[server[/share[/path[/file]]]]]
* domain = workgroup(domain) of the user
* user = username
* password = password of useraccount
* group = workgroup(domain) of server
* server = host to connect
* share = a share of the server (host)
* path = a path of the share
* Parameter : KUrl the url to check
* Return : new KUrl if it is corrected. else the same KUrl
*/
KUrl checkURL(const KUrl& kurl) const;
void reportError(const SMBUrl &kurl, const int &errNum);
public:
//-----------------------------------------------------------------------
// smbclient authentication callback (note that this is called by the
// global ::auth_smbc_get_data() call.
void auth_smbc_get_data(const char *server,const char *share,
char *workgroup, int wgmaxlen,
char *username, int unmaxlen,
char *password, int pwmaxlen);
//-----------------------------------------------------------------------
// Overwritten functions from the base class that define the operation of
// this slave. (See the base class headerfile slavebase.h for more
// details)
//-----------------------------------------------------------------------
// Functions overwritten in kio_smb.cpp
SMBSlave(const QByteArray& pool, const QByteArray& app);
virtual ~SMBSlave();
// Functions overwritten in kio_smb_browse.cpp
virtual void listDir( const KUrl& url );
virtual void stat( const KUrl& url );
// Functions overwritten in kio_smb_config.cpp
virtual void reparseConfiguration();
// Functions overwritten in kio_smb_dir.cpp
virtual void copy( const KUrl& src, const KUrl &dest, int permissions, KIO::JobFlags flags );
virtual void del( const KUrl& kurl, bool isfile);
virtual void mkdir( const KUrl& kurl, int permissions );
virtual void rename( const KUrl& src, const KUrl& dest, KIO::JobFlags flags );
// Functions overwritten in kio_smb_file.cpp
virtual void get( const KUrl& kurl );
virtual void put( const KUrl& kurl, int permissions, KIO::JobFlags flags );
virtual void open( const KUrl& kurl, QIODevice::OpenMode mode );
virtual void read( KIO::filesize_t bytesRequested );
virtual void write( const QByteArray &fileData );
virtual void seek( KIO::filesize_t offset );
virtual void close();
// Functions not implemented (yet)
//virtual void setHost(const QString& host, int port, const QString& user, const QString& pass);
//virtual void openConnection();
//virtual void closeConnection();
//virtual void slave_status();
virtual void special( const QByteArray & );
private:
void smbCopy(const KUrl& src, const KUrl &dest, int permissions, KIO::JobFlags flags);
void smbCopyGet(const KUrl& src, const KUrl& dest, int permissions, KIO::JobFlags flags);
void smbCopyPut(const KUrl& src, const KUrl& dest, int permissions, KIO::JobFlags flags);
/**
* Used in open(), read(), write(), and close()
* FIXME Placing these in the private section above causes m_openUrl = kurl
* to fail in SMBSlave::open. Need to find out why this is.
*/
int m_openFd;
SMBUrl m_openUrl;
};
//==========================================================================
// the global libsmbclient authentication callback function
extern "C"
{
void auth_smbc_get_data(SMBCCTX * context,
const char *server,const char *share,
char *workgroup, int wgmaxlen,
char *username, int unmaxlen,
char *password, int pwmaxlen);
}
//===========================================================================
// Main slave entrypoint (see kio_smb.cpp)
extern "C"
{
int kdemain( int argc, char **argv );
}
#endif //#endif KIO_SMB_H_INCLUDED

View file

@ -1,224 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_auth.cpp
//
// Abstract: member function implementations for SMBSlave that deal with
// SMB directory access
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include "kio_smb.h"
#include "kio_smb_internal.h"
#include <kconfig.h>
#include <kconfiggroup.h>
#include <stdlib.h>
// call for libsmbclient
//==========================================================================
void auth_smbc_get_data(SMBCCTX * context,
const char *server,const char *share,
char *workgroup, int wgmaxlen,
char *username, int unmaxlen,
char *password, int pwmaxlen)
//==========================================================================
{
if (context != NULL) {
#ifdef DEPRECATED_SMBC_INTERFACE
SMBSlave *theSlave = (SMBSlave*) smbc_getOptionUserData(context);
#else
SMBSlave *theSlave = (SMBSlave*)smbc_option_get(context, "user_data");
#endif
theSlave->auth_smbc_get_data(server, share,
workgroup,wgmaxlen,
username, unmaxlen,
password, pwmaxlen);
}
}
//--------------------------------------------------------------------------
void SMBSlave::auth_smbc_get_data(const char *server,const char *share,
char *workgroup, int wgmaxlen,
char *username, int unmaxlen,
char *password, int pwmaxlen)
//--------------------------------------------------------------------------
{
//check this to see if we "really" need to authenticate...
SMBUrlType t = m_current_url.getType();
if( t == SMBURLTYPE_ENTIRE_NETWORK )
{
kDebug(KIO_SMB) << "we don't really need to authenticate for this top level url, returning";
return;
}
kDebug(KIO_SMB) << "AAAAAAAAAAAAAA auth_smbc_get_dat: set user=" << username << ", workgroup=" << workgroup
<< " server=" << server << ", share=" << share << endl;
QString s_server = QString::fromUtf8(server);
QString s_share = QString::fromUtf8(share);
workgroup[wgmaxlen - 1] = 0;
QString s_workgroup = QString::fromUtf8(workgroup);
username[unmaxlen - 1] = 0;
QString s_username = QString::fromUtf8(username);
password[pwmaxlen - 1] = 0;
QString s_password = QString::fromUtf8(password);
KIO::AuthInfo info;
info.url = KUrl("smb:///");
info.url.setHost(s_server);
info.url.setPath('/' + s_share);
info.username = s_username;
info.password = s_password;
kDebug(KIO_SMB) << "libsmb-auth-callback URL:" << info.url;
if ( !checkCachedAuthentication( info ) )
{
if ( m_default_user.isEmpty() )
{
// ok, we do not know the password. Let's try anonymous before we try for real
info.username = "anonymous";
info.password.clear();
}
else
{
// user defined a default username/password in kcontrol; try this
info.username = m_default_user;
info.password = m_default_password;
}
} else
kDebug(KIO_SMB) << "got password through cache";
strncpy(username, info.username.toUtf8(), unmaxlen - 1);
strncpy(password, info.password.toUtf8(), pwmaxlen - 1);
}
bool SMBSlave::checkPassword(SMBUrl &url)
{
kDebug(KIO_SMB) << "checkPassword for " << url;
KIO::AuthInfo info;
info.url = KUrl("smb:///");
info.url.setHost(url.host());
QString share = url.path();
int index = share.indexOf('/', 1);
if (index > 1)
share = share.left(index);
if (share.at(0) == '/')
share = share.mid(1);
info.url.setPath('/' + share);
info.keepPassword = true;
if ( share.isEmpty() )
info.prompt = i18n(
"<qt>Please enter authentication information for <b>%1</b></qt>" ,
url.host() );
else
info.prompt = i18n(
"Please enter authentication information for:\n"
"Server = %1\n"
"Share = %2" ,
url.host() ,
share );
info.username = url.user();
kDebug(KIO_SMB) << "call openPasswordDialog for " << info.url;
if ( openPasswordDialog(info) ) {
kDebug(KIO_SMB) << "openPasswordDialog returned " << info.username;
url.setUser(info.username);
if (info.keepPassword) {
kDebug(KIO_SMB) << "Caching info.username = " << info.username
<< ", info.url = " << info.url.prettyUrl();
cacheAuthentication(info);
}
return true;
}
kDebug(KIO_SMB) << "no value from openPasswordDialog\n";
return false;
}
//--------------------------------------------------------------------------
// Initializes the smbclient library
//
// Returns: 0 on success -1 with errno set on error
bool SMBSlave::auth_initialize_smbc()
{
SMBCCTX *smb_context = NULL;
kDebug(KIO_SMB) << "auth_initialize_smbc ";
if(m_initialized_smbc == false)
{
kDebug(KIO_SMB) << "smbc_init call";
KConfig cfg( "kioslaverc", KConfig::SimpleConfig);
int debug_level = cfg.group( "SMB" ).readEntry( "DebugLevel", 0 );
smb_context = smbc_new_context();
if (smb_context == NULL) {
SlaveBase::error(ERR_INTERNAL, i18n("libsmbclient failed to create context"));
return false;
}
#ifdef DEPRECATED_SMBC_INTERFACE // defined by libsmbclient.h of Samba 3.2
/* New libsmbclient interface of Samba 3.2 */
smbc_setDebug(smb_context, debug_level);
smbc_setFunctionAuthDataWithContext(smb_context, ::auth_smbc_get_data);
smbc_setOptionUserData(smb_context, this);
/* Enable Kerberos support */
smbc_setOptionUseKerberos(smb_context, 1);
smbc_setOptionFallbackAfterKerberos(smb_context, 1);
#else
smb_context->debug = debug_level;
smb_context->callbacks.auth_fn = NULL;
smbc_option_set(smb_context, "auth_function", (void*)::auth_smbc_get_data);
smbc_option_set(smb_context, "user_data", this);
#if defined(SMB_CTX_FLAG_USE_KERBEROS) && defined(SMB_CTX_FLAG_FALLBACK_AFTER_KERBEROS)
smb_context->flags |= SMB_CTX_FLAG_USE_KERBEROS | SMB_CTX_FLAG_FALLBACK_AFTER_KERBEROS;
#endif
#endif /* DEPRECATED_SMBC_INTERFACE */
if (!smbc_init_context(smb_context)) {
smbc_free_context(smb_context, 0);
smb_context = NULL;
SlaveBase::error(ERR_INTERNAL, i18n("libsmbclient failed to initialize context"));
return false;
}
smbc_set_context(smb_context);
m_initialized_smbc = true;
}
return true;
}

View file

@ -1,451 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_browse.cpp
//
// Abstract: member function implementations for SMBSlave that deal with
// SMB browsing
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include <pwd.h>
#include <grp.h>
#include <kglobal.h>
#include "kio_smb.h"
#include "kio_smb_internal.h"
using namespace KIO;
int SMBSlave::cache_stat(const SMBUrl &url, struct stat* st )
{
int cacheStatErr;
int result = smbc_stat( url.toSmbcUrl(), st);
if (result == 0){
cacheStatErr = 0;
} else {
cacheStatErr = errno;
}
kDebug(KIO_SMB) << "size " << (KIO::filesize_t)st->st_size;
return cacheStatErr;
}
//---------------------------------------------------------------------------
bool SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry, bool ignore_errors)
// Returns: true on success, false on failure
{
SMBUrl url = _url;
int cacheStatErr = cache_stat(url, &st);
if(cacheStatErr == 0)
{
if(!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode))
{
kDebug(KIO_SMB) << "mode: "<< st.st_mode;
warning(i18n("%1:\n"
"Unknown file type, neither directory or file.", url.prettyUrl()));
return false;
}
udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, st.st_mode & S_IFMT);
udsentry.insert(KIO::UDSEntry::UDS_SIZE, st.st_size);
QString str;
uid_t uid = st.st_uid;
struct passwd *user = getpwuid( uid );
if ( user )
str = user->pw_name;
else
str = QString::number( uid );
udsentry.insert(KIO::UDSEntry::UDS_USER, str);
gid_t gid = st.st_gid;
struct group *grp = getgrgid( gid );
if ( grp )
str = grp->gr_name;
else
str = QString::number( gid );
udsentry.insert(KIO::UDSEntry::UDS_GROUP, str);
udsentry.insert(KIO::UDSEntry::UDS_ACCESS, st.st_mode & 07777);
udsentry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, st.st_mtime);
udsentry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, st.st_atime);
// No, st_ctime is not UDS_CREATION_TIME...
}
else
{
if (!ignore_errors) {
if (cacheStatErr == EPERM || cacheStatErr == EACCES)
if (checkPassword(url)) {
redirection( url );
return false;
}
reportError(url, cacheStatErr);
} else if (cacheStatErr == ENOENT || cacheStatErr == ENOTDIR) {
warning(i18n("File does not exist: %1", url.url()));
}
kDebug(KIO_SMB) << "ERROR!!";
return false;
}
return true;
}
//===========================================================================
void SMBSlave::stat( const KUrl& kurl )
{
kDebug(KIO_SMB) << kurl;
// make a valid URL
KUrl url = checkURL(kurl);
// if URL is not valid we have to redirect to correct URL
if (url != kurl)
{
kDebug() << "redirection " << url;
redirection(url);
finished();
return;
}
m_current_url = url;
UDSEntry udsentry;
// Set name
udsentry.insert( KIO::UDSEntry::UDS_NAME, kurl.fileName() );
switch(m_current_url.getType())
{
case SMBURLTYPE_UNKNOWN:
error(ERR_MALFORMED_URL,m_current_url.prettyUrl());
return;
case SMBURLTYPE_ENTIRE_NETWORK:
case SMBURLTYPE_WORKGROUP_OR_SERVER:
udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
break;
case SMBURLTYPE_SHARE_OR_PATH:
if (browse_stat_path(m_current_url, udsentry, false))
break;
else {
kDebug(KIO_SMB) << "ERROR!!";
finished();
return;
}
default:
kDebug(KIO_SMB) << "UNKNOWN " << url;
finished();
return;
}
statEntry(udsentry);
finished();
}
//===========================================================================
// TODO: complete checking
KUrl SMBSlave::checkURL(const KUrl& kurl) const
{
kDebug(KIO_SMB) << "checkURL " << kurl;
QString surl = kurl.url();
if (surl.startsWith(QLatin1String("smb:/"))) {
if (surl.length() == 5) // just the above
return kurl; // unchanged
if (surl.at(5) != '/') {
surl = "smb://" + surl.mid(5);
kDebug(KIO_SMB) << "checkURL return1 " << surl << " " << KUrl(surl);
return KUrl(surl);
}
}
// smb:/ normaly have no userinfo
// we must redirect ourself to remove the username and password
if (surl.contains('@') && !surl.contains("smb://")) {
KUrl url(kurl);
url.setPath('/'+kurl.url().right( kurl.url().length()-kurl.url().indexOf('@') -1));
QString userinfo = kurl.url().mid(5, kurl.url().indexOf('@')-5);
if(userinfo.contains(':')) {
url.setUser(userinfo.left(userinfo.indexOf(':')));
url.setPass(userinfo.right(userinfo.length()-userinfo.indexOf(':')-1));
} else {
url.setUser(userinfo);
}
kDebug(KIO_SMB) << "checkURL return2 " << url;
return url;
}
// no emtpy path
KUrl url(kurl);
if (url.path().isEmpty())
url.setPath("/");
kDebug(KIO_SMB) << "checkURL return3 " << url;
return url;
}
void SMBSlave::reportError(const SMBUrl &url, const int &errNum)
{
kDebug(KIO_SMB) << "errNum" << errNum;
switch(errNum)
{
case ENOENT:
if (url.getType() == SMBURLTYPE_ENTIRE_NETWORK)
error( ERR_SLAVE_DEFINED, i18n("Unable to find any workgroups in your local network. This might be caused by an enabled firewall."));
else
error( ERR_DOES_NOT_EXIST, url.prettyUrl());
break;
#ifdef ENOMEDIUM
case ENOMEDIUM:
error( ERR_SLAVE_DEFINED,
i18n( "No media in device for %1", url.prettyUrl() ) );
break;
#endif
#ifdef EHOSTDOWN
case EHOSTDOWN:
#endif
case ECONNREFUSED:
error( ERR_SLAVE_DEFINED,
i18n( "Could not connect to host for %1", url.prettyUrl() ) );
break;
case ENOTDIR:
error( ERR_CANNOT_ENTER_DIRECTORY, url.prettyUrl());
break;
case EFAULT:
case EINVAL:
error( ERR_DOES_NOT_EXIST, url.prettyUrl());
break;
case EPERM:
case EACCES:
error( ERR_ACCESS_DENIED, url.prettyUrl() );
break;
case EIO:
case ENETUNREACH:
if ( url.getType() == SMBURLTYPE_ENTIRE_NETWORK || url.getType() == SMBURLTYPE_WORKGROUP_OR_SERVER )
error( ERR_SLAVE_DEFINED, i18n( "Error while connecting to server responsible for %1", url.prettyUrl() ) );
else
error( ERR_CONNECTION_BROKEN, url.prettyUrl());
break;
case ENOMEM:
error( ERR_OUT_OF_MEMORY, url.prettyUrl() );
break;
case ENODEV:
error( ERR_SLAVE_DEFINED, i18n("Share could not be found on given server"));
break;
case EBADF:
error( ERR_INTERNAL, i18n("BAD File descriptor"));
break;
case ETIMEDOUT:
error( ERR_SERVER_TIMEOUT, url.host() );
break;
#ifdef ENOTUNIQ
case ENOTUNIQ:
error( ERR_SLAVE_DEFINED, i18n( "The given name could not be resolved to a unique server. "
"Make sure your network is setup without any name conflicts "
"between names used by Windows and by UNIX name resolution." ) );
break;
#endif
case 0: // success
error( ERR_INTERNAL, i18n("libsmbclient reported an error, but did not specify "
"what the problem is. This might indicate a severe problem "
"with your network - but also might indicate a problem with "
"libsmbclient.\n"
"If you want to help us, please provide a tcpdump of the "
"network interface while you try to browse (be aware that "
"it might contain private data, so do not post it if you are "
"unsure about that - you can send it privately to the developers "
"if they ask for it)") );
break;
default:
error( ERR_INTERNAL, i18n("Unknown error condition in stat: %1", QString::fromLocal8Bit( strerror(errNum))) );
}
}
//===========================================================================
void SMBSlave::listDir( const KUrl& kurl )
{
kDebug(KIO_SMB) << kurl;
int errNum = 0;
// check (correct) URL
KUrl url = checkURL(kurl);
// if URL is not valid we have to redirect to correct URL
if (url != kurl)
{
redirection(url);
finished();
return;
}
m_current_url = kurl;
int dirfd;
struct smbc_dirent *dirp = NULL;
UDSEntry udsentry;
dirfd = smbc_opendir( m_current_url.toSmbcUrl() );
if (dirfd > 0){
errNum = 0;
} else {
errNum = errno;
}
kDebug(KIO_SMB) << "open " << m_current_url.toSmbcUrl() << " " << m_current_url.getType() << " " << dirfd;
if(dirfd >= 0)
{
do {
kDebug(KIO_SMB) << "smbc_readdir ";
dirp = smbc_readdir(dirfd);
if(dirp == 0)
break;
// Set name
QString udsName;
const QString dirpName = QString::fromUtf8( dirp->name );
// We cannot trust dirp->commentlen has it might be with or without the NUL character
// See KDE bug #111430 and Samba bug #3030
const QString comment = QString::fromUtf8( dirp->comment );
if ( dirp->smbc_type == SMBC_SERVER || dirp->smbc_type == SMBC_WORKGROUP ) {
udsName = dirpName.toLower();
udsName[0] = dirpName.at( 0 ).toUpper();
if ( !comment.isEmpty() && dirp->smbc_type == SMBC_SERVER )
udsName += " (" + comment + ')';
} else
udsName = dirpName;
kDebug(KIO_SMB) << "dirp->name " << dirp->name << " " << dirpName << " '" << comment << "'" << " " << dirp->smbc_type;
udsentry.insert( KIO::UDSEntry::UDS_NAME, udsName );
// Mark all administrative shares, e.g ADMIN$, as hidden. #197903
if (dirpName.endsWith(QLatin1Char('$'))) {
//kDebug(KIO_SMB) << dirpName << "marked as hidden";
udsentry.insert(KIO::UDSEntry::UDS_HIDDEN, 1);
}
if (udsName == "." || udsName == "..")
{
// fprintf(stderr,"----------- hide: -%s-\n",dirp->name);
// do nothing and hide the hidden shares
}
else if(dirp->smbc_type == SMBC_FILE)
{
// Set stat information
m_current_url.addPath(dirpName);
browse_stat_path(m_current_url, udsentry, true);
m_current_url.cd("..");
// Call base class to list entry
listEntry(udsentry, false);
}
else if(dirp->smbc_type == SMBC_DIR)
{
m_current_url.addPath(dirpName);
browse_stat_path(m_current_url, udsentry, true);
m_current_url.cd("..");
// Call base class to list entry
listEntry(udsentry, false);
}
else if(dirp->smbc_type == SMBC_SERVER ||
dirp->smbc_type == SMBC_FILE_SHARE)
{
// Set type
udsentry.insert( KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR );
// Set permissions
udsentry.insert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH));
if (dirp->smbc_type == SMBC_SERVER) {
// QString workgroup = m_current_url.host().toUpper();
KUrl u("smb:/");
u.setHost(dirpName);
// when libsmbclient knows
// u = QString("smb://%1?WORKGROUP=%2").arg(dirpName).arg(workgroup.toUpper());
kDebug(KIO_SMB) << "list item " << u;
udsentry.insert(KIO::UDSEntry::UDS_URL, u.url());
udsentry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QString::fromLatin1("application/x-smb-server"));
}
// Call base class to list entry
listEntry(udsentry, false);
}
else if(dirp->smbc_type == SMBC_WORKGROUP)
{
// Set type
udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
// Set permissions
udsentry.insert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH));
udsentry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QString::fromLatin1("application/x-smb-workgroup"));
// QString workgroup = m_current_url.host().toUpper();
KUrl u("smb:/");
u.setHost(dirpName);
udsentry.insert(KIO::UDSEntry::UDS_URL, u.url());
// Call base class to list entry
listEntry(udsentry, false);
}
else
{
kDebug(KIO_SMB) << "SMBC_UNKNOWN :" << dirpName;
// TODO: we don't handle SMBC_IPC_SHARE, SMBC_PRINTER_SHARE
// SMBC_LINK, SMBC_COMMS_SHARE
//SlaveBase::error(ERR_INTERNAL, TEXT_UNSUPPORTED_FILE_TYPE);
// continue;
}
udsentry.clear();
} while (dirp); // checked already in the head
// clean up
smbc_closedir(dirfd);
}
else
{
if (errNum == EPERM || errNum == EACCES) {
if (checkPassword(m_current_url)) {
redirection( m_current_url );
finished();
return;
}
}
reportError(m_current_url, errNum);
return;
}
listEntry(udsentry, true);
finished();
}

View file

@ -1,65 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_config.cpp
//
// Abstract: member function implementations for SMBSlave that deal with
// KDE/SMB slave configuration
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include "kio_smb.h"
#include "kio_smb_internal.h"
#include <kconfig.h>
#include <kconfiggroup.h>
#include <QTextCodec>
//===========================================================================
void SMBSlave::reparseConfiguration()
{
KConfig cfg("kioslaverc", KConfig::NoGlobals);
const KConfigGroup group = cfg.group("Browser Settings/SMBro");
m_default_user = group.readEntry("User");
// m_default_workgroup=group.readEntry("Workgroup");
// m_showHiddenShares=group.readEntry("ShowHiddenShares", QVariant(false)).toBool();
QString m_encoding = QTextCodec::codecForLocale()->name();
m_default_encoding = group.readEntry( "Encoding", m_encoding.toLower() );
// unscramble, taken from Nicola Brodu's smb ioslave
//not really secure, but better than storing the plain password
QString scrambled = group.readEntry( "Password" );
m_default_password = "";
for (int i=0; i<scrambled.length()/3; i++)
{
QChar qc1 = scrambled[i*3];
QChar qc2 = scrambled[i*3+1];
QChar qc3 = scrambled[i*3+2];
unsigned int a1 = qc1.toLatin1() - '0';
unsigned int a2 = qc2.toLatin1() - 'A';
unsigned int a3 = qc3.toLatin1() - '0';
unsigned int num = ((a1 & 0x3F) << 10) | ((a2& 0x1F) << 5) | (a3 & 0x1F);
m_default_password[i] = QChar((uchar)((num - 17) ^ 173)); // restore
}
}

View file

@ -1,794 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_dir.cpp
//
// Abstract: member function implementations for SMBSlave that deal with
// SMB directory access
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
////---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include "kio_smb.h"
#include "kio_smb_internal.h"
#include <QFile>
#include <QFileInfo>
#include <QDateTime>
#include <kde_file.h>
#include <kconfiggroup.h>
#include <kdeversion.h>
#include <kio/ioslave_defaults.h>
//===========================================================================
void SMBSlave::copy(const KUrl& src, const KUrl& dst, int permissions, KIO::JobFlags flags)
{
const bool isSourceLocal = src.isLocalFile();
const bool isDestinationLocal = dst.isLocalFile();
if (!isSourceLocal && isDestinationLocal) {
smbCopyGet(src, dst, permissions, flags);
} else if (isSourceLocal && !isDestinationLocal) {
smbCopyPut(src, dst, permissions, flags);
} else {
smbCopy(src, dst, permissions, flags);
}
}
void SMBSlave::smbCopy(const KUrl& ksrc, const KUrl& kdst, int permissions, KIO::JobFlags flags)
{
SMBUrl src;
SMBUrl dst;
mode_t initialmode;
ssize_t n;
int dstflags;
int srcfd = -1;
int dstfd = -1;
int errNum = 0;
KIO::filesize_t processed_size = 0;
unsigned char buf[MAX_XFER_BUF_SIZE];
kDebug(KIO_SMB) << "SMBSlave::copy with src = " << ksrc << "and dest = " << kdst;
// setup urls
src = ksrc;
dst = kdst;
// Obtain information about source
errNum = cache_stat(src, &st );
if( errNum != 0 )
{
if ( errNum == EACCES )
{
error( KIO::ERR_ACCESS_DENIED, src.prettyUrl());
}
else
{
error( KIO::ERR_DOES_NOT_EXIST, src.prettyUrl());
}
return;
}
if ( S_ISDIR( st.st_mode ) )
{
error( KIO::ERR_IS_DIRECTORY, src.prettyUrl() );
return;
}
totalSize(st.st_size);
// Check to se if the destination exists
errNum = cache_stat(dst, &st);
if( errNum == 0 )
{
if(S_ISDIR(st.st_mode))
{
error( KIO::ERR_DIR_ALREADY_EXIST, dst.prettyUrl());
return;
}
if(!(flags & KIO::Overwrite))
{
error( KIO::ERR_FILE_ALREADY_EXIST, dst.prettyUrl());
return;
}
}
// Open the source file
srcfd = smbc_open(src.toSmbcUrl(), O_RDONLY, 0);
if (srcfd < 0){
errNum = errno;
} else {
errNum = 0;
}
if(srcfd < 0)
{
if(errNum == EACCES)
{
error( KIO::ERR_ACCESS_DENIED, src.prettyUrl() );
}
else
{
error( KIO::ERR_DOES_NOT_EXIST, src.prettyUrl() );
}
return;
}
// Determine initial creation mode
if(permissions != -1)
{
initialmode = permissions | S_IWUSR;
}
else
{
initialmode = 0 | S_IWUSR;//0666;
}
// Open the destination file
dstflags = O_CREAT | O_TRUNC | O_WRONLY;
if(!(flags & KIO::Overwrite))
{
dstflags |= O_EXCL;
}
dstfd = smbc_open(dst.toSmbcUrl(), dstflags, initialmode);
if (dstfd < 0){
errNum = errno;
} else {
errNum = 0;
}
if(dstfd < 0)
{
if(errNum == EACCES)
{
error(KIO::ERR_WRITE_ACCESS_DENIED, dst.prettyUrl());
}
else
{
error(KIO::ERR_CANNOT_OPEN_FOR_READING, dst.prettyUrl());
}
if(srcfd >= 0 )
{
smbc_close(srcfd);
}
return;
}
// Perform copy
while(1)
{
n = smbc_read(srcfd, buf, MAX_XFER_BUF_SIZE );
if(n > 0)
{
n = smbc_write(dstfd, buf, n);
if(n == -1)
{
kDebug(KIO_SMB) << "SMBSlave::copy copy now KIO::ERR_COULD_NOT_WRITE";
error( KIO::ERR_COULD_NOT_WRITE, dst.prettyUrl());
break;
}
processed_size += n;
processedSize(processed_size);
}
else if(n == 0)
{
break; // finished
}
else
{
error( KIO::ERR_COULD_NOT_READ, src.prettyUrl());
break;
}
}
// FINISHED:
if(srcfd >= 0 )
{
smbc_close(srcfd);
}
if(dstfd >= 0)
{
if(smbc_close(dstfd) == 0)
{
// TODO: set final permissions
}
else
{
error( KIO::ERR_COULD_NOT_WRITE, dst.prettyUrl());
return;
}
}
finished();
}
void SMBSlave::smbCopyGet(const KUrl& ksrc, const KUrl& kdst, int permissions, KIO::JobFlags flags)
{
kDebug(KIO_SMB) << "src = " << ksrc << ", dest = " << kdst;
// check if destination is ok ...
const QString dstFile = kdst.toLocalFile();
const QFileInfo dstInfo (dstFile);
if(dstInfo.exists()) {
if(dstInfo.isDir()) {
error (ERR_IS_DIRECTORY, kdst.prettyUrl());
return;
}
if(!(flags & KIO::Overwrite)) {
error(ERR_FILE_ALREADY_EXIST, kdst.prettyUrl());
return;
}
}
bool bResume = false;
const QFileInfo partInfo (dstFile + QLatin1String(".part"));
const bool bPartExists = partInfo.exists();
const bool bMarkPartial = config()->readEntry("MarkPartial", true);
if (bMarkPartial && bPartExists && partInfo.size() > 0) {
if (partInfo.isDir()) {
error(ERR_IS_DIRECTORY, partInfo.absoluteFilePath());
return;
}
bResume = canResume(partInfo.size());
}
if (bPartExists && !bResume) // get rid of an unwanted ".part" file
QFile::remove(partInfo.absoluteFilePath());
// open the output file...
QFile::OpenMode mode;
QString filename;
if (bResume) {
filename = partInfo.absoluteFilePath();
mode = QFile::WriteOnly | QFile::Append;
}
else {
filename = (bMarkPartial ? partInfo.absoluteFilePath() : dstFile);
mode = QFile::WriteOnly | QFile::Truncate;
}
QFile file (filename);
if (!bResume) {
QFile::Permissions perms;
if (permissions == -1) {
perms = QFile::ReadOwner | QFile::WriteOwner;
} else {
perms = KIO::convertPermissions(permissions | QFile::WriteOwner);
}
file.setPermissions(perms);
}
if (!file.open(mode)) {
kDebug(KIO_SMB) << "could not write to" << dstFile;
switch (file.error()) {
case QFile::OpenError:
if (bResume) {
error (ERR_CANNOT_RESUME, kdst.prettyUrl());
} else {
error(ERR_CANNOT_OPEN_FOR_WRITING, kdst.prettyUrl());
}
break;
case QFile::PermissionsError:
error(ERR_WRITE_ACCESS_DENIED, kdst.prettyUrl());
break;
default:
error(ERR_CANNOT_OPEN_FOR_WRITING, kdst.prettyUrl());
break;
}
return;
}
// setup the source urls
const SMBUrl src(ksrc);
// Obtain information about source
int errNum = cache_stat (src, &st);
if (errNum != 0) {
if (errNum == EACCES) {
error (KIO::ERR_ACCESS_DENIED, src.prettyUrl());
} else {
error (KIO::ERR_DOES_NOT_EXIST, src.prettyUrl());
}
return;
}
if (S_ISDIR( st.st_mode )) {
error (KIO::ERR_IS_DIRECTORY, src.prettyUrl());
return;
}
totalSize(st.st_size);
// Open the source file
KIO::filesize_t processed_size = 0;
int srcfd = smbc_open(src.toSmbcUrl(), O_RDONLY, 0);
if (srcfd < 0){
errNum = errno;
} else {
errNum = 0;
if (bResume) {
kDebug(KIO_SMB) << "seeking to size" << partInfo.size();
off_t offset = smbc_lseek(srcfd, partInfo.size(), SEEK_SET);
if (offset == -1) {
error(KIO::ERR_COULD_NOT_SEEK, src.prettyUrl());
smbc_close(srcfd);
return;
} else {
processed_size += offset;
}
}
}
if (srcfd < 0) {
if(errNum == EACCES) {
error( KIO::ERR_ACCESS_DENIED, src.prettyUrl() );
} else {
error( KIO::ERR_DOES_NOT_EXIST, src.prettyUrl() );
}
return;
}
// Perform the copy
char buf[MAX_XFER_BUF_SIZE];
bool isErr = false;
while (1) {
const ssize_t bytesRead = smbc_read(srcfd, buf, MAX_XFER_BUF_SIZE);
if (bytesRead <= 0) {
if (bytesRead < 0) {
error( KIO::ERR_COULD_NOT_READ, src.prettyUrl());
isErr = true;
}
break;
}
const qint64 bytesWritten = file.write(buf, bytesRead);
if (bytesWritten == -1) {
kDebug(KIO_SMB) << "copy now KIO::ERR_COULD_NOT_WRITE";
error( KIO::ERR_COULD_NOT_WRITE, kdst.prettyUrl());
isErr = true;
break;
}
processed_size += bytesWritten;
processedSize(processed_size);
}
// FINISHED
smbc_close(srcfd);
// Handle error condition.
if (isErr) {
const QString sPart = partInfo.absoluteFilePath();
if (bMarkPartial) {
const int size = config()->readEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE);
if (partInfo.size() < size) {
QFile::remove(sPart);
}
}
return;
}
// Rename partial file to its original name.
if (bMarkPartial) {
const QString sPart = partInfo.absoluteFilePath();
// Remove old dest file if it exists..
if (dstInfo.exists()) {
QFile::remove(dstFile);
}
if (!QFile::rename(sPart, dstFile)) {
kDebug(KIO_SMB) << "failed to rename" << sPart << "to" << dstFile;
error(ERR_CANNOT_RENAME_PARTIAL, sPart);
return;
}
}
#if KDE_VERSION < KDE_MAKE_VERSION(4,11,80)
if (permissions != -1 && !bResume) {
if (KDE::chmod(dstFile, permissions) < 0) {
kWarning(KIO_SMB) << "failed to set permission on" << dstFile;
}
}
#endif
// Restore the mtime on the file.
const QString mtimeStr = metaData("modified");
kDebug(KIO_SMB) << "modified:" << mtimeStr;
if (!mtimeStr.isEmpty()) {
QDateTime dt = QDateTime::fromString(mtimeStr, Qt::ISODate);
if (dt.isValid()) {
struct utimbuf utbuf;
utbuf.actime = QFileInfo(file).lastRead().toTime_t(); // access time, unchanged
utbuf.modtime = dt.toTime_t(); // modification time
KDE::utime(dstFile, &utbuf);
}
}
finished();
}
void SMBSlave::smbCopyPut(const KUrl& ksrc, const KUrl& kdst, int permissions, KIO::JobFlags flags)
{
kDebug(KIO_SMB) << "src = " << ksrc << ", dest = " << kdst;
QFile srcFile (ksrc.toLocalFile());
const QFileInfo srcInfo (srcFile);
if (srcInfo.exists()) {
if (srcInfo.isDir()) {
error(KIO::ERR_IS_DIRECTORY, ksrc.prettyUrl());
return;
}
} else {
error(KIO::ERR_DOES_NOT_EXIST, ksrc.prettyUrl());
return;
}
if (!srcFile.open(QFile::ReadOnly)) {
kDebug(KIO_SMB) << "could not read from" << ksrc;
switch (srcFile.error()) {
case QFile::PermissionsError:
error(KIO::ERR_WRITE_ACCESS_DENIED, ksrc.prettyUrl());
break;
case QFile::OpenError:
default:
error(KIO::ERR_CANNOT_OPEN_FOR_READING, ksrc.prettyUrl());
break;
}
return;
}
totalSize(static_cast<filesize_t>(srcInfo.size()));
bool bResume = false;
bool bPartExists = false;
const bool bMarkPartial = config()->readEntry("MarkPartial", true);
const SMBUrl dstOrigUrl (kdst);
if (bMarkPartial) {
const int errNum = cache_stat(dstOrigUrl.partUrl(), &st);
bPartExists = (errNum == 0);
if (bPartExists) {
if (!(flags & KIO::Overwrite) && !(flags & KIO::Resume)) {
bResume = canResume(st.st_size);
} else {
bResume = (flags & KIO::Resume);
}
}
}
int dstfd = -1;
int errNum = cache_stat(dstOrigUrl, &st);
if (errNum == 0 && !(flags & KIO::Overwrite) && !(flags & KIO::Resume)) {
if (S_ISDIR(st.st_mode)) {
error( KIO::ERR_IS_DIRECTORY, dstOrigUrl.prettyUrl());
} else {
error( KIO::ERR_FILE_ALREADY_EXIST, dstOrigUrl.prettyUrl());
}
return;
}
KIO::filesize_t processed_size = 0;
const SMBUrl dstUrl(bMarkPartial ? dstOrigUrl.partUrl() : dstOrigUrl);
if (bResume) {
// append if resuming
kDebug(KIO_SMB) << "resume" << dstUrl;
dstfd = smbc_open(dstUrl.toSmbcUrl(), O_RDWR, 0 );
if (dstfd < 0) {
errNum = errno;
} else {
const off_t offset = smbc_lseek(dstfd, 0, SEEK_END);
if (offset == (off_t)-1) {
error(KIO::ERR_COULD_NOT_SEEK, dstUrl.prettyUrl());
smbc_close(dstfd);
return;
} else {
processed_size = offset;
}
}
} else {
mode_t mode;
if (permissions == -1) {
mode = 600;
} else {
mode = permissions | S_IRUSR | S_IWUSR;
}
kDebug(KIO_SMB) << "NO resume" << dstUrl;
dstfd = smbc_open(dstUrl.toSmbcUrl(), O_CREAT | O_TRUNC | O_WRONLY, mode);
if (dstfd < 0) {
errNum = errno;
}
}
if (dstfd < 0) {
if (errNum == EACCES) {
kDebug(KIO_SMB) << "access denied";
error( KIO::ERR_WRITE_ACCESS_DENIED, dstUrl.prettyUrl());
}
else {
kDebug(KIO_SMB) << "can not open for writing";
error( KIO::ERR_CANNOT_OPEN_FOR_WRITING, dstUrl.prettyUrl());
}
return;
}
bool isErr = false;
if (processed_size == 0 || srcFile.seek(processed_size)) {
// Perform the copy
char buf[MAX_XFER_BUF_SIZE];
while (1) {
const ssize_t bytesRead = srcFile.read(buf, MAX_XFER_BUF_SIZE);
if (bytesRead <= 0) {
if (bytesRead < 0) {
error(KIO::ERR_COULD_NOT_READ, ksrc.prettyUrl());
isErr = true;
}
break;
}
const qint64 bytesWritten = smbc_write(dstfd, buf, bytesRead);
if (bytesWritten == -1) {
error(KIO::ERR_COULD_NOT_WRITE, kdst.prettyUrl());
isErr = true;
break;
}
processed_size += bytesWritten;
processedSize(processed_size);
}
} else {
isErr = true;
error(KIO::ERR_COULD_NOT_SEEK, ksrc.prettyUrl());
}
// FINISHED
if (smbc_close(dstfd) < 0) {
kDebug(KIO_SMB) << dstUrl << "could not write";
error( KIO::ERR_COULD_NOT_WRITE, dstUrl.prettyUrl());
return;
}
// Handle error condition.
if (isErr) {
if (bMarkPartial) {
const int size = config()->readEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE);
const int errNum = cache_stat(dstUrl, &st);
if (errNum == 0 && st.st_size < size) {
smbc_unlink(dstUrl.toSmbcUrl());
}
}
return;
}
// Rename partial file to its original name.
if (bMarkPartial) {
smbc_unlink(dstOrigUrl.toSmbcUrl());
if (smbc_rename(dstUrl.toSmbcUrl(), dstOrigUrl.toSmbcUrl()) < 0) {
kDebug(KIO_SMB) << "failed to rename" << dstUrl << "to" << dstOrigUrl << "->" << strerror(errno);
error(ERR_CANNOT_RENAME_PARTIAL, dstUrl.prettyUrl());
return;
}
}
#ifdef HAVE_UTIME_H
// set modification time
const QString mtimeStr = metaData( "modified" );
if (!mtimeStr.isEmpty() ) {
QDateTime dt = QDateTime::fromString( mtimeStr, Qt::ISODate );
if ( dt.isValid() ) {
struct utimbuf utbuf;
utbuf.actime = st.st_atime; // access time, unchanged
utbuf.modtime = dt.toTime_t(); // modification time
smbc_utime( dstUrl.toSmbcUrl(), &utbuf );
}
}
#endif
// We have done our job => finish
finished();
}
//===========================================================================
void SMBSlave::del( const KUrl &kurl, bool isfile)
{
kDebug(KIO_SMB) << kurl;
m_current_url = kurl;
int errNum = 0;
int retVal = 0;
if(isfile)
{
// Delete file
kDebug(KIO_SMB) << kurl;
retVal = smbc_unlink(m_current_url.toSmbcUrl());
if ( retVal < 0 ){
errNum = errno;
} else {
errNum = 0;
}
}
else
{
kDebug(KIO_SMB) << kurl;
// Delete directory
retVal = smbc_rmdir(m_current_url.toSmbcUrl());
if( retVal < 0 ) {
errNum = errno;
} else {
errNum = 0;
}
}
if( errNum != 0 )
{
reportError(kurl, errNum);
}
else
{
finished();
}
}
//===========================================================================
void SMBSlave::mkdir( const KUrl &kurl, int permissions )
{
kDebug(KIO_SMB) << kurl;
int errNum = 0;
int retVal = 0;
m_current_url = kurl;
retVal = smbc_mkdir(m_current_url.toSmbcUrl(), 0777);
if( retVal < 0 ){
errNum = errno;
} else {
errNum = 0;
}
if( retVal < 0 )
{
if (errNum == EEXIST) {
errNum = cache_stat(m_current_url, &st );
if (errNum == 0 && S_ISDIR(st.st_mode))
{
error( KIO::ERR_DIR_ALREADY_EXIST, m_current_url.prettyUrl());
}
else
{
error( KIO::ERR_FILE_ALREADY_EXIST, m_current_url.prettyUrl());
}
}
else
{
reportError(kurl, errNum);
}
kDebug(KIO_SMB) << "exit with error " << kurl;
}
else // success
{
if(permissions != -1)
{
// TODO enable the following when complete
//smbc_chmod( url.toSmbcUrl(), permissions );
}
finished();
}
}
//===========================================================================
void SMBSlave::rename( const KUrl& ksrc, const KUrl& kdest, KIO::JobFlags flags )
{
SMBUrl src;
SMBUrl dst;
int errNum = 0;
int retVal = 0;
kDebug(KIO_SMB) << "old name = " << ksrc << ", new name = " << kdest;
src = ksrc;
dst = kdest;
// Check to se if the destination exists
kDebug(KIO_SMB) << "stat dst";
errNum = cache_stat(dst, &st);
if( errNum == 0 )
{
if(S_ISDIR(st.st_mode))
{
kDebug(KIO_SMB) << "KIO::ERR_DIR_ALREADY_EXIST";
error( KIO::ERR_DIR_ALREADY_EXIST, dst.prettyUrl());
return;
}
if(!(flags & KIO::Overwrite))
{
kDebug(KIO_SMB) << "KIO::ERR_FILE_ALREADY_EXIST";
error( KIO::ERR_FILE_ALREADY_EXIST, dst.prettyUrl());
return;
}
}
kDebug(KIO_SMB ) << "smbc_rename " << src.toSmbcUrl() << " " << dst.toSmbcUrl();
retVal = smbc_rename(src.toSmbcUrl(), dst.toSmbcUrl());
if( retVal < 0 ){
errNum = errno;
} else {
errNum = 0;
}
if( retVal < 0 )
{
kDebug(KIO_SMB ) << "failed ";
switch(errNum)
{
case ENOENT:
errNum = cache_stat(src, &st);
if( errNum != 0 )
{
if(errNum == EACCES)
{
kDebug(KIO_SMB) << "KIO::ERR_ACCESS_DENIED";
error(KIO::ERR_ACCESS_DENIED, src.prettyUrl());
}
else
{
kDebug(KIO_SMB) << "KIO::ERR_DOES_NOT_EXIST";
error(KIO::ERR_DOES_NOT_EXIST, src.prettyUrl());
}
}
break;
case EACCES:
case EPERM:
kDebug(KIO_SMB) << "KIO::ERR_ACCESS_DENIED";
error( KIO::ERR_ACCESS_DENIED, dst.prettyUrl() );
break;
default:
kDebug(KIO_SMB) << "KIO::ERR_CANNOT_RENAME";
error( KIO::ERR_CANNOT_RENAME, src.prettyUrl() );
}
kDebug(KIO_SMB) << "exit with error";
return;
}
kDebug(KIO_SMB ) << "everything fine\n";
finished();
}

View file

@ -1,463 +0,0 @@
////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_file.cpp
//
// Abstract: member function implementations for SMBSlave that deal with
// SMB file access
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include "kio_smb.h"
#include "kio_smb_internal.h"
#include <QVarLengthArray>
#include <QDateTime>
#include <kmimetype.h>
//===========================================================================
void SMBSlave::get( const KUrl& kurl )
{
char buf[MAX_XFER_BUF_SIZE];
int filefd = 0;
int errNum = 0;
ssize_t bytesread = 0;
// time_t curtime = 0;
time_t lasttime = 0;
time_t starttime = 0;
KIO::filesize_t totalbytesread = 0;
QByteArray filedata;
SMBUrl url;
kDebug(KIO_SMB) << kurl;
// check (correct) URL
KUrl kvurl = checkURL(kurl);
// if URL is not valid we have to redirect to correct URL
if (kvurl != kurl) {
redirection(kvurl);
finished();
return;
}
if(!auth_initialize_smbc())
return;
// Stat
url = kurl;
errNum = cache_stat(url,&st);
if( errNum != 0 )
{
if ( errNum == EACCES )
error( KIO::ERR_ACCESS_DENIED, url.prettyUrl());
else
error( KIO::ERR_DOES_NOT_EXIST, url.prettyUrl());
return;
}
if ( S_ISDIR( st.st_mode ) ) {
error( KIO::ERR_IS_DIRECTORY, url.prettyUrl());
return;
}
// Set the total size
totalSize( st.st_size );
// Open and read the file
filefd = smbc_open(url.toSmbcUrl(),O_RDONLY,0);
if(filefd >= 0)
{
bool isFirstPacket = true;
lasttime = starttime = time(NULL);
while(1)
{
bytesread = smbc_read(filefd, buf, MAX_XFER_BUF_SIZE);
if(bytesread == 0)
{
// All done reading
break;
}
else if(bytesread < 0)
{
error( KIO::ERR_COULD_NOT_READ, url.prettyUrl());
return;
}
filedata = QByteArray::fromRawData(buf,bytesread);
if (isFirstPacket)
{
KMimeType::Ptr p_mimeType = KMimeType::findByNameAndContent(url.fileName(), filedata);
mimeType(p_mimeType->name());
isFirstPacket = false;
}
data( filedata );
filedata.clear();
// increment total bytes read
totalbytesread += bytesread;
processedSize(totalbytesread);
}
smbc_close(filefd);
data( QByteArray() );
processedSize(static_cast<KIO::filesize_t>(st.st_size));
}
else
{
error( KIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyUrl());
return;
}
finished();
}
//===========================================================================
void SMBSlave::open( const KUrl& kurl, QIODevice::OpenMode mode)
{
int errNum = 0;
kDebug(KIO_SMB) << kurl;
// check (correct) URL
KUrl kvurl = checkURL(kurl);
// if URL is not valid we have to redirect to correct URL
if (kvurl != kurl) {
redirection(kvurl);
finished();
return;
}
if(!auth_initialize_smbc()) {
error( KIO::ERR_ACCESS_DENIED, kurl.prettyUrl());
return;
}
// Save the URL as a private member
// FIXME For some reason m_openUrl has be be declared in bottom private
// section of the class SMBSlave declaratiom instead of the top section
// or else this assignment fails
m_openUrl = kurl;
// Stat
errNum = cache_stat(m_openUrl,&st);
if( errNum != 0 )
{
if ( errNum == EACCES )
error( KIO::ERR_ACCESS_DENIED, m_openUrl.prettyUrl());
else
error( KIO::ERR_DOES_NOT_EXIST, m_openUrl.prettyUrl());
return;
}
if ( S_ISDIR( st.st_mode ) ) {
error( KIO::ERR_IS_DIRECTORY, m_openUrl.prettyUrl());
return;
}
// Set the total size
totalSize( st.st_size );
// Convert permissions
int flags = 0;
if (mode & QIODevice::ReadOnly) {
if (mode & QIODevice::WriteOnly) {
flags = O_RDWR | O_CREAT;
} else {
flags = O_RDONLY;
}
} else if (mode & QIODevice::WriteOnly) {
flags = O_WRONLY | O_CREAT;
}
if (mode & QIODevice::Append) {
flags |= O_APPEND;
} else if (mode & QIODevice::Truncate) {
flags |= O_TRUNC;
}
// Open the file
m_openFd = smbc_open(m_openUrl.toSmbcUrl(), flags, 0);
if(m_openFd < 0)
{
error( KIO::ERR_CANNOT_OPEN_FOR_READING, m_openUrl.prettyUrl());
return;
}
// Determine the mimetype of the file to be retrieved, and emit it.
// This is mandatory in all slaves (for KRun/BrowserRun to work).
// If we're not opening the file ReadOnly or ReadWrite, don't attempt to
// read the file and send the mimetype.
if (mode & QIODevice::ReadOnly){
ssize_t bytesRequested = 1024;
ssize_t bytesRead = 0;
QVarLengthArray<char> buffer(bytesRequested);
bytesRead = smbc_read(m_openFd, buffer.data(), bytesRequested);
if(bytesRead < 0)
{
error( KIO::ERR_COULD_NOT_READ, m_openUrl.prettyUrl());
close();
return;
}
else
{
QByteArray fileData = QByteArray::fromRawData(buffer.data(),bytesRead);
KMimeType::Ptr p_mimeType = KMimeType::findByNameAndContent(m_openUrl.fileName(), fileData);
mimeType(p_mimeType->name());
off_t res = smbc_lseek(m_openFd, 0, SEEK_SET);
if (res == (off_t)-1) {
error(KIO::ERR_COULD_NOT_SEEK, m_openUrl.path());
close();
return;
}
}
}
position( 0 );
emit opened();
}
void SMBSlave::read( KIO::filesize_t bytesRequested )
{
Q_ASSERT(m_openFd != -1);
QVarLengthArray<char> buffer(bytesRequested);
ssize_t bytesRead = 0;
bytesRead = smbc_read(m_openFd, buffer.data(), bytesRequested);
Q_ASSERT(bytesRead <= static_cast<ssize_t>(bytesRequested));
if(bytesRead < 0)
{
kDebug(KIO_SMB) << "Could not read " << m_openUrl;
error( KIO::ERR_COULD_NOT_READ, m_openUrl.prettyUrl());
close();
return;
}
QByteArray fileData = QByteArray::fromRawData(buffer.data(), bytesRead);
data( fileData );
}
void SMBSlave::write(const QByteArray &fileData)
{
Q_ASSERT(m_openFd != -1);
QByteArray buf(fileData);
ssize_t size = smbc_write(m_openFd, buf.data(), buf.size());
if (size < 0)
{
kDebug(KIO_SMB) << "Could not write to " << m_openUrl;
error( KIO::ERR_COULD_NOT_WRITE, m_openUrl.prettyUrl());
close();
return;
}
written(size);
}
void SMBSlave::seek(KIO::filesize_t offset)
{
off_t res = smbc_lseek(m_openFd, static_cast<off_t>(offset), SEEK_SET);
if (res == (off_t)-1) {
error(KIO::ERR_COULD_NOT_SEEK, m_openUrl.path());
close();
} else {
kDebug( KIO_SMB ) << "res" << res;
position( res );
}
}
void SMBSlave::close()
{
smbc_close(m_openFd);
finished();
}
//===========================================================================
void SMBSlave::put( const KUrl& kurl,
int permissions,
KIO::JobFlags flags )
{
void *buf;
size_t bufsize;
m_current_url = kurl;
int filefd;
bool exists;
int errNum = 0;
off_t retValLSeek = 0;
mode_t mode;
QByteArray filedata;
kDebug(KIO_SMB) << kurl;
errNum = cache_stat(m_current_url, &st);
exists = (errNum == 0);
if ( exists && !(flags & KIO::Overwrite) && !(flags & KIO::Resume))
{
if (S_ISDIR(st.st_mode))
{
kDebug(KIO_SMB) << kurl <<" already isdir !!";
error( KIO::ERR_DIR_ALREADY_EXIST, m_current_url.prettyUrl());
}
else
{
kDebug(KIO_SMB) << kurl <<" already exist !!";
error( KIO::ERR_FILE_ALREADY_EXIST, m_current_url.prettyUrl());
}
return;
}
if (exists && !(flags & KIO::Resume) && (flags & KIO::Overwrite))
{
kDebug(KIO_SMB) << "exists try to remove " << m_current_url.toSmbcUrl();
// remove(m_current_url.url().toLocal8Bit());
}
if (flags & KIO::Resume)
{
// append if resuming
kDebug(KIO_SMB) << "resume " << m_current_url.toSmbcUrl();
filefd = smbc_open(m_current_url.toSmbcUrl(), O_RDWR, 0 );
if (filefd < 0) {
errNum = errno;
} else {
errNum = 0;
}
retValLSeek = smbc_lseek(filefd, 0, SEEK_END);
if (retValLSeek == (off_t)-1) {
errNum = errno;
} else {
errNum = 0;
}
}
else
{
if (permissions != -1)
{
mode = permissions | S_IWUSR | S_IRUSR;
}
else
{
mode = 600;//0666;
}
kDebug(KIO_SMB) << "NO resume " << m_current_url.toSmbcUrl();
filefd = smbc_open(m_current_url.toSmbcUrl(), O_CREAT | O_TRUNC | O_WRONLY, mode);
if (filefd < 0) {
errNum = errno;
} else {
errNum = 0;
}
}
if ( filefd < 0 )
{
if ( errNum == EACCES )
{
kDebug(KIO_SMB) << "error " << kurl <<" access denied !!";
error( KIO::ERR_WRITE_ACCESS_DENIED, m_current_url.prettyUrl());
}
else
{
kDebug(KIO_SMB) << "error " << kurl <<" can not open for writing !!";
error( KIO::ERR_CANNOT_OPEN_FOR_WRITING, m_current_url.prettyUrl());
}
return;
}
// Loop until we got 0 (end of data)
while(1)
{
kDebug(KIO_SMB) << "request data ";
dataReq(); // Request for data
kDebug(KIO_SMB) << "write " << m_current_url.toSmbcUrl();
if (readData(filedata) <= 0)
{
kDebug(KIO_SMB) << "readData <= 0";
break;
}
kDebug(KIO_SMB) << "write " << m_current_url.toSmbcUrl();
buf = filedata.data();
bufsize = filedata.size();
ssize_t size = smbc_write(filefd, buf, bufsize);
if ( size < 0)
{
kDebug(KIO_SMB) << "error " << kurl << "could not write !!";
error( KIO::ERR_COULD_NOT_WRITE, m_current_url.prettyUrl());
return;
}
kDebug(KIO_SMB ) << "wrote " << size;
}
kDebug(KIO_SMB) << "close " << m_current_url.toSmbcUrl();
if(smbc_close(filefd) < 0)
{
kDebug(KIO_SMB) << kurl << "could not write !!";
error( KIO::ERR_COULD_NOT_WRITE, m_current_url.prettyUrl());
return;
}
// set final permissions, if the file was just created
if ( permissions != -1 && !exists )
{
// TODO: did the smbc_chmod fail?
// TODO: put in call to chmod when it is working!
// smbc_chmod(url.toSmbcUrl(),permissions);
}
#ifdef HAVE_UTIME_H
// set modification time
const QString mtimeStr = metaData( "modified" );
if ( !mtimeStr.isEmpty() ) {
QDateTime dt = QDateTime::fromString( mtimeStr, Qt::ISODate );
if ( dt.isValid() ) {
if (cache_stat( m_current_url, &st ) == 0) {
struct utimbuf utbuf;
utbuf.actime = st.st_atime; // access time, unchanged
utbuf.modtime = dt.toTime_t(); // modification time
smbc_utime( m_current_url.toSmbcUrl(), &utbuf );
}
}
}
#endif
// We have done our job => finish
finished();
}

View file

@ -1,141 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_internal.cpp
//
// Abstract: Utility class implementation used by SMBSlave
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
//
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#include "kio_smb_internal.h"
#include "kio_smb.h"
#include <kconfig.h>
#include <kglobal.h>
//===========================================================================
// SMBUrl Function Implementation
//===========================================================================
//-----------------------------------------------------------------------
SMBUrl::SMBUrl()
{
m_type = SMBURLTYPE_UNKNOWN;
}
//-----------------------------------------------------------------------
SMBUrl::SMBUrl(const KUrl& kurl)
: KUrl(kurl)
//-----------------------------------------------------------------------
{
updateCache();
}
SMBUrl::SMBUrl(const SMBUrl& other)
: KUrl(other),
m_surl(other.m_surl),
m_type(other.m_type)
{
}
//-----------------------------------------------------------------------
void SMBUrl::addPath(const QString &filedir)
{
KUrl::addPath(filedir);
updateCache();
}
//-----------------------------------------------------------------------
bool SMBUrl::cd(const QString &filedir)
{
if (!KUrl::cd(filedir))
return false;
updateCache();
return true;
}
//-----------------------------------------------------------------------
void SMBUrl::updateCache()
//-----------------------------------------------------------------------
{
cleanPath();
// SMB URLs are UTF-8 encoded
kDebug(KIO_SMB) << "updateCache " << KUrl::path();
if ( KUrl::url() == "smb:/" )
m_surl = "smb://";
else
m_surl = KUrl::url( RemoveTrailingSlash ).toUtf8();
m_type = SMBURLTYPE_UNKNOWN;
// update m_type
(void)getType();
}
//-----------------------------------------------------------------------
SMBUrlType SMBUrl::getType() const
// Returns the type of this SMBUrl:
// SMBURLTYPE_UNKNOWN - Type could not be determined. Bad SMB Url.
// SMBURLTYPE_ENTIRE_NETWORK - "smb:/" is entire network
// SMBURLTYPE_WORKGROUP_OR_SERVER - "smb:/mygroup" or "smb:/myserver"
// SMBURLTYPE_SHARE_OR_PATH - "smb:/mygroupe/mymachine/myshare/mydir"
//-----------------------------------------------------------------------
{
if(m_type != SMBURLTYPE_UNKNOWN)
return m_type;
if (protocol() != "smb")
{
m_type = SMBURLTYPE_UNKNOWN;
return m_type;
}
if (path(KUrl::AddTrailingSlash) == "/")
{
if (host().isEmpty())
m_type = SMBURLTYPE_ENTIRE_NETWORK;
else
m_type = SMBURLTYPE_WORKGROUP_OR_SERVER;
return m_type;
}
// Check for the path if we get this far
m_type = SMBURLTYPE_SHARE_OR_PATH;
return m_type;
}
SMBUrl SMBUrl::partUrl() const
{
if (m_type == SMBURLTYPE_SHARE_OR_PATH && !fileName().isEmpty()) {
SMBUrl url (*this);
url.setFileName(fileName() + QLatin1String(".part"));
return url;
}
return SMBUrl();
}

View file

@ -1,127 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB kioslave for KDE2
//
// File: kio_smb_internal.h
//
// Abstract: Utility classes used by SMBSlave
//
// Author(s): Matthew Peterson <mpeterson@caldera.com>
// Frank Schwanz <schwanz@fh-brandenburg.de>
//---------------------------------------------------------------------------
//
// Copyright (c) 2000 Caldera Systems, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING. If not, please obtain
// a copy from http://www.gnu.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////////////////////////
#ifndef KIO_SMB_INTERNAL_H_INCLUDED
#define KIO_SMB_INTERNAL_H_INCLUDED
#include <kio/authinfo.h>
//Added by qt3to4:
#include <QByteArray>
/**
* Types of a SMBURL :
* SMBURLTYPE_UNKNOWN - Type could not be determined. Bad SMB Url.
* SMBURLTYPE_ENTIRE_NETWORK - "smb:/" is entire network
* SMBURLTYPE_WORKGROUP_OR_SERVER - "smb:/mygroup" or "smb:/myserver"
* URLTYPE_SHARE_OR_PATH - "smb:/mygroupe/mymachine/myshare/mydir"
*/
enum SMBUrlType {
SMBURLTYPE_UNKNOWN = 0, SMBURLTYPE_ENTIRE_NETWORK = 1,
SMBURLTYPE_WORKGROUP_OR_SERVER = 2, SMBURLTYPE_SHARE_OR_PATH = 3
};
//===========================================================================
/**
* Class to handle URL's
* it can convert KUrl to smbUrl
* and Handle UserInfo
* it also check the correctness of the URL
*/
class SMBUrl : public KUrl
{
public:
SMBUrl();
SMBUrl(const SMBUrl&);
SMBUrl(const KUrl & kurl);
/**
* Appends the specified file and dir to this SMBUrl
* "smb://server/share" --> "smb://server/share/filedir"
*/
void addPath(const QString &filedir);
bool cd(const QString &dir);
/**
* Returns the type of this SMBUrl:
* SMBURLTYPE_UNKNOWN - Type could not be determined. Bad SMB Url.
* SMBURLTYPE_ENTIRE_NETWORK - "smb:/" is entire network
* SMBURLTYPE_WORKGROUP_OR_SERVER - "smb:/mygroup" or "smb:/myserver"
* URLTYPE_SHARE_OR_PATH - "smb:/mygroupe/mymachine/myshare/mydir"
*/
SMBUrlType getType() const;
void setPass( const QString& _txt ) { KUrl::setPass(_txt); updateCache(); }
void setUser( const QString& _txt ) { KUrl::setUser(_txt); updateCache(); }
void setHost( const QString& _txt ) { KUrl::setHost(_txt); updateCache(); }
void setFileName(const QString& _txt) { KUrl::setFileName(_txt); updateCache(); }
/**
* Returns the workgroup if it given in url
*/
// QString getWorkgroup() const;
/**
* Returns path after workgroup
*/
// QString getServerShareDir() const;
/**
* Return a URL that is suitable for libsmbclient
*/
QByteArray toSmbcUrl() const { return m_surl; }
/**
* Returns the partial URL.
*/
SMBUrl partUrl() const;
private:
/**
* Change from QString to QCString (MS Windows's character encoding)
*/
QByteArray fromUnicode( const QString &_str ) const;
void updateCache();
QByteArray m_surl;
/**
* Type of URL
* @see _SMBUrlType
*/
mutable SMBUrlType m_type;
};
#endif

View file

@ -1,191 +0,0 @@
/* This file is part of the KDE project
Copyright (C) 2000 Alexander Neundorf <neundorf@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kio_smb.h"
#include <kstandarddirs.h>
#include <unistd.h>
#include <QByteArray>
#include <QDir>
#include <QProcess>
#include <kshell.h>
void SMBSlave::special( const QByteArray & data)
{
kDebug(KIO_SMB)<<"Smb::special()";
int tmp;
QDataStream stream(data);
stream >> tmp;
//mounting and umounting are both blocking, "guarded" by a SIGALARM in the future
switch (tmp)
{
case 1:
case 3:
{
QString remotePath, mountPoint, user;
stream >> remotePath >> mountPoint;
QStringList sl=remotePath.split('/');
QString share,host;
if (sl.count()>=2)
{
host=sl.at(0).mid(2);
share=sl.at(1);
kDebug(KIO_SMB)<<"special() host -"<< host <<"- share -" << share <<"-";
}
remotePath.replace('\\', '/'); // smbmounterplugin sends \\host/share
kDebug(KIO_SMB) << "mounting: " << remotePath.toLocal8Bit() << " to " << mountPoint.toLocal8Bit();
if (tmp==3) {
if (!KStandardDirs::makeDir(mountPoint)) {
error(KIO::ERR_COULD_NOT_MKDIR, mountPoint);
return;
}
}
SMBUrl smburl(KUrl("smb:///"));
smburl.setHost(host);
smburl.setPath('/' + share);
if ( !checkPassword(smburl) )
{
finished();
return;
}
// using smbmount instead of "mount -t smbfs", because mount does not allow a non-root
// user to do a mount, but a suid smbmnt does allow this
QProcess proc;
proc.setProcessChannelMode(QProcess::SeparateChannels);
QStringList procArgs;
QString options;
if ( smburl.user().isEmpty() )
{
user = "guest";
options = "guest";
}
else
{
options = "username=" + smburl.user();
user = smburl.user();
if ( ! smburl.pass().isEmpty() )
options += ",password=" + smburl.pass();
}
// TODO: check why the control center uses encodings with a blank char, e.g. "cp 1250"
//if ( ! m_default_encoding.isEmpty() )
//options += ",codepage=" + KShell::quoteArg(m_default_encoding);
procArgs << remotePath;
procArgs << mountPoint;
procArgs << "-o" << options;
proc.start("smbmount", procArgs);
if (!proc.waitForFinished())
{
error(KIO::ERR_CANNOT_LAUNCH_PROCESS,
"smbmount"+i18n("\nMake sure that the samba package is installed properly on your system."));
return;
}
QString mybuf = QString::fromLocal8Bit(proc.readAllStandardOutput());
QString mystderr = QString::fromLocal8Bit(proc.readAllStandardError());
kDebug(KIO_SMB) << "mount exit " << proc.exitCode()
<< "stdout:" << mybuf << endl << "stderr:" << mystderr << endl;
if (proc.exitCode() != 0)
{
error( KIO::ERR_COULD_NOT_MOUNT,
i18n("Mounting of share \"%1\" from host \"%2\" by user \"%3\" failed.\n%4",
share, host, user, mybuf + '\n' + mystderr));
return;
}
finished();
}
break;
case 2:
case 4:
{
QString mountPoint;
stream >> mountPoint;
QProcess proc;
proc.setProcessChannelMode(QProcess::SeparateChannels);
proc.start("smbumount", QStringList() << mountPoint);
if ( !proc.waitForFinished() )
{
error(KIO::ERR_CANNOT_LAUNCH_PROCESS,
"smbumount"+i18n("\nMake sure that the samba package is installed properly on your system."));
return;
}
QString mybuf = QString::fromLocal8Bit(proc.readAllStandardOutput());
QString mystderr = QString::fromLocal8Bit(proc.readAllStandardError());
kDebug(KIO_SMB) << "smbumount exit " << proc.exitCode()
<< "stdout:" << mybuf << endl << "stderr:" << mystderr << endl;
if (proc.exitCode() != 0)
{
error(KIO::ERR_COULD_NOT_UNMOUNT,
i18n("Unmounting of mountpoint \"%1\" failed.\n%2",
mountPoint, mybuf + '\n' + mystderr));
return;
}
if ( tmp == 4 )
{
bool ok;
QDir dir(mountPoint);
dir.cdUp();
ok = dir.rmdir(mountPoint);
if ( ok )
{
QString p=dir.path();
dir.cdUp();
ok = dir.rmdir(p);
}
if ( !ok )
{
error(KIO::ERR_COULD_NOT_RMDIR, mountPoint);
return;
}
}
finished();
}
break;
default:
break;
}
finished();
}
#include "moc_kio_smb.cpp"

View file

@ -1,11 +0,0 @@
HOWTO get the libsmbclient built, so that you can get the new smb ioslave built...
1. Check out the samba sources from cvs with ( full directions are at: http://www.samba.org/samba/cvs.html
cvs -d :pserver:cvs@pserver.samba.org:/cvsroot login
use "cvs" as the password
cvs -z5 -d :pserver:cvs@pserver.samba.org:/cvsroot co -r SAMBA_3_0 samba/source
2. cd samba/source
3. sh autogen.sh
4. run ./configure && make
5. when compiling is done- shouldn't take more than 5-15 minutes depending on your machine,
you need to "make installclientlib installdat" - if you want all of samba, do "make install"

View file

@ -1,94 +0,0 @@
[Desktop Entry]
Icon=network-workgroup
Name=Samba Shares
Name[af]=Samba Hulpbronne
Name[ar]=مشاركات السامبا
Name[ast]=Comparticiones Samba
Name[be]=Агульныя тэчкі Samba
Name[be@latin]=Supolnyja resursy Samba
Name[bg]=Ресурси на Samba
Name[bn]=
Name[bn_IN]=Samba
Name[br]=Rannadoù Samba
Name[bs]=Samba dijeljenja
Name[ca]=Recursos compartits de Samba
Name[ca@valencia]=Recursos compartits de Samba
Name[cs]=Sdílené disky Samby
Name[csb]=Dostónczi Sambë
Name[cy]=Cydranniad Samba
Name[da]=Samba-shares
Name[de]=Samba-Freigaben
Name[el]=Κοινόχρηστοι πόροι Samba
Name[en_GB]=Samba Shares
Name[eo]=Samba-kunhavigoj
Name[es]=Recursos compartidos Samba
Name[et]=SMB jagatud ressursid
Name[eu]=Samba partekatzeak
Name[fa]=اشتراکهای سامبا
Name[fi]=Samba-jaot
Name[fr]=Partages Samba
Name[fy]=Sambanetwurk
Name[ga]=Comhranna Samba
Name[gl]=Comparticións de Samba
Name[gu]=
Name[he]=שיתופי Samba
Name[hi]=
Name[hne]=
Name[hr]=Dijeljenja u Sambi
Name[hsb]=Zhromadne zapiski a graty wot Samba
Name[hu]=Samba-megosztások
Name[ia]=Samba Shares (Areas compartite de Samba)
Name[id]=Pembagian Samba
Name[is]=Samba sameignir
Name[it]=Condivisioni Samba
Name[ja]=Samba
Name[ka]=Samba-
Name[kk]=Samba ресурстары
Name[km]= Samba
Name[kn]= ಿ ()
Name[ko]=
Name[ku]=Parvekirinên Sambayê
Name[lt]=Samba bendri diskai
Name[lv]=Samba koplietojumi
Name[mai]=
Name[mk]=Samba-заеднички
Name[ml]=ി ി
Name[mr]=
Name[ms]=Perkongsian Samba
Name[nb]=Samba-ressurser
Name[nds]=Samba-Freegaven
Name[ne]=
Name[nl]=Sambanetwerk
Name[nn]=Samba-ressursar
Name[or]=Samba
Name[pa]=
Name[pl]=Zasoby Samby
Name[pt]=Partilhas de Samba
Name[pt_BR]=Compartilhamentos do Samba
Name[ro]=Partajări Samba
Name[ru]=Общие папки Samba
Name[se]=Samba-resurssat
Name[si]=Samba
Name[sk]=Zdieľania Samby
Name[sl]=Souporabe Sambe
Name[sr]=Самба дељења
Name[sr@ijekavian]=Самба дељења
Name[sr@ijekavianlatin]=Samba deljenja
Name[sr@latin]=Samba deljenja
Name[sv]=Samba-utdelningar
Name[ta]=
Name[te]=
Name[tg]=Мубодилаи Samba
Name[th]= Samba
Name[tr]=Samba Paylaşımları
Name[ug]=Samba ھەمبەھىر
Name[uk]=Спільні ресурси Samba
Name[vi]=Chia s Samba
Name[wa]=Pårtaedjes Samba
Name[xh]=Izahlulo ze Samba
Name[x-test]=xxSamba Sharesxx
Name[zh_CN]=Samba
Name[zh_TW]=Samba
Open=false
Type=Link
URL=smb:/

View file

@ -1,18 +0,0 @@
[Protocol]
exec=kio_smb
protocol=smb
input=none
output=filesystem
listing=Name,Type,Size,Date,Access,Owner,Group
reading=true
writing=true
makedir=true
deleting=true
opening=true
moving=true
copyToFile=true
copyFromFile=true
maxInstances=20
maxInstancesPerHost=5
X-DocPath=kioslave/smb/index.html
Icon=network-workgroup

View file

@ -1,4 +1,2 @@
- add a browser for SMB?
- plugin / desktop file interface for adding more protocols - plugin / desktop file interface for adding more protocols
- integrate kdnssd? - integrate kdnssd?

View file

@ -44,8 +44,6 @@ KNetAttach::KNetAttach( QWidget* parent )
_ftp->setEnabled(KProtocolInfo::isKnownProtocol("ftp")); _ftp->setEnabled(KProtocolInfo::isKnownProtocol("ftp"));
_sftp->setEnabled(KProtocolInfo::isKnownProtocol("sftp")); _sftp->setEnabled(KProtocolInfo::isKnownProtocol("sftp"));
_nfs->setEnabled(KProtocolInfo::isKnownProtocol("nfs"));
_smb->setEnabled(KProtocolInfo::isKnownProtocol("smb"));
connect(_recent, SIGNAL(toggled(bool)), _recentConnectionName, SLOT(setEnabled(bool))); connect(_recent, SIGNAL(toggled(bool)), _recentConnectionName, SLOT(setEnabled(bool)));
connect(_connectionName, SIGNAL(textChanged(QString)), this, SLOT(updateParametersPageStatus())); connect(_connectionName, SIGNAL(textChanged(QString)), this, SLOT(updateParametersPageStatus()));
@ -92,10 +90,6 @@ void KNetAttach::setInformationText(const QString &type)
text = i18n("Enter a name for this <i>File Transfer Protocol connection</i> as well as a server address and folder path to use and press the <b>Save & Connect</b> button."); text = i18n("Enter a name for this <i>File Transfer Protocol connection</i> as well as a server address and folder path to use and press the <b>Save & Connect</b> button.");
} else if (type=="SFTP") { } else if (type=="SFTP") {
text = i18n("Enter a name for this <i>SSH File Transfer Protocol</i> as well as a server address, port and folder path to use and press the <b>Save & Connect</b> button."); text = i18n("Enter a name for this <i>SSH File Transfer Protocol</i> as well as a server address, port and folder path to use and press the <b>Save & Connect</b> button.");
} else if (type=="NFS") {
text = i18n("Enter a name for this <i>Network File System</i> as well as a server address, port and folder path to use and press the <b>Save & Connect</b> button.");
} else if (type=="SMB") {
text = i18n("Enter a name for this <i>Microsoft Windows network drive</i> as well as a server address and folder path to use and press the <b>Save & Connect</b> button.");
} }
_informationText->setText(text); _informationText->setText(text);
@ -130,16 +124,6 @@ bool KNetAttach::validateCurrentPage()
if (_path->text().isEmpty()) { if (_path->text().isEmpty()) {
_path->setText("/"); _path->setText("/");
} }
} else if (_nfs->isChecked()) {
setInformationText("NFS");
updateForProtocol("NFS");
_port->setValue(2049);
if (_path->text().isEmpty()) {
_path->setText("/");
}
} else if (_smb->isChecked()) {
setInformationText("SMB");
updateForProtocol("SMB");
} else { //if (_recent->isChecked()) { } else { //if (_recent->isChecked()) {
KConfig recent( "krecentconnections", KConfig::NoGlobals ); KConfig recent( "krecentconnections", KConfig::NoGlobals );
if (!recent.hasGroup(_recentConnectionName->currentText())) { if (!recent.hasGroup(_recentConnectionName->currentText())) {
@ -186,11 +170,6 @@ bool KNetAttach::validateCurrentPage()
} else if (_type == "SFTP") { } else if (_type == "SFTP") {
url.setProtocol("sftp"); url.setProtocol("sftp");
url.setPort(_port->value()); url.setPort(_port->value());
} else if (_type == "NFS") {
url.setProtocol("nfs");
url.setPort(_port->value());
} else if (_type == "SMB") {
url.setProtocol("smb");
} else { // recent } else { // recent
} }
@ -252,7 +231,7 @@ bool KNetAttach::validateCurrentPage()
} }
recent = KConfigGroup(&_recent,name); recent = KConfigGroup(&_recent,name);
recent.writeEntry("URL", url.prettyUrl()); recent.writeEntry("URL", url.prettyUrl());
if (_type == "FTP" || _type == "SFTP" || _type == "NFS") { if (_type == "FTP" || _type == "SFTP") {
recent.writeEntry("Port", _port->value()); recent.writeEntry("Port", _port->value());
} }
recent.writeEntry("Type", _type); recent.writeEntry("Type", _type);
@ -289,20 +268,6 @@ bool KNetAttach::updateForProtocol(const QString& protocol)
_user->show(); _user->show();
_encodingText->hide(); _encodingText->hide();
_encoding->hide(); _encoding->hide();
} else if (protocol == "NFS") {
_portText->show();
_port->show();
_userText->show();
_user->show();
_encodingText->hide();
_encoding->hide();
} else if (protocol == "SMB") {
_portText->hide();
_port->hide();
_userText->hide();
_user->hide();
_encodingText->hide();
_encoding->hide();
} else { } else {
_type = ""; _type = "";
return false; return false;

View file

@ -59,14 +59,7 @@
<property name="margin"> <property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<item row="3" column="0"> <item row="3" column="1">
<widget class="QRadioButton" name="_nfs">
<property name="text">
<string>N&amp;etwork File System (nfs)</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="KComboBox" name="_recentConnectionName"> <widget class="KComboBox" name="_recentConnectionName">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
@ -85,13 +78,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0">
<widget class="QRadioButton" name="_recent">
<property name="text">
<string>&amp;Recent connection:</string>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QRadioButton" name="_ftp"> <widget class="QRadioButton" name="_ftp">
<property name="text"> <property name="text">
@ -102,6 +88,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0">
<widget class="QRadioButton" name="_recent">
<property name="text">
<string>&amp;Recent connection:</string>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QRadioButton" name="_sftp"> <widget class="QRadioButton" name="_sftp">
<property name="text"> <property name="text">
@ -112,13 +105,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0">
<widget class="QRadioButton" name="_smb">
<property name="text">
<string>&amp;Microsoft® Windows® network drive (smb)</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

View file

@ -33,7 +33,6 @@
#include <solid/block.h> #include <solid/block.h>
#include <solid/storagevolume.h> #include <solid/storagevolume.h>
#include <solid/storageaccess.h> #include <solid/storageaccess.h>
#include <solid/networkshare.h>
#include <solid/solidnamespace.h> #include <solid/solidnamespace.h>
#include "deviceactionsdialog.h" #include "deviceactionsdialog.h"
@ -177,37 +176,6 @@ void SolidUiServer::onActionDialogFinished()
int SolidUiServer::mountDevice(const QString &udi) int SolidUiServer::mountDevice(const QString &udi)
{ {
Solid::Device device(udi); Solid::Device device(udi);
Solid::NetworkShare *networkshare = device.as<Solid::NetworkShare>();
if (networkshare) {
// qDebug() << Q_FUNC_INFO << udi << networkshare->url();
const QString deviceuuid = device.product();
QString devicenode;
QString devicefstype;
switch (networkshare->type()) {
case Solid::NetworkShare::Unknown: {
return int(Solid::ErrorType::MissingDriver);
}
case Solid::NetworkShare::Nfs: {
devicenode = QString::fromLatin1("%1:%2").arg(device.product()).arg(device.vendor());
devicefstype = QString::fromLatin1("nfs");
break;
}
case Solid::NetworkShare::Cifs: {
devicenode = QString::fromLatin1("//%1/%2").arg(device.product()).arg(device.vendor());
devicefstype = QString::fromLatin1("cifs");
break;
}
default: {
kWarning() << "Invalid network share type" << networkshare->type();
return int(Solid::ErrorType::InvalidOption);
}
}
return doMount(deviceuuid, devicenode, devicefstype);
}
Solid::StorageVolume *storagevolume = device.as<Solid::StorageVolume>(); Solid::StorageVolume *storagevolume = device.as<Solid::StorageVolume>();
Solid::Block *block = device.as<Solid::Block>(); Solid::Block *block = device.as<Solid::Block>();
if (!storagevolume || !block) { if (!storagevolume || !block) {
@ -271,13 +239,7 @@ int SolidUiServer::mountDevice(const QString &udi)
int SolidUiServer::unmountDevice(const QString &udi) int SolidUiServer::unmountDevice(const QString &udi)
{ {
Solid::Device device(udi); Solid::Device device(udi);
Solid::NetworkShare *networkshare = device.as<Solid::NetworkShare>();
Solid::StorageAccess *storageaccess = device.as<Solid::StorageAccess>(); Solid::StorageAccess *storageaccess = device.as<Solid::StorageAccess>();
if (networkshare && storageaccess) {
return doUnmount(storageaccess->filePath());
}
Solid::StorageVolume *storagevolume = device.as<Solid::StorageVolume>(); Solid::StorageVolume *storagevolume = device.as<Solid::StorageVolume>();
if (!storagevolume || !storageaccess) { if (!storagevolume || !storageaccess) {
return int(Solid::ErrorType::InvalidOption); return int(Solid::ErrorType::InvalidOption);