Diff for /embedaddon/rsync/chmod.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2012/02/17 15:09:30 version 1.1.1.2, 2013/10/14 07:51:14
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-2013 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 succcess
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++;
         }          }

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>