Справочник по консольным командам Toybox для Android 12


  Ver.0.8.4     Ver.0.8.9     Pending  

Путь: Toys/POSIX, команды версии: Ver.4     Ver.9


chmod

Комментарии в файле chmod.c :

usage: chmod [-R] MODE FILE...

Изменить режим перечисленных файлов (рекурсивно с -R). MODE может быть (через запятую) строфами: [ugoa][+-=][rwxstXugo] Стансы применяются в следующем порядке: Для каждой категории (u = пользователь, g = группа, o = другое, a = все три, если ни один не указан, по умолчанию используется a), установить (+), очистить (-) или скопировать (=), r = прочитать, w = записать, x = выполнить. s = u+s = suid, g+s = sgid, +t = липкий. (o+s игнорируется, поэтому a+s не устанавливает +t) suid/sgid: выполнить от имени пользователя/группы, которому принадлежит файл. sticky: нельзя удалять из этого каталога файлы, которыми вы не владеете X = x для каталогов или если для какой-либо категории уже установлен x. Или MODE может быть восьмеричным значением до 7777 ug uuugggooo top + бит 1 = o+x, бит 1<<8 = u+w, 1<<11 = g+1 sstrwxrwxrwx нижний Примеры: chmod u+w file - разрешить владельцу "файла" писать в него. файл chmod 744 - пользователь может читать/записывать/выполнять, все остальные только для чтения


usage: chmod [-R] MODE FILE...

Change mode of listed file[s] (recursively with -R). MODE can be (comma-separated) stanzas: [ugoa][+-=][rwxstXugo] Stanzas are applied in order: For each category (u = user, g = group, o = other, a = all three, if none specified default is a), set (+), clear (-), or copy (=), r = read, w = write, x = execute. s = u+s = suid, g+s = sgid, +t = sticky. (o+s ignored so a+s doesn't set +t) suid/sgid: execute as the user/group who owns the file. sticky: can't delete files you don't own out of this directory X = x for directories or if any category already has x set. Or MODE can be an octal value up to 7777 ug uuugggooo top + bit 1 = o+x, bit 1<<8 = u+w, 1<<11 = g+1 sstrwxrwxrwx bottom Examples: chmod u+w file - allow owner of "file" to write to it. chmod 744 file - user can read/write/execute, everyone else read only


Исходный текст в файле chmod.c

#define FOR_chmod
#include "toys.h"

GLOBALS(
  char *mode;
)

static int do_chmod(struct dirtree *try)
{
  mode_t mode;

  if (!dirtree_notdotdot(try)) return 0;

  if (FLAG(R) && try->parent && S_ISLNK(try->st.st_mode)) {
    // Ignore symlinks found during recursion. We'll only try to modify
    // symlinks mentioned directly as arguments. We'll fail, of course,
    // but that's what you asked for in that case.
  } else {
    mode = string_to_mode(TT.mode, try->st.st_mode) & ~S_IFMT;
    if (FLAG(v)) {
      char *s = dirtree_path(try, 0);

      printf("chmod '%s' to %s\n", s, TT.mode);
      free(s);
    }
    wfchmodat(dirtree_parentfd(try), try->name, mode);
  }

  return FLAG(R)*DIRTREE_RECURSE;
}

void chmod_main(void)
{
  TT.mode = *toys.optargs;
  char **file;

  for (file = toys.optargs+1; *file; file++) dirtree_read(*file, do_chmod);
}