Blame src/LocalDir.cc

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