diff options
author | Wayne Davison <wayned@samba.org> | 2006-01-21 09:14:39 +0000 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2006-01-21 09:14:39 +0000 |
commit | cf9b4794fdcd71feef63585e2497642fc658c810 (patch) | |
tree | 4f75dfa93a836f67963e788b88d48395433fcbf9 /chmod.c | |
parent | 6d8c6bdbe5c6c63a81b77f928b5d477a7be8fe56 (diff) | |
download | rsync-cf9b4794fdcd71feef63585e2497642fc658c810.tar.gz |
Tweaked parse_chmod() so that it takes a pointer to an existing list
of chmod items (or NULL) and appends the new items onto the end.
Diffstat (limited to 'chmod.c')
-rw-r--r-- | chmod.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -23,12 +23,13 @@ struct chmod_mode_struct { /* Parse a chmod-style argument, and break it down into one or more AND/OR * pairs in a linked list. We use a state machine to walk through the * options. */ -struct chmod_mode_struct *parse_chmod(char *modestr) +struct chmod_mode_struct *parse_chmod(const char *modestr, + struct chmod_mode_struct *append_to) { int state = STATE_1ST_HALF; int where = 0, what = 0, op = 0, topbits = 0, topoct = 0, flags = 0; struct chmod_mode_struct *first_mode = NULL, *curr_mode = NULL, - *prev_mode = NULL; + *prev_mode = NULL; while (state != STATE_ERROR) { if (!*modestr || *modestr == ',') { @@ -153,8 +154,16 @@ struct chmod_mode_struct *parse_chmod(char *modestr) if (state == STATE_ERROR) { free_chmod_mode(first_mode); - first_mode = NULL; + return NULL; } + + if (append_to) { + for (prev_mode = append_to; prev_mode->next; ) + prev_mode = prev_mode->next; + prev_mode->next = first_mode; + return append_to; + } + return first_mode; } |