|
|
| version 1.1, 2012/02/17 15:09:30 | version 1.1.1.4, 2021/03/17 00:32:36 |
|---|---|
| Line 2 | Line 2 |
| * Implement the core of the --chmod option. | * Implement the core of the --chmod option. |
| * | * |
| * Copyright (C) 2002 Scott Howard | * Copyright (C) 2002 Scott Howard |
| * Copyright (C) 2005-2009 Wayne Davison | * Copyright (C) 2005-2020 Wayne Davison |
| * | * |
| * This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |
| Line 19 | Line 19 |
| */ | */ |
| #include "rsync.h" | #include "rsync.h" |
| #include "itypes.h" | |
| extern mode_t orig_umask; | extern mode_t orig_umask; |
| Line 35 struct chmod_mode_struct { | Line 36 struct chmod_mode_struct { |
| #define CHMOD_ADD 1 | #define CHMOD_ADD 1 |
| #define CHMOD_SUB 2 | #define CHMOD_SUB 2 |
| #define CHMOD_EQ 3 | #define CHMOD_EQ 3 |
| #define CHMOD_SET 4 | |
| #define STATE_ERROR 0 | #define STATE_ERROR 0 |
| #define STATE_1ST_HALF 1 | #define STATE_1ST_HALF 1 |
| #define STATE_2ND_HALF 2 | #define STATE_2ND_HALF 2 |
| #define STATE_OCTAL_NUM 3 | |
| /* Parse a chmod-style argument, and break it down into one or more AND/OR | /* Parse a chmod-style argument, and break it down into one or more AND/OR |
| * pairs in a linked list. We return a pointer to new items on succcess | * pairs in a linked list. We return a pointer to new items on success |
| * (appending the items to the specified list), or NULL on error. */ | * (appending the items to the specified list), or NULL on error. */ |
| struct chmod_mode_struct *parse_chmod(const char *modestr, | struct chmod_mode_struct *parse_chmod(const char *modestr, |
| struct chmod_mode_struct **root_mode_ptr) | struct chmod_mode_struct **root_mode_ptr) |
| Line 87 struct chmod_mode_struct *parse_chmod(const char *mode | Line 90 struct chmod_mode_struct *parse_chmod(const char *mode |
| curr_mode->ModeAND = CHMOD_BITS - (where * 7) - (topoct ? topbits : 0); | curr_mode->ModeAND = CHMOD_BITS - (where * 7) - (topoct ? topbits : 0); |
| curr_mode->ModeOR = bits + topoct; | curr_mode->ModeOR = bits + topoct; |
| break; | break; |
| case CHMOD_SET: | |
| curr_mode->ModeAND = 0; | |
| curr_mode->ModeOR = bits; | |
| break; | |
| } | } |
| curr_mode->flags = flags; | curr_mode->flags = flags; |
| Line 99 struct chmod_mode_struct *parse_chmod(const char *mode | Line 106 struct chmod_mode_struct *parse_chmod(const char *mode |
| where = what = op = topoct = topbits = flags = 0; | where = what = op = topoct = topbits = flags = 0; |
| } | } |
| if (state != STATE_2ND_HALF) { | switch (state) { |
| case STATE_1ST_HALF: | |
| switch (*modestr) { | switch (*modestr) { |
| case 'D': | case 'D': |
| if (flags & FLAG_FILES_ONLY) | if (flags & FLAG_FILES_ONLY) |
| Line 138 struct chmod_mode_struct *parse_chmod(const char *mode | Line 146 struct chmod_mode_struct *parse_chmod(const char *mode |
| state = STATE_2ND_HALF; | state = STATE_2ND_HALF; |
| break; | break; |
| default: | default: |
| state = STATE_ERROR; | if (isDigit(modestr) && *modestr < '8' && !where) { |
| op = CHMOD_SET; | |
| state = STATE_OCTAL_NUM; | |
| where = 1; | |
| what = *modestr - '0'; | |
| } else | |
| state = STATE_ERROR; | |
| break; | break; |
| } | } |
| } else { | break; |
| case STATE_2ND_HALF: | |
| switch (*modestr) { | switch (*modestr) { |
| case 'r': | case 'r': |
| what |= 4; | what |= 4; |
| Line 168 struct chmod_mode_struct *parse_chmod(const char *mode | Line 183 struct chmod_mode_struct *parse_chmod(const char *mode |
| state = STATE_ERROR; | state = STATE_ERROR; |
| break; | break; |
| } | } |
| break; | |
| case STATE_OCTAL_NUM: | |
| if (isDigit(modestr) && *modestr < '8') { | |
| what = what*8 + *modestr - '0'; | |
| if (what > CHMOD_BITS) | |
| state = STATE_ERROR; | |
| } else | |
| state = STATE_ERROR; | |
| break; | |
| } | } |
| modestr++; | modestr++; |
| } | } |