Как получить разрешение на чтение в недавно созданной папке и файле в C? - PullRequest
1 голос
/ 21 ноября 2008

Я создал папку, и после того, как я открыл в ней файл, напишите на него. Бывает, что после этого я пытаюсь открыть файл, но у меня нет прав, поэтому я должен изменить его вручную.

/* str1 has tha name of the folder */
/* str the bytes I want to write in the file inside the folder*/
...

   mkdir(str1,0777);    
   if (filefd < 0) { 

      strncpy(auxstr, str, MAX_MSG + 1);
      strcat(str1,"\\");
      strcat(str1, auxstr);
      filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC);

      nbytes -= (strlen(str) + 1);
      memcpy(auxstr, &str[strlen(str)+1], nbytes); 
      memcpy(str, auxstr, nbytes);

   }

   /*write to the file */
   if ((nwritten = write(filefd, str, nbytes)) != nbytes) {
       printf ("can't write on file\n");
       break;
   }

Что я должен изменить, чтобы иметь права на открытие созданного файла?

Большое спасибо,


: S

с = 0_CREATE У меня все еще есть проблема отсутствия прав на чтение файла. Я должен установить их вручную


И у меня уже есть 0_CREAT на открытии

открыто (str1, O_RDWR | O_CREAT | O_TRUNC);

Ответы [ 4 ]

5 голосов
/ 21 ноября 2008

Вы забыли третий аргумент для open().

Третий аргумент open() с O_CREAT - это именно те разрешения, которые будут иметь вновь создаваемый файл.

Ссылки:

3 голосов
/ 25 ноября 2008

О БЕЗОПАСНОСТИ

В вопросе используется разрешение 0777 для каталога - не делайте! При обычном ходе событий не следует создавать каталог с разрешением 0777. Вы можете рассмотреть возможность использования 01777, как вы найдете на /tmp; грубо говоря, это гарантирует, что люди, удаляющие файл из каталога, имеют разрешение на изменение файла. Но вы не должны предоставлять всем разрешение на удаление любого файла из каталога. И утверждение, что настройка umask защитит вас, хотя, вероятно, и правильно, все еще не является хорошим оправданием для того, чтобы испортить жизнь тем, кто не знает, как ее настроить безопасно. Используйте 0755 или, возможно, 0775, но не 0777.

В одном из ответов используется разрешение 0777 для файла - не! Аргумент похож на аргумент для каталогов, с добавлением предостережения о том, что большинство людей не создают исполняемые файлы при создании файлов (компоновщик) авторы были бы исключением из этого общего правила), и независимо от того, должен ли полученный файл быть исполняемым, все равно остается поразительно плохой идеей позволить кому-либо изменять программу. Используйте 0644 или 0664; редко есть веская причина для использования 0666, и еще реже веская причина для использования 0777.

3 голосов
/ 21 ноября 2008

CesarB пытается вам сказать, что вам нужно предоставить разрешения в качестве третьего аргумента:

filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC, 0777);

И, пожалуйста, используйте «добавить комментарий», чтобы ответить, вместо создания нового ответа на свой вопрос.

0 голосов
/ 25 ноября 2008

Проблема в том, что вы используете неправильный разделитель пути - вы пытаетесь использовать обратную косую черту '\\' для разделения компонентов. Это разделитель пути для Windows. Поскольку вы, похоже, используете операционную систему на основе * nix, вы должны использовать косую черту '/' в качестве разделителя пути. На самом деле, даже в Windows вы должны использовать прямую косую черту, поскольку она более переносима - Windows автоматически преобразует прямую косую черту в обратную косую черту.

В результате вы пытаетесь создать файл с именем «foo \ bar» в текущем каталоге, и это, вероятно, не удается, поскольку у вас нет прав для создания файла в текущем каталоге.

...