You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/tdeioslave/smb/tdeio_smb_dir.cpp

346 lines
8.8 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Project: SMB tdeioslave for KDE2
//
// File: tdeio_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 "tdeio_smb.h"
#include "tdeio_smb_internal.h"
//===========================================================================
// TODO: add when libsmbclient supports it
void SMBSlave::copy( const KURL& ksrc,
const KURL& kdst,
int permissions,
bool overwrite)
{
SMBUrl src;
SMBUrl dst;
mode_t initialmode;
int n;
int dstflags;
int srcfd = -1;
int dstfd = -1;
TDEIO::filesize_t processed_size = 0;
unsigned char buf[MAX_XFER_BUF_SIZE];
kdDebug(TDEIO_SMB) << "SMBSlave::copy with src = " << ksrc << "and dest = " << kdst << endl;
// setup urls
src = ksrc;
dst = kdst;
// Obtain information about source
if(cache_stat(src, &st ) == -1)
{
if ( errno == EACCES )
{
error( TDEIO::ERR_ACCESS_DENIED, src.prettyURL());
}
else
{
error( TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL());
}
return;
}
if ( S_ISDIR( st.st_mode ) )
{
error( TDEIO::ERR_IS_DIRECTORY, src.prettyURL() );
return;
}
totalSize(st.st_size);
// Check to se if the destination exists
if(cache_stat(dst, &st) != -1)
{
if(S_ISDIR(st.st_mode))
{
error( TDEIO::ERR_DIR_ALREADY_EXIST, dst.prettyURL());
return;
}
if(!overwrite)
{
error( TDEIO::ERR_FILE_ALREADY_EXIST, dst.prettyURL());
return;
}
}
// Open the source file
srcfd = smbc_open(src.toSmbcUrl(), O_RDONLY, 0);
if(srcfd < 0)
{
if(errno == EACCES)
{
error( TDEIO::ERR_ACCESS_DENIED, src.prettyURL() );
}
else
{
error( TDEIO::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(!overwrite)
{
dstflags |= O_EXCL;
}
dstfd = smbc_open(dst.toSmbcUrl(), dstflags, initialmode);
if(dstfd < 0)
{
if(errno == EACCES)
{
error(TDEIO::ERR_WRITE_ACCESS_DENIED, dst.prettyURL());
}
else
{
error(TDEIO::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)
{
kdDebug(TDEIO_SMB) << "SMBSlave::copy copy now TDEIO::ERR_COULD_NOT_WRITE" << endl;
error( TDEIO::ERR_COULD_NOT_WRITE, dst.prettyURL());
break;
}
processed_size += n;
processedSize(processed_size);
}
else if(n == 0)
{
break; // finished
}
else
{
error( TDEIO::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( TDEIO::ERR_COULD_NOT_WRITE, dst.prettyURL());
return;
}
}
finished();
}
//===========================================================================
void SMBSlave::del( const KURL &kurl, bool isfile)
{
kdDebug(TDEIO_SMB) << "SMBSlave::del on " << kurl << endl;
m_current_url = kurl;
if(isfile)
{
// Delete file
kdDebug(TDEIO_SMB) << "SMBSlave:: unlink " << kurl << endl;
if(smbc_unlink(m_current_url.toSmbcUrl()) == -1)
{
switch(errno)
{
case EISDIR:
error( TDEIO::ERR_IS_DIRECTORY, m_current_url.prettyURL());
break;
default:
reportError(kurl);
}
}
}
else
{
kdDebug(TDEIO_SMB) << "SMBSlave:: rmdir " << kurl << endl;
// Delete directory
if(smbc_rmdir(m_current_url.toSmbcUrl()) == -1)
{
reportError(kurl);
}
}
finished();
}
//===========================================================================
void SMBSlave::mkdir( const KURL &kurl, int permissions )
{
kdDebug(TDEIO_SMB) << "SMBSlave::mkdir on " << kurl << endl;
m_current_url = kurl;
if(smbc_mkdir(m_current_url.toSmbcUrl(), 0777) != 0)
{
if (errno == EEXIST) {
if(cache_stat(m_current_url, &st ) == 0)
{
if(S_ISDIR(st.st_mode ))
{
error( TDEIO::ERR_DIR_ALREADY_EXIST, m_current_url.prettyURL());
}
}
else
{
error( TDEIO::ERR_FILE_ALREADY_EXIST, m_current_url.prettyURL());
}
} else
reportError(kurl);
kdDebug(TDEIO_SMB) << "SMBSlave::mkdir exit with error " << kurl << endl;
}
else
{
if(permissions != -1)
{
// TODO enable the following when complete
//smbc_chmod( url.toSmbcUrl(), permissions );
}
}
finished();
}
//===========================================================================
void SMBSlave::rename( const KURL& ksrc, const KURL& kdest, bool overwrite )
{
SMBUrl src;
SMBUrl dst;
kdDebug(TDEIO_SMB) << "SMBSlave::rename, old name = " << ksrc << ", new name = " << kdest << endl;
src = ksrc;
dst = kdest;
// Check to se if the destination exists
kdDebug(TDEIO_SMB) << "SMBSlave::rename stat dst" << endl;
if(cache_stat(dst, &st) != -1)
{
if(S_ISDIR(st.st_mode))
{
kdDebug(TDEIO_SMB) << "SMBSlave::rename TDEIO::ERR_DIR_ALREADY_EXIST" << endl;
error( TDEIO::ERR_DIR_ALREADY_EXIST, dst.prettyURL());
finished();
return;
}
if(!overwrite)
{
kdDebug(TDEIO_SMB) << "SMBSlave::rename TDEIO::ERR_FILE_ALREADY_EXIST" << endl;
error( TDEIO::ERR_FILE_ALREADY_EXIST, dst.prettyURL());
finished();
return;
}
}
kdDebug(TDEIO_SMB ) << "smbc_rename " << src.toSmbcUrl() << " " << dst.toSmbcUrl() << endl;
if(smbc_rename(src.toSmbcUrl(), dst.toSmbcUrl())!=0)
{
kdDebug(TDEIO_SMB ) << "failed " << perror << endl;
switch(errno)
{
case ENOENT:
if(cache_stat(src, &st) == -1)
{
if(errno == EACCES)
{
kdDebug(TDEIO_SMB) << "SMBSlave::rename TDEIO::ERR_ACCESS_DENIED" << endl;
error(TDEIO::ERR_ACCESS_DENIED, src.prettyURL());
}
else
{
kdDebug(TDEIO_SMB) << "SMBSlave::rename TDEIO::ERR_DOES_NOT_EXIST" << endl;
error(TDEIO::ERR_DOES_NOT_EXIST, src.prettyURL());
}
}
break;
case EACCES:
case EPERM:
kdDebug(TDEIO_SMB) << "SMBSlave::rename TDEIO::ERR_ACCESS_DENIED" << endl;
error( TDEIO::ERR_ACCESS_DENIED, dst.prettyURL() );
break;
default:
kdDebug(TDEIO_SMB) << "SMBSlave::rename TDEIO::ERR_CANNOT_RENAME" << endl;
error( TDEIO::ERR_CANNOT_RENAME, src.prettyURL() );
}
kdDebug(TDEIO_SMB) << "SMBSlave::rename exit with error" << endl;
return;
}
kdDebug(TDEIO_SMB ) << "everything fine\n";
finished();
}