Blame src/LocalDir.cc

Packit 8f70b4
/*
Packit 8f70b4
 * lftp - file transfer program
Packit 8f70b4
 *
Packit 8f70b4
 * Copyright (c) 1996-2017 by Alexander V. Lukyanov (lav@yars.free.net)
Packit 8f70b4
 *
Packit 8f70b4
 * This program is free software; you can redistribute it and/or modify
Packit 8f70b4
 * it under the terms of the GNU General Public License as published by
Packit 8f70b4
 * the Free Software Foundation; either version 3 of the License, or
Packit 8f70b4
 * (at your option) any later version.
Packit 8f70b4
 *
Packit 8f70b4
 * This program is distributed in the hope that it will be useful,
Packit 8f70b4
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8f70b4
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8f70b4
 * GNU General Public License for more details.
Packit 8f70b4
 *
Packit 8f70b4
 * You should have received a copy of the GNU General Public License
Packit 8f70b4
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 8f70b4
 */
Packit 8f70b4
Packit 8f70b4
#include <config.h>
Packit 8f70b4
Packit 8f70b4
#include <stdlib.h>
Packit 8f70b4
#include <unistd.h>
Packit 8f70b4
#include <fcntl.h>
Packit 8f70b4
#include <errno.h>
Packit 8f70b4
#include <string.h>
Packit 8f70b4
Packit 8f70b4
#include "LocalDir.h"
Packit 8f70b4
#include "misc.h"
Packit 8f70b4
Packit 8f70b4
#ifndef O_DIRECTORY
Packit 8f70b4
# define O_DIRECTORY 0
Packit 8f70b4
#endif
Packit 8f70b4
Packit 8f70b4
void LocalDirectory::SetFromCWD()
Packit 8f70b4
{
Packit 8f70b4
   Unset();
Packit 8f70b4
   fd=open(".",O_RDONLY|O_DIRECTORY);
Packit 8f70b4
   fcntl(fd,F_SETFD,FD_CLOEXEC);
Packit 8f70b4
   xgetcwd_to(name);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
const char *LocalDirectory::Chdir()
Packit 8f70b4
{
Packit 8f70b4
#ifdef HAVE_FCHDIR
Packit 8f70b4
   if(fd!=-1)
Packit 8f70b4
   {
Packit 8f70b4
      int res=fchdir(fd);
Packit 8f70b4
      if(res==-1)
Packit 8f70b4
	 return strerror(errno);
Packit 8f70b4
      return 0;
Packit 8f70b4
   }
Packit 8f70b4
#endif
Packit 8f70b4
   if(name)
Packit 8f70b4
   {
Packit 8f70b4
      int res=chdir(name);
Packit 8f70b4
      if(res==-1)
Packit 8f70b4
	 return strerror(errno);
Packit 8f70b4
      return 0;
Packit 8f70b4
   }
Packit 8f70b4
   return "Directory location is undefined";
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
const char *LocalDirectory::GetName()
Packit 8f70b4
{
Packit 8f70b4
   return name;
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
void LocalDirectory::Unset()
Packit 8f70b4
{
Packit 8f70b4
   if(fd!=-1)
Packit 8f70b4
      close(fd);
Packit 8f70b4
   fd=-1;
Packit 8f70b4
   name.set(0);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
LocalDirectory::LocalDirectory()
Packit 8f70b4
{
Packit 8f70b4
   fd=-1;
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
LocalDirectory::LocalDirectory(const LocalDirectory *o)
Packit 8f70b4
{
Packit 8f70b4
   fd=-1;
Packit 8f70b4
   if(o->fd!=-1) {
Packit 8f70b4
      fd=dup(o->fd);
Packit 8f70b4
      fcntl(fd,F_SETFD,FD_CLOEXEC);
Packit 8f70b4
   }
Packit 8f70b4
   name.set(o->name);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
LocalDirectory *LocalDirectory::Clone() const
Packit 8f70b4
{
Packit 8f70b4
   return new LocalDirectory(this);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
LocalDirectory::~LocalDirectory()
Packit 8f70b4
{
Packit 8f70b4
   Unset();
Packit 8f70b4
}