X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Futilities%2Fpermissions.c;h=771eb72832dd1de27304976879eb931cb29350e5;hb=5e2aadfa3a7df06abf118bdac7e663d58fd52877;hp=83fa820c562d3be6473ef70afa49dd95a5b6ecc6;hpb=81579d9e9f994fb2908f50af41c3eb033d216e58;p=pspp diff --git a/src/language/utilities/permissions.c b/src/language/utilities/permissions.c index 83fa820c56..771eb72832 100644 --- a/src/language/utilities/permissions.c +++ b/src/language/utilities/permissions.c @@ -25,6 +25,8 @@ #include "data/settings.h" #include "language/command.h" #include "language/lexer/lexer.h" +#include "libpspp/cast.h" +#include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/str.h" @@ -41,44 +43,44 @@ int change_permissions(const char *file_name, enum PER per); int cmd_permissions (struct lexer *lexer, struct dataset *ds UNUSED) { - char *fn = 0; - + char *fn = NULL; + const char *str = NULL; lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "FILE")) lex_match (lexer, T_EQUALS); - if (!lex_force_string (lexer)) - return CMD_FAILURE; - - fn = ss_xstrdup (lex_tokss (lexer)); - lex_force_match (lexer, T_STRING); + str = lex_tokcstr (lexer); + if (str) + fn = strdup (str); + if (!lex_force_match (lexer, T_STRING) || str == NULL) + goto error; lex_match (lexer, T_SLASH); - if ( ! lex_match_id (lexer, "PERMISSIONS")) + if (! lex_match_id (lexer, "PERMISSIONS")) goto error; lex_match (lexer, T_EQUALS); - if ( lex_match_id (lexer, "READONLY")) + if (lex_match_id (lexer, "READONLY")) { - if ( ! change_permissions(fn, PER_RO ) ) + if (! change_permissions (fn, PER_RO)) goto error; } - else if ( lex_match_id (lexer, "WRITEABLE")) + else if (lex_match_id (lexer, "WRITEABLE")) { - if ( ! change_permissions(fn, PER_RW ) ) + if (! change_permissions (fn, PER_RW)) goto error; } else { - msg (SE, _("Expecting %s or %s."), "WRITEABLE", "READONLY"); + lex_error_expecting (lexer, "WRITEABLE", "READONLY"); goto error; } - free(fn); + free (fn); return CMD_SUCCESS; @@ -94,35 +96,40 @@ cmd_permissions (struct lexer *lexer, struct dataset *ds UNUSED) int change_permissions (const char *file_name, enum PER per) { + char *locale_file_name; struct stat buf; mode_t mode; if (settings_get_safer_mode ()) { - msg (SE, _("This command not allowed when the SAFER option is set.")); - return CMD_FAILURE; + msg (SE, _("This command not allowed when the %s option is set."), "SAFER"); + return 0; } - - if ( -1 == stat(file_name, &buf) ) + locale_file_name = utf8_to_filename (file_name); + if (-1 == stat(locale_file_name, &buf)) { const int errnum = errno; msg (SE, _("Cannot stat %s: %s"), file_name, strerror(errnum)); + free (locale_file_name); return 0; } - if ( per == PER_RW ) + if (per == PER_RW) mode = buf.st_mode | 0200; else mode = buf.st_mode & ~0222; - if ( -1 == chmod(file_name, mode)) + if (-1 == chmod(locale_file_name, mode)) { const int errnum = errno; msg (SE, _("Cannot change mode of %s: %s"), file_name, strerror(errnum)); + free (locale_file_name); return 0; } + free (locale_file_name); + return 1; }