|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2015 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 |
#include <assert.h>
|
|
Packit |
8f70b4 |
#include <unistd.h>
|
|
Packit |
8f70b4 |
#include "ChmodJob.h"
|
|
Packit |
8f70b4 |
#include "url.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
CDECL_BEGIN
|
|
Packit |
8f70b4 |
#include "filemode.h"
|
|
Packit |
8f70b4 |
#include "modechange.h"
|
|
Packit |
8f70b4 |
CDECL_END
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ChmodJob::Init()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
verbose=V_NONE;
|
|
Packit |
8f70b4 |
m=0;
|
|
Packit |
8f70b4 |
simple_mode=-1;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
ChmodJob::ChmodJob(FileAccess *s,ArgV *a) : TreatFileJob(s,a)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
Init();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
ChmodJob::ChmodJob(FileAccess *s,int mode,ArgV *a) : TreatFileJob(s,a)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
Init();
|
|
Packit |
8f70b4 |
simple_mode=mode;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
ChmodJob::~ChmodJob()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
free(m);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ChmodJob::Recurse()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
set_maxdepth(-1);
|
|
Packit |
8f70b4 |
Need(FileInfo::TYPE);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int ChmodJob::GetMode(const FileInfo *fi) const
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(simple_mode != -1)
|
|
Packit |
8f70b4 |
return simple_mode;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
if(fi->defined&fi->MODE)
|
|
Packit |
8f70b4 |
return mode_adjust(fi->mode, false, 022, m, NULL);
|
|
Packit |
8f70b4 |
if(!RelativeMode(m))
|
|
Packit |
8f70b4 |
return mode_adjust(0, false, 022, m, NULL);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
return -1;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ChmodJob::CurrentFinished(const char *d,const FileInfo *fi)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
const char *fmt;
|
|
Packit |
8f70b4 |
if(session->Done() < 0)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(quiet)
|
|
Packit |
8f70b4 |
return;
|
|
Packit |
8f70b4 |
fmt = _("Failed to change mode of `%s' to %04o (%s).\n");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
else
|
|
Packit |
8f70b4 |
fmt = _("Mode of `%s' changed to %04o (%s).\n");
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int mode=GetMode(fi);
|
|
Packit |
8f70b4 |
if(mode==-1)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
eprintf(_("Failed to change mode of `%s' because no old mode is available.\n"),fi->name.get());
|
|
Packit |
8f70b4 |
return;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(verbose == V_ALL || (verbose == V_CHANGES
|
|
Packit |
8f70b4 |
&& (!(fi->defined&fi->mode) || mode != (int)fi->mode)))
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
char perms[12]; /* "-rwxrwxrwx " ls-style modes. */
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
strmode (mode, perms);
|
|
Packit |
8f70b4 |
perms[10] = '\0';
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
eprintf (fmt, fi->name.get(), (int) mode, perms+1);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ChmodJob::SetMode(mode_change *newm)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
m=newm;
|
|
Packit |
8f70b4 |
/* request mode info only if we need it */
|
|
Packit |
8f70b4 |
if(RelativeMode(m))
|
|
Packit |
8f70b4 |
Need(FileInfo::MODE);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
/* one or the other */
|
|
Packit |
8f70b4 |
assert(simple_mode == -1);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ChmodJob::SetVerbosity(verbosity v)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
verbose=v;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
/* need file mode to show changes */
|
|
Packit |
8f70b4 |
if(verbose == V_CHANGES)
|
|
Packit |
8f70b4 |
Need(FileInfo::MODE);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool ChmodJob::RelativeMode(const mode_change *m) const
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
// relative mode change depends on original mode.
|
|
Packit |
8f70b4 |
return mode_adjust(07777, false, 0, m, NULL)
|
|
Packit |
8f70b4 |
!= mode_adjust(00000, false, 0, m, NULL);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ChmodJob::TreatCurrent(const char *d,const FileInfo *fi)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
int new_mode=GetMode(fi);
|
|
Packit |
8f70b4 |
if(new_mode!=-1)
|
|
Packit |
8f70b4 |
session->Chmod(fi->name,new_mode);
|
|
Packit |
8f70b4 |
}
|