[Toybox] [PATCH 1/5] lib: Add void *cb_param param to dirtree_read().
Georgi Chorbadzhiyski
gf at unixsol.org
Tue Mar 20 04:12:42 PDT 2012
Around 03/16/2012 03:15 PM, Rob Landley scribbled:
> On 03/07/2012 02:15 AM, Georgi Chorbadzhiyski wrote:
>> This parameter is passed to callback() function.
>
> Each command has a block of global variables. Passing down an
> unmodified variable eats more stack space and makes the callsites larger.
>
> As for patch 2 in the series... The dirtree stuff is already making a
> call for each file, I'm not sure how the new wrappers differ?
With standard dirtree_read() I would need to duplicate the following code
code in chmod, chgrp, chown and sysctl. Variant of dirtree_node() is
also contained in toys/cp.c
static int dirtree_node(char *path, struct dirtree *node, void *cb_param)
{
char *s = path + strlen(path);
struct dirtree *n = node;
int (*callback)(char *path) = cb_param;
for ( ; ; n = n->parent) {
while (s!=path) {
if (*(--s) == '/') break;
}
if (!n) break;
}
if (s != path) s++;
callback(s);
return 0;
}
void dirtree_for_each(char *path, int (*callback)(char *path))
{
struct stat sb;
if (stat(path, &sb) == -1) {
perror_msg("%s", path);
return;
}
callback(path);
if (S_ISDIR(sb.st_mode)) {
strncpy(toybuf, path, sizeof(toybuf) - 1);
toybuf[sizeof(toybuf) - 1] = 0;
dirtree_read(toybuf, NULL, callback, dirtree_node);
}
}
--
Georgi Chorbadzhiyski
http://georgi.unixsol.org/
More information about the Toybox
mailing list