|
Packit Service |
a2489d |
/*
|
|
Packit Service |
a2489d |
* lftp - file transfer program
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* Copyright (c) 1996-2012 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 |
/* All indexes in this function start at 0; -1 is used contextually to
|
|
Packit Service |
a2489d |
* indicate the last job or moving to the end of the list. */
|
|
Packit Service |
a2489d |
#include <config.h>
|
|
Packit Service |
a2489d |
#include <unistd.h>
|
|
Packit Service |
a2489d |
#include <assert.h>
|
|
Packit Service |
a2489d |
#include <fnmatch.h>
|
|
Packit Service |
a2489d |
#include <stddef.h>
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include "QueueFeeder.h"
|
|
Packit Service |
a2489d |
#include "plural.h"
|
|
Packit Service |
a2489d |
#include "misc.h"
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *QueueFeeder::NextCmd(CmdExec *exec, const char *)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(jobs == NULL) return NULL;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* denext the first job */
|
|
Packit Service |
a2489d |
QueueJob *job = grab_job(0);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
buffer.truncate(0);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(xstrcmp(cur_pwd, job->pwd)) {
|
|
Packit Service |
a2489d |
buffer.append("cd ").append_quoted(job->pwd).append("; ");
|
|
Packit Service |
a2489d |
cur_pwd.set(job->pwd);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(xstrcmp(cur_lpwd, job->lpwd)) {
|
|
Packit Service |
a2489d |
buffer.append("lcd ").append_quoted(job->lpwd).append("; ");
|
|
Packit Service |
a2489d |
cur_lpwd.set(job->lpwd);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
buffer.append(job->cmd.get()).append('\n');
|
|
Packit Service |
a2489d |
delete job;
|
|
Packit Service |
a2489d |
return buffer;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void QueueFeeder::QueueCmd(const char *cmd, const char *pwd, const char *lpwd, int pos, int v)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *job = new QueueJob;
|
|
Packit Service |
a2489d |
job->cmd.set(cmd);
|
|
Packit Service |
a2489d |
job->pwd.set(pwd);
|
|
Packit Service |
a2489d |
job->lpwd.set(lpwd);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* we never want a newline at the end: */
|
|
Packit Service |
a2489d |
if(last_char(job->cmd) == '\n')
|
|
Packit Service |
a2489d |
job->cmd.truncate(strlen(job->cmd)-1);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
insert_jobs(job, jobs, lastjob, pos != -1? get_job(pos): NULL);
|
|
Packit Service |
a2489d |
PrintJobs(job, v, _("Added job$|s$"));
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int QueueFeeder::JobCount(const QueueJob *j)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
int job_count=0;
|
|
Packit Service |
a2489d |
for(; j; j=j->next)
|
|
Packit Service |
a2489d |
job_count++;
|
|
Packit Service |
a2489d |
return job_count;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* verbose:
|
|
Packit Service |
a2489d |
* 0, quiet
|
|
Packit Service |
a2489d |
* 1, interactive
|
|
Packit Service |
a2489d |
* 2, verbose (print changes of pwd and lpwd)
|
|
Packit Service |
a2489d |
* PrintRequeue, output to requeue
|
|
Packit Service |
a2489d |
*/
|
|
Packit Service |
a2489d |
xstring& QueueFeeder::FormatJobs(xstring& s,const QueueJob *job, int v, const char *plur) const
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(v < 1)
|
|
Packit Service |
a2489d |
return s;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *pwd = 0, *lpwd = 0;
|
|
Packit Service |
a2489d |
if(v == PrintRequeue)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
for(const QueueJob *j = job; j; j=j->next)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(xstrcmp(pwd, job->pwd))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
s.append("cd ").append_quoted(job->pwd).append(" &\n");
|
|
Packit Service |
a2489d |
pwd = job->pwd;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(xstrcmp(lpwd, job->lpwd))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
s.append("lcd ").append_quoted(job->lpwd).append(" &\n");
|
|
Packit Service |
a2489d |
lpwd = job->lpwd;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
s.append("queue ").append_quoted(job->cmd).append('\n');
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return s;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int job_count=JobCount(job);
|
|
Packit Service |
a2489d |
if(job_count>1)
|
|
Packit Service |
a2489d |
s.appendf("%s:\n", plural(plur,job_count));
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
pwd = cur_pwd;
|
|
Packit Service |
a2489d |
lpwd = cur_lpwd;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int n = 1;
|
|
Packit Service |
a2489d |
for(const QueueJob *j = job; j; j=j->next)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
/* Print pwd/lpwd changes when v >= 2. (This only happens when there's
|
|
Packit Service |
a2489d |
* more than one.) */
|
|
Packit Service |
a2489d |
if(xstrcmp(pwd, job->pwd))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(v > 2) {
|
|
Packit Service |
a2489d |
s.append("\tcd ").append_quoted(job->pwd).append('\n');
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
pwd = job->pwd;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(xstrcmp(lpwd, job->lpwd))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(v > 2) {
|
|
Packit Service |
a2489d |
s.append("\tlcd ").append_quoted(job->lpwd).append('\n');
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
lpwd = job->lpwd;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(job_count==1)
|
|
Packit Service |
a2489d |
s.appendf("%s: ", plural(plur,job_count));
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
s.appendf("\t%2d. ",n++);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
s.append(j->cmd.get()).append('\n');
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return s;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void QueueFeeder::PrintJobs(const QueueJob *job, int v, const char *plur) const
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
xstring buf("");
|
|
Packit Service |
a2489d |
FormatJobs(buf,job,v,plur);
|
|
Packit Service |
a2489d |
printf("%s",buf.get());
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool QueueFeeder::DelJob(int from, int v)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *job = grab_job(from);
|
|
Packit Service |
a2489d |
if(!job)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(v > 0)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(from == -1 || !jobs)
|
|
Packit Service |
a2489d |
printf(_("No queued jobs.\n"));
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
printf(_("No queued job #%i.\n"), from+1);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return false;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
PrintJobs(job, v, _("Deleted job$|s$"));
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FreeList(job);
|
|
Packit Service |
a2489d |
return true;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool QueueFeeder::DelJob(const char *cmd, int v)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *job = grab_job(cmd);
|
|
Packit Service |
a2489d |
if(!job)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(v > 0)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(!jobs)
|
|
Packit Service |
a2489d |
printf(_("No queued jobs.\n"));
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
printf(_("No queued jobs match \"%s\".\n"), cmd);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return false;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
PrintJobs(job, v, _("Deleted job$|s$"));
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FreeList(job);
|
|
Packit Service |
a2489d |
return true;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* When moving, grab the insertion pointer *before* pulling out things to
|
|
Packit Service |
a2489d |
* move, since doing so will change offsets. (Note that "to == -1" means
|
|
Packit Service |
a2489d |
* "move to the end", not "before the last entry".)
|
|
Packit Service |
a2489d |
*/
|
|
Packit Service |
a2489d |
bool QueueFeeder::MoveJob(int from, int to, int v)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
/* Safety: make sure we don't try to move an item before itself. */
|
|
Packit Service |
a2489d |
if(from == to) return false;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueJob *before = to != -1? get_job(to): NULL;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueJob *job = grab_job(from);
|
|
Packit Service |
a2489d |
if(job == NULL) return false;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
PrintJobs(job, v, _("Moved job$|s$"));
|
|
Packit Service |
a2489d |
assert(job != before);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
insert_jobs(job, jobs, lastjob, before);
|
|
Packit Service |
a2489d |
return true;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool QueueFeeder::MoveJob(const char *cmd, int to, int v)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *before = to != -1? get_job(to): NULL;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* Mild hack: we need to make sure the "before" job isn't one that's
|
|
Packit Service |
a2489d |
* going to be moved, so move it upward until it isn't. */
|
|
Packit Service |
a2489d |
while(before && !fnmatch(cmd, before->cmd,FNM_CASEFOLD)) before=before->next;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueJob *job = grab_job(cmd);
|
|
Packit Service |
a2489d |
if(job == NULL) return false;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
PrintJobs(job, v, _("Moved job$|s$"));
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
insert_jobs(job, jobs, lastjob, before);
|
|
Packit Service |
a2489d |
return true;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* remove the given job from the list */
|
|
Packit Service |
a2489d |
void QueueFeeder::unlink_job(QueueJob *job)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
/* update head/tail */
|
|
Packit Service |
a2489d |
if(!job->prev) jobs = jobs->next;
|
|
Packit Service |
a2489d |
if(!job->next) lastjob = lastjob->prev;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* linked list stuff */
|
|
Packit Service |
a2489d |
if(job->prev) job->prev->next = job->next;
|
|
Packit Service |
a2489d |
if(job->next) job->next->prev = job->prev;
|
|
Packit Service |
a2489d |
job->prev = job->next = 0;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueFeeder::QueueJob *QueueFeeder::get_job(int n)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *j;
|
|
Packit Service |
a2489d |
if(n == -1) {
|
|
Packit Service |
a2489d |
j = lastjob;
|
|
Packit Service |
a2489d |
} else {
|
|
Packit Service |
a2489d |
j = jobs;
|
|
Packit Service |
a2489d |
while(j && n--) j=j->next;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
return j;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* get the n'th job, removed from the list; returns NULL (an empty list)
|
|
Packit Service |
a2489d |
* if there aren't that many jobs: */
|
|
Packit Service |
a2489d |
QueueFeeder::QueueJob *QueueFeeder::grab_job(int n)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *j = get_job(n);
|
|
Packit Service |
a2489d |
if(j)
|
|
Packit Service |
a2489d |
unlink_job(j);
|
|
Packit Service |
a2489d |
return j;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueFeeder::QueueJob *QueueFeeder::grab_job(const char *cmd)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
QueueJob *j = jobs, *head = NULL, *tail = NULL;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
while(j) {
|
|
Packit Service |
a2489d |
QueueJob *match = get_next_match(cmd, j);
|
|
Packit Service |
a2489d |
if(!match) break;
|
|
Packit Service |
a2489d |
j = match->next;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* matches */
|
|
Packit Service |
a2489d |
unlink_job(match);
|
|
Packit Service |
a2489d |
insert_jobs(match, head, tail, NULL);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
return head;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueFeeder::QueueJob *QueueFeeder::get_next_match(const char *cmd, QueueJob *j)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
while(j) {
|
|
Packit Service |
a2489d |
if(!fnmatch(cmd, j->cmd,FNM_CASEFOLD))
|
|
Packit Service |
a2489d |
return j;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
j = j->next;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return 0;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* insert a list of jobs before "before", or at the end if before is NULL.
|
|
Packit Service |
a2489d |
* If before is not NULL, it must be contained between lst_head and lst_tail. */
|
|
Packit Service |
a2489d |
void QueueFeeder::insert_jobs(QueueJob *job,
|
|
Packit Service |
a2489d |
QueueJob *&lst_head,
|
|
Packit Service |
a2489d |
QueueJob *&lst_tail,
|
|
Packit Service |
a2489d |
QueueJob *before)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
assert(!job->prev); /* this should be an independant, clean list head */
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* Find the last entry in the new list. (This is a bit inefficient, as
|
|
Packit Service |
a2489d |
* we usually know this somewhere else, but passing around both head
|
|
Packit Service |
a2489d |
* and tail pointers of the new job list is too klugy.) */
|
|
Packit Service |
a2489d |
QueueJob *tail = job;
|
|
Packit Service |
a2489d |
while(tail->next) tail=tail->next;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(!before) {
|
|
Packit Service |
a2489d |
/* end */
|
|
Packit Service |
a2489d |
job->prev = lst_tail;
|
|
Packit Service |
a2489d |
tail->next = 0; /* superfluous; here for clarity */
|
|
Packit Service |
a2489d |
} else {
|
|
Packit Service |
a2489d |
tail->next = before;
|
|
Packit Service |
a2489d |
job->prev = before->prev;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(job->prev) job->prev->next = job;
|
|
Packit Service |
a2489d |
if(tail->next) tail->next->prev = tail;
|
|
Packit Service |
a2489d |
if(!tail->next) lst_tail = tail;
|
|
Packit Service |
a2489d |
if(!job->prev) lst_head = job;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* Free a list of jobs (forward only; j should be a head pointer.) */
|
|
Packit Service |
a2489d |
void QueueFeeder::FreeList(QueueJob *j)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
while(j) {
|
|
Packit Service |
a2489d |
QueueJob *job = j;
|
|
Packit Service |
a2489d |
j = j->next;
|
|
Packit Service |
a2489d |
delete job;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
QueueFeeder::~QueueFeeder()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
FreeList(jobs);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring& QueueFeeder::FormatStatus(xstring& s,int v,const char *prefix) const
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(jobs == NULL)
|
|
Packit Service |
a2489d |
return s;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(v == PrintRequeue)
|
|
Packit Service |
a2489d |
return FormatJobs(s, jobs, v, "");
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
s.append(prefix).append(_("Commands queued:")).append('\n');
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int n = 1;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *pwd = cur_pwd, *lpwd = cur_lpwd;
|
|
Packit Service |
a2489d |
for(const QueueJob *job = jobs; job; job = job->next) {
|
|
Packit Service |
a2489d |
if(v<2 && n>4 && job->next)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
s.appendf("%s%2d. ...\n",prefix,n);
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
/* Print pwd/lpwd changes when v >= 2. */
|
|
Packit Service |
a2489d |
if(v >= 2 && (xstrcmp(pwd, job->pwd)))
|
|
Packit Service |
a2489d |
s.appendf("%s cd %s\n",prefix,job->pwd.get());
|
|
Packit Service |
a2489d |
if(v >= 2 && (xstrcmp(lpwd, job->lpwd)))
|
|
Packit Service |
a2489d |
s.appendf("%s lcd %s\n",prefix,job->lpwd.get());
|
|
Packit Service |
a2489d |
pwd = job->pwd;
|
|
Packit Service |
a2489d |
lpwd = job->lpwd;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
s.appendf("%s%2d. %s\n",prefix,n++,job->cmd.get());
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return s;
|
|
Packit Service |
a2489d |
}
|