Hi!
----
Attached is a small patch ("ksh93_libcmd_killglobalvars001.diff.txt")
for ast-ksh.2006-09-12 which significantly reduces the size of the
global variables in libcmd - there are still some |static| buffers and
"cp.c" causes headaches since I don't know how I can pass a pointer to
the child function of |ftwalk()| (the only global variable is now a
pointer to the state structure) ...
Comments/ideas/rants welcome...
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) roland.mainz at nrubsig.org
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 7950090
(;O/ \/ \O;)
-------------- next part --------------
Index: src/lib/libcmd/common/cp.c
===================================================================
--- src/lib/libcmd/common/cp.c (revision 502)
+++ src/lib/libcmd/common/cp.c (working copy)
@@ -140,7 +140,7 @@
#define BAK_number 2 /* append .suffix number suffix */
#define BAK_simple 3 /* append suffix */
-static struct /* program state */
+struct progstate /* program state */
{
int backup; /* BAK_* type */
int directory; /* destination is directory */
@@ -153,12 +153,12 @@
int missmode; /* default missing dir mode */
int official; /* move to next view */
int op; /* {CP,LN,MV} */
- int pathsiz; /* state.path buffer size */
+ int pathsiz; /* state->path buffer size */
int perm; /* permissions to preserve */
- int postsiz; /* state.path post index */
+ int postsiz; /* state->path post index */
int preserve; /* preserve { id mode time } */
int recursive; /* subtrees too */
- int suflen; /* strlen(state.suffix) */
+ int suflen; /* strlen(state->suffix) */
int sync; /* fsync() each file after copy */
int uid; /* caller uid */
int update; /* replace only if newer */
@@ -168,14 +168,16 @@
int (*stat)(const char*, struct stat*); /* stat */
char* path; /* to pathname buffer */
- char* opname; /* state.op message string */
+ char* opname; /* state->op message string */
char* suffix; /* backup suffix */
Sfio_t* tmp; /* tmp string stream */
char text[PATH_MAX]; /* link text buffer */
-} state;
+};
+struct progstate *state;
+
static char dot[2] = { '.' };
/*
@@ -190,7 +192,7 @@
if (tmxtouch(path, tmxgetatime(os), tmxgetmtime(os), TMX_NOTIME, 0))
error(ERROR_SYSTEM|2, "%s: cannot reset access and modify
times", path);
n = ((ns->st_uid != os->st_uid) << 1) | (ns->st_gid != os->st_gid);
- if (n && chown(state.path, os->st_uid, os->st_gid))
+ if (n && chown(state->path, os->st_uid, os->st_gid))
switch (n)
{
case 01:
@@ -206,7 +208,7 @@
}
/*
- * visit a single file and state.op to the destination
+ * visit a single file and state->op to the destination
*/
static int
@@ -231,7 +233,7 @@
static int presiz;
- if (state.interrupt)
+ if (state->interrupt)
return -1;
if (ftw->info == FTW_DC)
{
@@ -243,7 +245,7 @@
{
base = ftw->name;
len = ftw->namelen;
- if (state.hierarchy)
+ if (state->hierarchy)
presiz = -1;
else
{
@@ -260,7 +262,7 @@
while (base > ftw->name && *(base - 1) != '/')
base--;
len -= base - ftw->name;
- if (state.directory)
+ if (state->directory)
presiz -= len + 1;
}
}
@@ -270,29 +272,29 @@
len = ftw->pathlen - presiz - 1;
}
len++;
- if (state.directory)
+ if (state->directory)
{
- if ((state.postsiz + len) > state.pathsiz && !(state.path =
newof(state.path, char, state.pathsiz = roundof(state.postsiz + len,
PATH_CHUNK), 0)))
+ if ((state->postsiz + len) > state->pathsiz && !(state->path =
newof(state->path, char, state->pathsiz = roundof(state->postsiz + len,
PATH_CHUNK), 0)))
error(3, "out of space");
- if (state.hierarchy && ftw->level == 0 && strchr(base, '/'))
+ if (state->hierarchy && ftw->level == 0 && strchr(base, '/'))
{
- s = state.path + state.postsiz;
+ s = state->path + state->postsiz;
memcpy(s, base, len);
while (e = strchr(s, '/'))
{
*e = 0;
- if (access(state.path, F_OK))
+ if (access(state->path, F_OK))
{
- st.st_mode = state.missmode;
+ st.st_mode = state->missmode;
if (s = strrchr(s, '/'))
{
*s = 0;
- stat(state.path, &st);
+ stat(state->path, &st);
*s = '/';
}
- if (mkdir(state.path, st.st_mode &
S_IPERM))
+ if (mkdir(state->path, st.st_mode &
S_IPERM))
{
- error(ERROR_SYSTEM|2, "%s:
cannot create directory -- %s ignored", state.path, ftw->path);
+ error(ERROR_SYSTEM|2, "%s:
cannot create directory -- %s ignored", state->path, ftw->path);
ftw->status = FTW_SKIP;
return 0;
}
@@ -305,32 +307,32 @@
switch (ftw->info)
{
case FTW_DP:
- if (state.preserve && state.op != LN || ftw->level > 0 &&
(ftw->statb.st_mode & S_IRWXU) != S_IRWXU)
+ if (state->preserve && state->op != LN || ftw->level > 0 &&
(ftw->statb.st_mode & S_IRWXU) != S_IRWXU)
{
if (len && ftw->level > 0)
- memcpy(state.path + state.postsiz, base, len);
+ memcpy(state->path + state->postsiz, base, len);
else
- state.path[state.postsiz] = 0;
- if (stat(state.path, &st))
- error(ERROR_SYSTEM|2, "%s: cannot stat",
state.path);
+ state->path[state->postsiz] = 0;
+ if (stat(state->path, &st))
+ error(ERROR_SYSTEM|2, "%s: cannot stat",
state->path);
else
{
- if ((ftw->statb.st_mode & S_IPERM) !=
(st.st_mode & S_IPERM) && chmod(state.path, ftw->statb.st_mode & S_IPERM))
- error(ERROR_SYSTEM|2, "%s: cannot reset
directory mode to %s", state.path, fmtmode(st.st_mode & S_IPERM, 0) + 1);
- if (state.preserve)
- preserve(state.path, &st, &ftw->statb);
+ if ((ftw->statb.st_mode & S_IPERM) !=
(st.st_mode & S_IPERM) && chmod(state->path, ftw->statb.st_mode & S_IPERM))
+ error(ERROR_SYSTEM|2, "%s: cannot reset
directory mode to %s", state->path, fmtmode(st.st_mode & S_IPERM, 0) + 1);
+ if (state->preserve)
+ preserve(state->path, &st, &ftw->statb);
}
}
return 0;
case FTW_DNR:
case FTW_DNX:
case FTW_D:
- if (!state.recursive)
+ if (!state->recursive)
{
ftw->status = FTW_SKIP;
- if (state.op == CP)
+ if (state->op == CP)
error(1, "%s: directory -- copying as plain
file", ftw->path);
- else if (state.link == link && !state.force)
+ else if (state->link == link && !state->force)
{
error(2, "%s: cannot link directory",
ftw->path);
return 0;
@@ -346,32 +348,32 @@
ftw->status = FTW_SKIP;
/*FALLTHROUGH*/
case FTW_D:
- if (state.directory)
- memcpy(state.path + state.postsiz, base, len);
- if (!(*state.stat)(state.path, &st))
+ if (state->directory)
+ memcpy(state->path + state->postsiz, base, len);
+ if (!(*state->stat)(state->path, &st))
{
if (!S_ISDIR(st.st_mode))
{
- error(2, "%s: not a directory -- %s
ignored", state.path, ftw->path);
+ error(2, "%s: not a directory -- %s
ignored", state->path, ftw->path);
return 0;
}
}
- else if (mkdir(state.path, (ftw->statb.st_mode &
S_IPERM)|(ftw->info == FTW_D ? S_IRWXU : 0)))
+ else if (mkdir(state->path, (ftw->statb.st_mode &
S_IPERM)|(ftw->info == FTW_D ? S_IRWXU : 0)))
{
- error(ERROR_SYSTEM|2, "%s: cannot create
directory -- %s ignored", state.path, ftw->path);
+ error(ERROR_SYSTEM|2, "%s: cannot create
directory -- %s ignored", state->path, ftw->path);
ftw->status = FTW_SKIP;
}
- if (!state.directory)
+ if (!state->directory)
{
- state.directory = 1;
- state.path[state.postsiz++] = '/';
+ state->directory = 1;
+ state->path[state->postsiz++] = '/';
presiz--;
}
return 0;
}
break;
case FTW_NS:
- if (state.link != pathsetlink)
+ if (state->link != pathsetlink)
{
error(2, "%s: not found", ftw->path);
return 0;
@@ -379,7 +381,7 @@
break;
#if 0
case FTW_SL:
- if (state.op == CP)
+ if (state->op == CP)
{
error(2, "%s: cannot copy non-terminal symbolic link",
ftw->path);
return 0;
@@ -387,16 +389,16 @@
break;
#endif
}
- if (state.directory)
- memcpy(state.path + state.postsiz, base, len);
- if ((*state.stat)(state.path, &st))
+ if (state->directory)
+ memcpy(state->path + state->postsiz, base, len);
+ if ((*state->stat)(state->path, &st))
st.st_mode = 0;
- else if (state.update && !S_ISDIR(st.st_mode) && (unsigned
long)ftw->statb.st_mtime < (unsigned long)st.st_mtime)
+ else if (state->update && !S_ISDIR(st.st_mode) && (unsigned
long)ftw->statb.st_mtime < (unsigned long)st.st_mtime)
{
ftw->status = FTW_SKIP;
return 0;
}
- else if (!state.fs3d || !iview(&st))
+ else if (!state->fs3d || !iview(&st))
{
/*
* target is in top 3d view
@@ -404,47 +406,47 @@
if (st.st_dev == ftw->statb.st_dev && st.st_ino ==
ftw->statb.st_ino)
{
- if (state.op == MV)
+ if (state->op == MV)
{
/*
* let rename() handle it
*/
- if (state.verbose)
- sfputr(sfstdout, state.path, '\n');
+ if (state->verbose)
+ sfputr(sfstdout, state->path, '\n');
goto operate;
}
- if (!state.official)
- error(2, "%s: identical to %s", state.path,
ftw->path);
+ if (!state->official)
+ error(2, "%s: identical to %s", state->path,
ftw->path);
return 0;
}
if (S_ISDIR(st.st_mode))
{
- error(2, "%s: cannot %s existing directory",
state.path, state.opname);
+ error(2, "%s: cannot %s existing directory",
state->path, state->opname);
return 0;
}
- if (state.verbose)
- sfputr(sfstdout, state.path, '\n');
- rm = state.op == LN || ftw->info == FTW_SL;
- if (!rm || !state.force)
+ if (state->verbose)
+ sfputr(sfstdout, state->path, '\n');
+ rm = state->op == LN || ftw->info == FTW_SL;
+ if (!rm || !state->force)
{
- if ((n = open(state.path, O_RDWR|O_BINARY)) >= 0)
+ if ((n = open(state->path, O_RDWR|O_BINARY)) >= 0)
{
close(n);
- if (state.force)
+ if (state->force)
/* ok */;
- else if (state.interactive)
+ else if (state->interactive)
{
- if (astquery(-1, "%s %s? ",
state.opname, state.path))
+ if (astquery(-1, "%s %s? ",
state->opname, state->path))
return 0;
}
- else if (state.op == LN)
+ else if (state->op == LN)
{
- error(2, "%s: cannot %s existing file",
state.path, state.opname);
+ error(2, "%s: cannot %s existing file",
state->path, state->opname);
return 0;
}
}
- else if (state.force)
+ else if (state->force)
rm = 1;
else
{
@@ -452,93 +454,93 @@
#ifdef ETXTBSY
errno == ETXTBSY ? "``running program''" :
#endif
- st.st_uid != state.uid ? "``not owner''" :
+ st.st_uid != state->uid ? "``not owner''" :
fmtmode(st.st_mode &
(S_IRWXU|S_IRWXG|S_IRWXO), 0) + 1;
- if (state.interactive)
+ if (state->interactive)
{
- if (astquery(-1, "override protection
%s for %s? ", protection, state.path))
+ if (astquery(-1, "override protection
%s for %s? ", protection, state->path))
return 0;
rm = 1;
}
else if (!rm)
{
- error(2, "%s: cannot %s %s protection",
state.path, state.opname, protection);
+ error(2, "%s: cannot %s %s protection",
state->path, state->opname, protection);
return 0;
}
}
}
- switch (state.backup)
+ switch (state->backup)
{
case BAK_existing:
case BAK_number:
v = 0;
- if (s = strrchr(state.path, '/'))
+ if (s = strrchr(state->path, '/'))
{
- e = state.path;
+ e = state->path;
*s++ = 0;
}
else
{
e = dot;
- s = state.path;
+ s = state->path;
}
n = strlen(s);
if (fts = fts_open((char**)e,
FTS_NOCHDIR|FTS_ONEPATH|FTS_PHYSICAL|FTS_NOPOSTORDER|FTS_NOSTAT|FTS_NOSEEDOTDIR,
NiL))
{
while (ent = fts_read(fts))
{
- if (strneq(s, ent->fts_name, n) &&
ent->fts_name[n] == '.' && strneq(ent->fts_name + n + 1, state.suffix,
state.suflen) && (m = strtol(ent->fts_name + n + state.suflen + 1, &e, 10)) &&
streq(e, state.suffix) && m > v)
+ if (strneq(s, ent->fts_name, n) &&
ent->fts_name[n] == '.' && strneq(ent->fts_name + n + 1, state->suffix,
state->suflen) && (m = strtol(ent->fts_name + n + state->suflen + 1, &e, 10))
&& streq(e, state->suffix) && m > v)
v = m;
if (ent->fts_level)
fts_set(NiL, ent, FTS_SKIP);
}
fts_close(fts);
}
- if (s != state.path)
+ if (s != state->path)
*--s = '/';
- if (v || state.backup == BAK_number)
+ if (v || state->backup == BAK_number)
{
- sfprintf(state.tmp, "%s.%s%d%s", state.path,
state.suffix, v + 1, state.suffix);
+ sfprintf(state->tmp, "%s.%s%d%s", state->path,
state->suffix, v + 1, state->suffix);
goto backup;
}
/*FALLTHROUGH*/
case BAK_simple:
- sfprintf(state.tmp, "%s%s", state.path, state.suffix);
+ sfprintf(state->tmp, "%s%s", state->path,
state->suffix);
backup:
- s = sfstruse(state.tmp);
- if (rename(state.path, s))
+ s = sfstruse(state->tmp);
+ if (rename(state->path, s))
{
- error(ERROR_SYSTEM|2, "%s: cannot backup to
%s", state.path, s);
+ error(ERROR_SYSTEM|2, "%s: cannot backup to
%s", state->path, s);
return 0;
}
break;
default:
- if (rm && remove(state.path))
+ if (rm && remove(state->path))
{
- error(ERROR_SYSTEM|2, "%s: cannot remove",
state.path);
+ error(ERROR_SYSTEM|2, "%s: cannot remove",
state->path);
return 0;
}
break;
}
}
operate:
- switch (state.op)
+ switch (state->op)
{
case MV:
for (;;)
{
- if (!rename(ftw->path, state.path))
+ if (!rename(ftw->path, state->path))
return 0;
if (errno == ENOENT)
rm = 1;
- else if (!rm && st.st_mode && !remove(state.path))
+ else if (!rm && st.st_mode && !remove(state->path))
{
rm = 1;
continue;
}
if (errno != EXDEV && (rm ||
S_ISDIR(ftw->statb.st_mode)))
{
- error(ERROR_SYSTEM|2, "%s: cannot rename to
%s", ftw->path, state.path);
+ error(ERROR_SYSTEM|2, "%s: cannot rename to
%s", ftw->path, state->path);
return 0;
}
else
@@ -548,28 +550,28 @@
case CP:
if (S_ISLNK(ftw->statb.st_mode))
{
- if ((n = pathgetlink(ftw->path, state.text,
sizeof(state.text) - 1)) < 0)
+ if ((n = pathgetlink(ftw->path, state->text,
sizeof(state->text) - 1)) < 0)
{
error(ERROR_SYSTEM|2, "%s: cannot read symbolic
link text", ftw->path);
return 0;
}
- state.text[n] = 0;
- if (pathsetlink(state.text, state.path))
+ state->text[n] = 0;
+ if (pathsetlink(state->text, state->path))
{
- error(ERROR_SYSTEM|2, "%s: cannot copy symbolic
link to %s", ftw->path, state.path);
+ error(ERROR_SYSTEM|2, "%s: cannot copy symbolic
link to %s", ftw->path, state->path);
return 0;
}
}
- else if (state.op == CP || S_ISREG(ftw->statb.st_mode) ||
S_ISDIR(ftw->statb.st_mode))
+ else if (state->op == CP || S_ISREG(ftw->statb.st_mode) ||
S_ISDIR(ftw->statb.st_mode))
{
if (ftw->statb.st_size > 0 && (rfd = open(ftw->path,
O_RDONLY|O_BINARY)) < 0)
{
error(ERROR_SYSTEM|2, "%s: cannot read",
ftw->path);
return 0;
}
- else if ((wfd = open(state.path,
O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, ftw->statb.st_mode & state.perm)) < 0)
+ else if ((wfd = open(state->path,
O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, ftw->statb.st_mode & state->perm)) < 0)
{
- error(ERROR_SYSTEM|2, "%s: cannot write",
state.path);
+ error(ERROR_SYSTEM|2, "%s: cannot write",
state->path);
if (ftw->statb.st_size > 0)
close(rfd);
return 0;
@@ -578,7 +580,7 @@
{
if (!(ip = sfnew(NiL, NiL, SF_UNBOUND, rfd,
SF_READ)))
{
- error(ERROR_SYSTEM|2, "%s: %s read
stream error", ftw->path, state.path);
+ error(ERROR_SYSTEM|2, "%s: %s read
stream error", ftw->path, state->path);
close(rfd);
close(wfd);
}
@@ -587,7 +589,7 @@
n = 0;
if (!(op = sfnew(NiL, NiL, SF_UNBOUND,
wfd, SF_WRITE)))
{
- error(ERROR_SYSTEM|2, "%s: %s
write stream error", ftw->path, state.path);
+ error(ERROR_SYSTEM|2, "%s: %s
write stream error", ftw->path, state->path);
close(wfd);
sfclose(ip);
}
@@ -597,12 +599,12 @@
n |= 3;
if (!sfeof(ip))
n |= 1;
- if (sfsync(op) || state.sync &&
fsync(wfd) || sfclose(op))
+ if (sfsync(op) || state->sync
&& fsync(wfd) || sfclose(op))
n |= 2;
if (sfclose(ip))
n |= 1;
if (n)
- error(ERROR_SYSTEM|2,
"%s: %s %s error", ftw->path, state.path, n == 1 ? ERROR_translate(0, 0, 0,
"read") : n == 2 ? ERROR_translate(0, 0, 0, "write") : ERROR_translate(0, 0, 0,
"io"));
+ error(ERROR_SYSTEM|2,
"%s: %s %s error", ftw->path, state->path, n == 1 ? ERROR_translate(0, 0, 0,
"read") : n == 2 ? ERROR_translate(0, 0, 0, "write") : ERROR_translate(0, 0, 0,
"io"));
}
}
}
@@ -611,9 +613,9 @@
}
else if (S_ISBLK(ftw->statb.st_mode) ||
S_ISCHR(ftw->statb.st_mode) || S_ISFIFO(ftw->statb.st_mode))
{
- if (mknod(state.path, ftw->statb.st_mode,
idevice(&ftw->statb)))
+ if (mknod(state->path, ftw->statb.st_mode,
idevice(&ftw->statb)))
{
- error(ERROR_SYSTEM|2, "%s: cannot copy special
file to %s", ftw->path, state.path);
+ error(ERROR_SYSTEM|2, "%s: cannot copy special
file to %s", ftw->path, state->path);
return 0;
}
}
@@ -622,26 +624,26 @@
error(2, "%s: cannot copy -- unknown file type 0%o",
ftw->path, S_ITYPE(ftw->statb.st_mode));
return 0;
}
- if (state.preserve)
+ if (state->preserve)
{
if (ftw->info != FTW_SL)
{
- if (stat(state.path, &st))
- error(ERROR_SYSTEM|2, "%s: cannot
stat", state.path);
+ if (stat(state->path, &st))
+ error(ERROR_SYSTEM|2, "%s: cannot
stat", state->path);
else
{
- if ((ftw->statb.st_mode & state.perm)
!= (st.st_mode & state.perm) && chmod(state.path, ftw->statb.st_mode &
state.perm))
- error(ERROR_SYSTEM|2, "%s:
cannot reset mode to %s", state.path, fmtmode(st.st_mode & state.perm, 0) + 1);
- preserve(state.path, &st, &ftw->statb);
+ if ((ftw->statb.st_mode & state->perm)
!= (st.st_mode & state->perm) && chmod(state->path, ftw->statb.st_mode &
state->perm))
+ error(ERROR_SYSTEM|2, "%s:
cannot reset mode to %s", state->path, fmtmode(st.st_mode & state->perm, 0) +
1);
+ preserve(state->path, &st, &ftw->statb);
}
}
- if (state.op == MV && remove(ftw->path))
+ if (state->op == MV && remove(ftw->path))
error(ERROR_SYSTEM|1, "%s: cannot remove",
ftw->path);
}
break;
case LN:
- if ((*state.link)(ftw->path, state.path))
- error(ERROR_SYSTEM|2, "%s: cannot link to %s",
ftw->path, state.path);
+ if ((*state->link)(ftw->path, state->path))
+ error(ERROR_SYSTEM|2, "%s: cannot link to %s",
ftw->path, state->path);
break;
}
return 0;
@@ -658,136 +660,138 @@
int path_resolve;
int standard;
struct stat st;
+ struct progstate pg;
+ state = &pg;
if (argc < 0)
{
- state.interrupt = 1;
+ state->interrupt = 1;
return -1;
}
- memset(&state, 0, sizeof(state));
+ memset(state, 0, sizeof(struct progstate));
cmdinit(argv, context, ERROR_CATALOG, ERROR_NOTIFY);
backup_type = 0;
- state.flags = FTW_DOT|FTW_MULTIPLE|FTW_TWICE|FTW_NOSEEDOTDIR;
- state.uid = geteuid();
- if (!(state.tmp = sfstropen()))
+ state->flags = FTW_DOT|FTW_MULTIPLE|FTW_TWICE|FTW_NOSEEDOTDIR;
+ state->uid = geteuid();
+ if (!(state->tmp = sfstropen()))
error(ERROR_SYSTEM|3, "out of space [tmp string]");
- sfputr(state.tmp, usage_head, -1);
+ sfputr(state->tmp, usage_head, -1);
standard = !strcmp(astconf("CONFORMANCE", NiL, NiL), "standard");
switch (error_info.id[0])
{
case 'c':
case 'C':
- sfputr(state.tmp, usage_cp, -1);
- state.op = CP;
- state.stat = stat;
+ sfputr(state->tmp, usage_cp, -1);
+ state->op = CP;
+ state->stat = stat;
path_resolve = -1;
break;
case 'l':
case 'L':
- sfputr(state.tmp, usage_ln, -1);
- state.op = LN;
- state.flags |= FTW_PHYSICAL;
- state.link = link;
- state.stat = lstat;
+ sfputr(state->tmp, usage_ln, -1);
+ state->op = LN;
+ state->flags |= FTW_PHYSICAL;
+ state->link = link;
+ state->stat = lstat;
path_resolve = 1;
break;
case 'm':
case 'M':
- sfputr(state.tmp, usage_mv, -1);
- state.op = MV;
- state.flags |= FTW_PHYSICAL;
- state.preserve = 1;
- state.stat = lstat;
+ sfputr(state->tmp, usage_mv, -1);
+ state->op = MV;
+ state->flags |= FTW_PHYSICAL;
+ state->preserve = 1;
+ state->stat = lstat;
path_resolve = 1;
break;
default:
error(3, "not implemented");
break;
}
- sfputr(state.tmp, usage_tail, -1);
- usage = sfstruse(state.tmp);
- state.opname = state.op == CP ? ERROR_translate(0, 0, 0, "overwrite") :
ERROR_translate(0, 0, 0, "replace");
+ sfputr(state->tmp, usage_tail, -1);
+ usage = sfstruse(state->tmp);
+ state->opname = state->op == CP ? ERROR_translate(0, 0, 0, "overwrite")
: ERROR_translate(0, 0, 0, "replace");
for (;;)
{
switch (optget(argv, usage))
{
case 'a':
- state.flags |= FTW_PHYSICAL;
- state.preserve = 1;
- state.recursive = 1;
+ state->flags |= FTW_PHYSICAL;
+ state->preserve = 1;
+ state->recursive = 1;
path_resolve = 1;
continue;
case 'b':
- state.backup = 1;
+ state->backup = 1;
continue;
case 'f':
- state.force = 1;
- if (state.op != CP || !standard)
- state.interactive = 0;
+ state->force = 1;
+ if (state->op != CP || !standard)
+ state->interactive = 0;
continue;
case 'h':
- state.hierarchy = 1;
+ state->hierarchy = 1;
continue;
case 'i':
- state.interactive = 1;
- if (state.op != CP || !standard)
- state.force = 0;
+ state->interactive = 1;
+ if (state->op != CP || !standard)
+ state->force = 0;
continue;
case 'l':
- state.op = LN;
- state.link = link;
- state.stat = lstat;
+ state->op = LN;
+ state->link = link;
+ state->stat = lstat;
continue;
case 'p':
- state.preserve = 1;
+ state->preserve = 1;
continue;
case 'r':
- state.recursive = 1;
+ state->recursive = 1;
if (path_resolve < 0)
path_resolve = 0;
continue;
case 's':
- state.op = LN;
- state.link = pathsetlink;
- state.stat = lstat;
+ state->op = LN;
+ state->link = pathsetlink;
+ state->stat = lstat;
continue;
case 'u':
- state.update = 1;
+ state->update = 1;
continue;
case 'v':
- state.verbose = 1;
+ state->verbose = 1;
continue;
case 'x':
- state.flags |= FTW_MOUNT;
+ state->flags |= FTW_MOUNT;
continue;
case 'F':
#if _lib_fsync
- state.sync = 1;
+ state->sync = 1;
#else
error(1, "%s not implemented on this system",
opt_info.name);
#endif
continue;
case 'H':
- state.flags |= FTW_META|FTW_PHYSICAL;
+ state->flags |= FTW_META|FTW_PHYSICAL;
path_resolve = 1;
continue;
case 'L':
- state.flags &= ~FTW_PHYSICAL;
+ state->flags &= ~FTW_PHYSICAL;
path_resolve = 1;
continue;
case 'P':
- state.flags &= ~FTW_META;
- state.flags |= FTW_PHYSICAL;
+ state->flags &= ~FTW_META;
+ state->flags |= FTW_PHYSICAL;
path_resolve = 1;
continue;
case 'R':
- state.recursive = 1;
- state.flags &= ~FTW_META;
- state.flags |= FTW_PHYSICAL;
+ state->recursive = 1;
+ state->flags &= ~FTW_META;
+ state->flags |= FTW_PHYSICAL;
path_resolve = 1;
continue;
case 'S':
- state.suffix = opt_info.arg;
+ state->suffix = opt_info.arg;
continue;
case 'V':
backup_type = opt_info.arg;
@@ -817,10 +821,10 @@
argc++;
argv[1] = dot;
}
- if (state.backup)
+ if (state->backup)
{
if (!(file = backup_type) && !(backup_type =
getenv("VERSION_CONTROL")))
- state.backup = BAK_existing;
+ state->backup = BAK_existing;
else
switch (strkey(backup_type))
{
@@ -832,7 +836,7 @@
case HASHKEY1('e'):
case HASHKEY3('n','i','l'):
case HASHKEY2('n','i'):
- state.backup = BAK_existing;
+ state->backup = BAK_existing;
break;
case HASHKEY5('n','e','v','e','r'):
case HASHKEY4('n','e','v','e'):
@@ -844,7 +848,7 @@
case HASHKEY3('s','i','m'):
case HASHKEY2('s','i'):
case HASHKEY1('s'):
- state.backup = BAK_simple;
+ state->backup = BAK_simple;
break;
case HASHKEY6('n','u','m','b','e','r'):
case HASHKEY5('n','u','m','b','e'):
@@ -852,21 +856,21 @@
case HASHKEY3('n','u','m'):
case HASHKEY2('n','u'):
case HASHKEY1('t'):
- state.backup = BAK_number;
+ state->backup = BAK_number;
break;
default:
if (file)
error(2, "%s: unknown backup type",
backup_type);
break;
}
- if (!state.suffix && !(state.suffix =
getenv("SIMPLE_BACKUP_SUFFIX")))
- state.suffix = "~";
- state.suflen = strlen(state.suffix);
+ if (!state->suffix && !(state->suffix =
getenv("SIMPLE_BACKUP_SUFFIX")))
+ state->suffix = "~";
+ state->suflen = strlen(state->suffix);
}
if (argc <= 0 || error_info.errors)
error(ERROR_USAGE|4, "%s", optusage(NiL));
if (!path_resolve)
- state.flags |= ftwflags();
+ state->flags |= ftwflags();
file = argv[argc];
argv[argc] = 0;
if (s = strrchr(file, '/'))
@@ -877,29 +881,29 @@
s = 0;
}
pathcanon(file, 0);
- if (!(state.directory = !stat(file, &st) && S_ISDIR(st.st_mode)) &&
argc > 1)
+ if (!(state->directory = !stat(file, &st) && S_ISDIR(st.st_mode)) &&
argc > 1)
error(ERROR_USAGE|4, "%s", optusage(NiL));
- if (s && !state.directory)
+ if (s && !state->directory)
error(3, "%s: not a directory", file);
- if ((state.fs3d = fs3d(FS3D_TEST)) && strmatch(file, "...|*/...|.../*"))
- state.official = 1;
- state.postsiz = strlen(file);
- state.pathsiz = roundof(state.postsiz + 2, PATH_CHUNK);
- if (!(state.path = newof(0, char, state.pathsiz, 0)))
+ if ((state->fs3d = fs3d(FS3D_TEST)) && strmatch(file,
"...|*/...|.../*"))
+ state->official = 1;
+ state->postsiz = strlen(file);
+ state->pathsiz = roundof(state->postsiz + 2, PATH_CHUNK);
+ if (!(state->path = newof(0, char, state->pathsiz, 0)))
error(3, "out of space");
- memcpy(state.path, file, state.postsiz + 1);
- if (state.directory && state.path[state.postsiz - 1] != '/')
- state.path[state.postsiz++] = '/';
- if (state.hierarchy)
+ memcpy(state->path, file, state->postsiz + 1);
+ if (state->directory && state->path[state->postsiz - 1] != '/')
+ state->path[state->postsiz++] = '/';
+ if (state->hierarchy)
{
- if (!state.directory)
+ if (!state->directory)
error(3, "%s: last argument must be a directory", file);
- state.missmode = st.st_mode;
+ state->missmode = st.st_mode;
}
- state.perm = state.uid ? S_IPERM : (S_IPERM & ~S_ISVTX);
- if (!state.recursive)
- state.flags |= FTW_TOP;
- ftwalk((char*)argv, visit, state.flags, NiL);
- free(state.path);
+ state->perm = state->uid ? S_IPERM : (S_IPERM & ~S_ISVTX);
+ if (!state->recursive)
+ state->flags |= FTW_TOP;
+ ftwalk((char*)argv, visit, state->flags, NiL);
+ free(state->path);
return error_info.errors != 0;
}
Index: src/lib/libcmd/common/cat.c
===================================================================
--- src/lib/libcmd/common/cat.c (revision 502)
+++ src/lib/libcmd/common/cat.c (working copy)
@@ -95,14 +95,12 @@
#define printof(c) ((c)^0100)
-static char states[UCHAR_MAX+1];
-
/*
* called for any special output processing
*/
static int
-vcat(Sfio_t *fdin, Sfio_t *fdout, int flags)
+vcat(Sfio_t *fdin, Sfio_t *fdout, int flags, char *states)
{
register unsigned char* cp;
register unsigned char* cpold;
@@ -233,7 +231,8 @@
char* mode;
int att;
int dovcat=0;
-
+ char states[UCHAR_MAX+1];
+
NoP(argc);
cmdinit(argv, context, ERROR_CATALOG, 0);
att = !strcmp(astconf("UNIVERSE", NiL, NiL), "att");
@@ -354,7 +353,7 @@
if (flags&U_FLAG)
sfsetbuf(fp, (void*)fp, -1);
if (dovcat)
- n = vcat(fp, sfstdout, flags);
+ n = vcat(fp, sfstdout, flags, states);
else if (sfmove(fp, sfstdout, SF_UNBOUND, -1) >= 0 && sfeof(fp))
n = 0;
else
Index: src/lib/libcmd/common/tee.c
===================================================================
--- src/lib/libcmd/common/tee.c (revision 502)
+++ src/lib/libcmd/common/tee.c (working copy)
@@ -89,7 +89,7 @@
return(n);
}
-static Sfdisc_t tee_disc = { 0, tee_write, 0, 0, 0 };
+static const Sfdisc_t tee_disc = { 0, tee_write, 0, 0, 0 };
int
b_tee(int argc, register char** argv, void* context)
Index: src/lib/libcmd/common/expr.c
===================================================================
--- src/lib/libcmd/common/expr.c (revision 502)
+++ src/lib/libcmd/common/expr.c (working copy)
@@ -140,10 +140,10 @@
#define numeric(np) ((np)->type&T_NUM)
-static struct Optable_s
+static const struct Optable_s
{
- char opname[3];
- int op;
+ const char opname[3];
+ const int op;
}
optable[] =
{
Index: src/lib/libcmd/common/fold.c
===================================================================
--- src/lib/libcmd/common/fold.c (revision 502)
+++ src/lib/libcmd/common/fold.c (working copy)
@@ -86,9 +86,7 @@
#define T_SP 5
#define T_RET 6
-static char cols[1<<CHAR_BIT];
-
-static void fold(Sfio_t *in, Sfio_t *out, register int width, const char
*cont, size_t contsize)
+static void fold(Sfio_t *in, Sfio_t *out, register int width, const char
*cont, size_t contsize, char *cols)
{
register char *cp, *first;
register int n, col=0, x=0;
@@ -176,6 +174,7 @@
register char *cp;
char *cont="\n";
size_t contsize = 1;
+ char cols[1<<CHAR_BIT];
cmdinit(argv, context, ERROR_CATALOG, 0);
cols['\t'] = T_TAB;
@@ -233,7 +232,7 @@
error_info.errors = 1;
continue;
}
- fold(fp,sfstdout,width,cont,contsize);
+ fold(fp,sfstdout,width,cont,contsize,cols);
if(fp!=sfstdin)
sfclose(fp);
}
Index: src/lib/libcmd/common/cut.c
===================================================================
--- src/lib/libcmd/common/cut.c (revision 502)
+++ src/lib/libcmd/common/cut.c (working copy)
@@ -101,8 +101,6 @@
#define C_NOCHOP 16
#define C_NONEWLINE 32
-static int seqno;
-
/*
* compare the first of an array of integers
*/
@@ -112,7 +110,7 @@
return(*((int*)a) - *((int*)b));
}
-static Cut_t *cutinit(int mode,char *str,int wdelim,int ldelim,size_t reclen)
+static Cut_t *cutinit(int mode,char *str,int wdelim,int ldelim,size_t reclen,
int *seqno_ptr)
{
register int *lp, c, n=0;
register int range = 0;
@@ -126,7 +124,7 @@
cuthdr->wdelim = wdelim;
cuthdr->ldelim = ldelim;
cuthdr->reclen = reclen;
- cuthdr->seqno = ++seqno;
+ cuthdr->seqno = ++(*seqno_ptr);
lp = cuthdr->list;
while(1) switch(c= *cp++)
{
@@ -412,6 +410,7 @@
int wdelim = '\t';
int ldelim = '\n';
size_t reclen = 0;
+ int seqno;
NoP(argc);
cmdinit(argv, context, ERROR_CATALOG, 0);
@@ -478,7 +477,7 @@
error(3, "non-empty b, c or f option must be specified");
if((mode & (C_FIELDS|C_SUPRESS)) == C_SUPRESS)
error(3, "s option requires f option");
- cuthdr = cutinit(mode,cp,wdelim,ldelim,reclen);
+ cuthdr = cutinit(mode,cp,wdelim,ldelim,reclen, &seqno);
if(cp = *argv)
argv++;
do