Apply patch: ncpfs-hg-commit-445.patch
This commit is contained in:
112
lib/strops.c
112
lib/strops.c
@@ -44,6 +44,7 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "private/libintl.h"
|
||||
#define _(X) dgettext(NCPFS_PACKAGE, (X))
|
||||
@@ -419,56 +420,79 @@ char* ncp_perms_to_str(char r[11], const u_int16_t rights)
|
||||
}
|
||||
|
||||
/* The following function converts a rights string of format [SRWCEMFA]
|
||||
into an integer. It will tolerate spaces, lower case and repeated
|
||||
letters, even if this takes the length well over 10 characters, but
|
||||
must be terminated with square brackets. If such a string containing
|
||||
spaces is given as a command line option it will have to be quoted. */
|
||||
or SRWCEMFA into an integer. It will tolerate spaces, lower case and
|
||||
repeated letters, even if this takes the length well over 10 characters.
|
||||
For unset rights you can use spaces or dashes. For no rights you can
|
||||
use either empty string, '-' or '[]' (or their combination, '[-]' or '[ ]'). */
|
||||
|
||||
int ncp_str_to_perms(const char *r, u_int16_t *rights)
|
||||
{
|
||||
u_int16_t result = 0;
|
||||
int state = 0;
|
||||
|
||||
if (*r == '[') {
|
||||
do {
|
||||
++r;
|
||||
switch (*r) {
|
||||
case ' ' :
|
||||
case ']' :
|
||||
break;
|
||||
case 's' :
|
||||
case 'S' :
|
||||
result |= NCP_PERM_SUPER; break;
|
||||
case 'r' :
|
||||
case 'R' :
|
||||
result |= NCP_PERM_READ; break;
|
||||
case 'w' :
|
||||
case 'W' :
|
||||
result |= NCP_PERM_WRITE; break;
|
||||
case 'c' :
|
||||
case 'C' :
|
||||
result |= NCP_PERM_CREATE; break;
|
||||
case 'e' :
|
||||
case 'E' :
|
||||
result |= NCP_PERM_DELETE; break;
|
||||
case 'm' :
|
||||
case 'M' :
|
||||
result |= NCP_PERM_MODIFY; break;
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
result |= NCP_PERM_SEARCH; break;
|
||||
case 'a' :
|
||||
case 'A' :
|
||||
result |= NCP_PERM_OWNER; break;
|
||||
default :
|
||||
return -1;
|
||||
}
|
||||
} while (*r != ']');
|
||||
/* Now to be generous and ignore trailing spaces */
|
||||
do { ++r; } while (*r == ' ');
|
||||
if (*r == '\0') {
|
||||
*rights = result;
|
||||
return 0;
|
||||
while (*r) {
|
||||
int c = *r++;
|
||||
|
||||
c = toupper(c);
|
||||
if (isspace(c)) {
|
||||
continue;
|
||||
}
|
||||
switch (c) {
|
||||
case '[':
|
||||
if (state != 0) {
|
||||
return -1;
|
||||
}
|
||||
state = 2;
|
||||
continue;
|
||||
case ']':
|
||||
if (state != 2 && state != 3) {
|
||||
return -1;
|
||||
}
|
||||
state = 4;
|
||||
continue;
|
||||
case '-':
|
||||
break;
|
||||
case 'S':
|
||||
result |= NCP_PERM_SUPER;
|
||||
break;
|
||||
case 'R':
|
||||
result |= NCP_PERM_READ;
|
||||
break;
|
||||
case 'W':
|
||||
result |= NCP_PERM_WRITE;
|
||||
break;
|
||||
case 'C':
|
||||
result |= NCP_PERM_CREATE;
|
||||
break;
|
||||
case 'E':
|
||||
result |= NCP_PERM_DELETE;
|
||||
break;
|
||||
case 'M':
|
||||
result |= NCP_PERM_MODIFY;
|
||||
break;
|
||||
case 'F':
|
||||
result |= NCP_PERM_SEARCH;
|
||||
break;
|
||||
case 'A':
|
||||
result |= NCP_PERM_OWNER;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
state |= 1;
|
||||
}
|
||||
/* These states are illegal:
|
||||
state == 2 => [
|
||||
state == 3 => [SRWCEMFA
|
||||
state == 5 => [SRWCEMFA]SRW
|
||||
These states are allowed:
|
||||
state == 0 => <whitespaces only>
|
||||
state == 1 => SRWCEMFA
|
||||
state == 4 => [SRWCEMFA]
|
||||
*/
|
||||
if (state == 0 || state == 1 || state == 4) {
|
||||
*rights = result;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user