X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Flanguage%2Futilities%2Fpermissions.c;h=a52cd198aa2c8aa15d8698806f677124d38c696e;hb=eb06da6a334bc37108cdce9bfc7f26cfcb2003ee;hp=967b1bd2a1c314cca681dd78516084fd30921994;hpb=a258e53c63a08b0ec48aea8f03808eb651729424;p=pspp diff --git a/src/language/utilities/permissions.c b/src/language/utilities/permissions.c index 967b1bd2a1..a52cd198aa 100644 --- a/src/language/utilities/permissions.c +++ b/src/language/utilities/permissions.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004, 2010 Free Software Foundation, Inc. + Copyright (C) 2004, 2010, 2011 Free Software Foundation, Inc. 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 @@ -15,18 +15,21 @@ along with this program. If not, see . */ #include -#include + +#include #include -#include #include +#include #include -#include -#include -#include -#include -#include -#include -#include + +#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" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -42,24 +45,24 @@ cmd_permissions (struct lexer *lexer, struct dataset *ds UNUSED) { char *fn = 0; - lex_match (lexer, '/'); + lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "FILE")) - lex_match (lexer, '='); + lex_match (lexer, T_EQUALS); if (!lex_force_string (lexer)) return CMD_FAILURE; - fn = ds_xstrdup (lex_tokstr (lexer)); + fn = ss_xstrdup (lex_tokss (lexer)); lex_force_match (lexer, T_STRING); - lex_match (lexer, '/'); + lex_match (lexer, T_SLASH); if ( ! lex_match_id (lexer, "PERMISSIONS")) goto error; - lex_match (lexer, '='); + lex_match (lexer, T_EQUALS); if ( lex_match_id (lexer, "READONLY")) { @@ -73,7 +76,7 @@ cmd_permissions (struct lexer *lexer, struct dataset *ds UNUSED) } else { - msg (SE, _("Expecting %s or %s."), "WRITEABLE", "READONLY"); + lex_error_expecting (lexer, "WRITEABLE", "READONLY", NULL_SENTINEL); goto error; } @@ -93,20 +96,23 @@ 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; } @@ -115,13 +121,16 @@ change_permissions (const char *file_name, enum PER per) 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; }