X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0c983c1fd451ed50cc16b1fdba7f1a1ca3268fba..81b096feef3773dfd17e384ffb9328287cdcea94:/chmod.c diff --git a/chmod.c b/chmod.c index 95b21999..8a6adfd8 100644 --- a/chmod.c +++ b/chmod.c @@ -23,12 +23,12 @@ 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) +int parse_chmod(const char *modestr, struct chmod_mode_struct **root_mode_ptr) { 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,9 +153,18 @@ struct chmod_mode_struct *parse_chmod(char *modestr) if (state == STATE_ERROR) { free_chmod_mode(first_mode); - first_mode = NULL; + return 0; } - return first_mode; + + if (!(curr_mode = *root_mode_ptr)) + *root_mode_ptr = first_mode; + else { + while (curr_mode->next) + curr_mode = curr_mode->next; + curr_mode->next = first_mode; + } + + return 1; }