diff options
Diffstat (limited to 'toys/pending/stat.c')
| -rw-r--r-- | toys/pending/stat.c | 416 | 
1 files changed, 208 insertions, 208 deletions
| diff --git a/toys/pending/stat.c b/toys/pending/stat.c index 9aae9035..6781e53b 100644 --- a/toys/pending/stat.c +++ b/toys/pending/stat.c @@ -5,44 +5,44 @@  USE_STAT(NEWTOY(stat, "LZfc", TOYFLAG_BIN))   config STAT -    bool stat -    default n -    help -        Usage: stat [OPTION] FILE... -        display file or file system status -        -Z, --context +  bool stat +  default n +  help +    Usage: stat [OPTION] FILE... +    display file or file system status +    -Z, --context               print the security context information if available -        -f, --file-system -            display file system status instead of file status -        -c  --format=FORMAT -            use the specified FORMAT instead of the default; output a newline after each use of FORMAT -        --help display this help and exit -        The valid format sequences for files (without --file-system): -        %a     Access rights in octal -        %A     Access rights in human readable form -        %b     Number of blocks allocated (see -        %B     The size in bytes of each block reported by -        %d     Device number in decimal -        %D     Device number in hex -        %f     Raw mode in hex -        %F     File type -        %G     Group name of owner -        %h     Number of hard links -        %i     Inode number -        %n     File name -        %N     Quoted file name with dereference if symbolic link -        %o     I/O block size -        %s     Total size, in bytes -        %t     Major device type in hex -        %T     Minor device type in hex -        %u     User ID of owner -        %U     User name of owner -        %x     Time of last access -        %X     Time of last access as seconds since Epoch -        %y     Time of last modification -        %Y     Time of last modification as seconds since Epoch -        %z     Time of last change -        %Z     Time of last change as seconds since Epoch +    -f, --file-system +      display file system status instead of file status +    -c  --format=FORMAT +      use the specified FORMAT instead of the default; output a newline after each use of FORMAT +    --help display this help and exit +    The valid format sequences for files (without --file-system): +    %a     Access rights in octal +    %A     Access rights in human readable form +    %b     Number of blocks allocated (see +    %B     The size in bytes of each block reported by +    %d     Device number in decimal +    %D     Device number in hex +    %f     Raw mode in hex +    %F     File type +    %G     Group name of owner +    %h     Number of hard links +    %i     Inode number +    %n     File name +    %N     Quoted file name with dereference if symbolic link +    %o     I/O block size +    %s     Total size, in bytes +    %t     Major device type in hex +    %T     Minor device type in hex +    %u     User ID of owner +    %U     User name of owner +    %x     Time of last access +    %X     Time of last access as seconds since Epoch +    %y     Time of last modification +    %Y     Time of last modification as seconds since Epoch +    %z     Time of last change +    %Z     Time of last change as seconds since Epoch  */  #define FOR_stat @@ -81,207 +81,207 @@ GLOBALS(  static void do_stat(const char * file_name)  { -    TT.toystat = xmalloc(sizeof(struct stat)); -    if (stat(file_name, TT.toystat) < 0) perror_msg("stat: '%s'", file_name); +  TT.toystat = xmalloc(sizeof(struct stat)); +  if (stat(file_name, TT.toystat) < 0) perror_msg("stat: '%s'", file_name);  }  static void do_statfs(const char * file_name)  { -    TT.toystatfs = xmalloc(sizeof(struct statfs)); -    if (statfs(file_name, TT.toystatfs) < 0) -        perror_msg("statfs: '%s'", file_name); +  TT.toystatfs = xmalloc(sizeof(struct statfs)); +  if (statfs(file_name, TT.toystatfs) < 0) +    perror_msg("statfs: '%s'", file_name);  }  static char * check_type_file(mode_t mode, size_t size)  { -    if (S_ISREG(mode)) { -        if (size) return "regular file"; -        return "regular empty file"; -    } -    if (S_ISDIR(mode)) return "directory";  -    if (S_ISCHR(mode)) return "character device"; -    if (S_ISBLK(mode)) return "block device"; -    if (S_ISFIFO(mode)) return "FIFO (named pipe)"; -    if (S_ISLNK(mode)) return "symbolic link"; -    if (S_ISSOCK(mode)) return "socket"; +  if (S_ISREG(mode)) { +    if (size) return "regular file"; +    return "regular empty file"; +  } +  if (S_ISDIR(mode)) return "directory";  +  if (S_ISCHR(mode)) return "character device"; +  if (S_ISBLK(mode)) return "block device"; +  if (S_ISFIFO(mode)) return "FIFO (named pipe)"; +  if (S_ISLNK(mode)) return "symbolic link"; +  if (S_ISSOCK(mode)) return "socket";  }  static char * get_access_str(unsigned long pernission, mode_t mode)  { -    static char access_string[10]; -    int i; +  static char access_string[10]; +  int i; -    if (S_ISDIR(mode)) access_string[0] = 'd'; -    else access_string[0] = '-'; -    for (i = 0; i < 3; i++) -        access_string(pernission >> (i * 3) & 7, access_string, i); +  if (S_ISDIR(mode)) access_string[0] = 'd'; +  else access_string[0] = '-'; +  for (i = 0; i < 3; i++) +    access_string(pernission >> (i * 3) & 7, access_string, i); -    access_string[10] = '\0'; -    return access_string; +  access_string[10] = '\0'; +  return access_string;  }  static char * date_stat_format(time_t time)  { -    static char buf[SIZE_DATE_TIME_STAT]; +  static char buf[SIZE_DATE_TIME_STAT]; -    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S.000000000", localtime(&time)); -    return buf; +  strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S.000000000", localtime(&time)); +  return buf;  }  inline void print_stat_format(char *format, int flag)  { -    format++; -    switch (*format) { -        case 'a': -            if (flag) xprintf("%lu\n", TT.toystatfs->f_bavail); -            else xprintf("%04lo\n",TT.toystat->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)); -            break; -        case 'A': -            xprintf("%s\n",TT.access_str); -            break; -        case 'b': -            if (flag) xprintf("%lu\n", TT.toystatfs->f_blocks); -            else xprintf("%llu\n", TT.toystat->st_blocks); -            break; -        case 'B': -            xprintf("%lu\n", TT.toystat->st_blksize); -            break; -        case 'c': -            if (flag) xprintf("%lu\n", TT.toystatfs->f_files); -            break; -        case 'C': -            xprintf("Currently feature is not supported\n"); -            break; -        case 'd': -            if (flag) xprintf("%lu\n", TT.toystatfs->f_ffree); -            else xprintf("%ldd\n", TT.toystat->st_dev); -            break; -        case 'D': -            xprintf("%llxh\n", TT.toystat->st_dev); -            break; -        case 'f': -            if (flag) xprintf("%lu\n", TT.toystatfs->f_bfree); -            else xprintf("%lx\n", TT.toystat->st_mode); -            break; -        case 'F': -            xprintf("%s\n", TT.file_type); -            break; -        case 'g': -            xprintf("%lu\n", TT.toystat->st_uid); -            break; -        case 'G': -            xprintf("%8s\n", TT.user_name->pw_name); -            break; -        case 'h': -            xprintf("%lu\n", TT.toystat->st_nlink); -            break; -        case 'i': -            if (flag) -                xprintf("%d%d\n", TT.toystatfs->f_fsid.__val[0], TT.toystatfs->f_fsid.__val[1]); -            else xprintf("%llu\n", TT.toystat->st_ino); -            break; -        case 'l': -            if (flag) xprintf("need to implement\n"); -            break; -        case 'n': -            xprintf("%s\n", toys.optargs[TT.toy_obj_file_arg]); -            break; -        case 'N': -            xprintf("`%s\n'", toys.optargs[TT.toy_obj_file_arg]); -            break; -        case 'o': -            xprintf("%lu\n", TT.toystat->st_blksize); -            break; -        case 's': -            if (flag) xprintf("%d\n", TT.toystatfs->f_frsize); -            else xprintf("%llu\n", TT.toystat->st_size); -            break; -        case 'S': -            if (flag) xprintf("%d\n", TT.toystatfs->f_bsize); -            break; -        case 't': -            if (flag) xprintf("%lx\n", TT.toystatfs->f_type); -            break; -        case 'T': -            if (flag) xprintf("Needs to be implemented\n"); -            break; -        case 'u': -            xprintf("%lu\n", TT.toystat->st_uid); -            break; -        case 'U': -            xprintf("%8s\n", TT.user_name->pw_name); -            break; -        case 'x': -            xprintf("%s\n", date_stat_format(TT.toystat->st_atime)); -            break; -        case 'X': -            xprintf("%llu\n", TT.toystat->st_atime); -            break; -        case 'y': -            xprintf("%s\n", date_stat_format(TT.toystat->st_mtime)); -            break; -        case 'Y': -            xprintf("%llu\n", TT.toystat->st_mtime); -            break; -        case 'z': -            xprintf("%s\n", date_stat_format(TT.toystat->st_ctime)); -            break; -        case 'Z': -            xprintf("%llu\n", TT.toystat->st_ctime); -        default: -            xprintf("%c\n", *format); -            break; -    } -    exit(0); +  format++; +  switch (*format) { +    case 'a': +      if (flag) xprintf("%lu\n", TT.toystatfs->f_bavail); +      else xprintf("%04lo\n",TT.toystat->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)); +      break; +    case 'A': +      xprintf("%s\n",TT.access_str); +      break; +    case 'b': +      if (flag) xprintf("%lu\n", TT.toystatfs->f_blocks); +      else xprintf("%llu\n", TT.toystat->st_blocks); +      break; +    case 'B': +      xprintf("%lu\n", TT.toystat->st_blksize); +      break; +    case 'c': +      if (flag) xprintf("%lu\n", TT.toystatfs->f_files); +      break; +    case 'C': +      xprintf("Currently feature is not supported\n"); +      break; +    case 'd': +      if (flag) xprintf("%lu\n", TT.toystatfs->f_ffree); +      else xprintf("%ldd\n", TT.toystat->st_dev); +      break; +    case 'D': +      xprintf("%llxh\n", TT.toystat->st_dev); +      break; +    case 'f': +      if (flag) xprintf("%lu\n", TT.toystatfs->f_bfree); +      else xprintf("%lx\n", TT.toystat->st_mode); +      break; +    case 'F': +      xprintf("%s\n", TT.file_type); +      break; +    case 'g': +      xprintf("%lu\n", TT.toystat->st_uid); +      break; +    case 'G': +      xprintf("%8s\n", TT.user_name->pw_name); +      break; +    case 'h': +      xprintf("%lu\n", TT.toystat->st_nlink); +      break; +    case 'i': +      if (flag) +        xprintf("%d%d\n", TT.toystatfs->f_fsid.__val[0], TT.toystatfs->f_fsid.__val[1]); +      else xprintf("%llu\n", TT.toystat->st_ino); +      break; +    case 'l': +      if (flag) xprintf("need to implement\n"); +      break; +    case 'n': +      xprintf("%s\n", toys.optargs[TT.toy_obj_file_arg]); +      break; +    case 'N': +      xprintf("`%s\n'", toys.optargs[TT.toy_obj_file_arg]); +      break; +    case 'o': +      xprintf("%lu\n", TT.toystat->st_blksize); +      break; +    case 's': +      if (flag) xprintf("%d\n", TT.toystatfs->f_frsize); +      else xprintf("%llu\n", TT.toystat->st_size); +      break; +    case 'S': +      if (flag) xprintf("%d\n", TT.toystatfs->f_bsize); +      break; +    case 't': +      if (flag) xprintf("%lx\n", TT.toystatfs->f_type); +      break; +    case 'T': +      if (flag) xprintf("Needs to be implemented\n"); +      break; +    case 'u': +      xprintf("%lu\n", TT.toystat->st_uid); +      break; +    case 'U': +      xprintf("%8s\n", TT.user_name->pw_name); +      break; +    case 'x': +      xprintf("%s\n", date_stat_format(TT.toystat->st_atime)); +      break; +    case 'X': +      xprintf("%llu\n", TT.toystat->st_atime); +      break; +    case 'y': +      xprintf("%s\n", date_stat_format(TT.toystat->st_mtime)); +      break; +    case 'Y': +      xprintf("%llu\n", TT.toystat->st_mtime); +      break; +    case 'z': +      xprintf("%s\n", date_stat_format(TT.toystat->st_ctime)); +      break; +    case 'Z': +      xprintf("%llu\n", TT.toystat->st_ctime); +    default: +      xprintf("%c\n", *format); +      break; +  } +  exit(0);  }  void stat_main(void)  { -    int stat_flag_Z = 0, stat_flag_f = 0, stat_flag_c = 0, stat_format = 0; +  int stat_flag_Z = 0, stat_flag_f = 0, stat_flag_c = 0, stat_format = 0; -    if (toys.optargs) { -        if (toys.optflags & 1) { -            stat_flag_c = 1; -            TT.toy_obj_file_arg = 1; -            stat_format = 1; -        } -        if (toys.optflags & (1 << 1)) { -            stat_flag_f = 1; -            do_statfs(toys.optargs[TT.toy_obj_file_arg]); -        } else do_stat(toys.optargs[TT.toy_obj_file_arg]); -        if (toys.optflags & (1 << 2)) { -            stat_flag_Z = 1; -            xprintf("SELinux feature has not been implemented so far..\n"); -        } +  if (toys.optargs) { +    if (toys.optflags & 1) { +      stat_flag_c = 1; +      TT.toy_obj_file_arg = 1; +      stat_format = 1; +    } +    if (toys.optflags & (1 << 1)) { +      stat_flag_f = 1; +      do_statfs(toys.optargs[TT.toy_obj_file_arg]); +    } else do_stat(toys.optargs[TT.toy_obj_file_arg]); +    if (toys.optflags & (1 << 2)) { +      stat_flag_Z = 1; +      xprintf("SELinux feature has not been implemented so far..\n");      } +  }  // function to check the type/mode of file -    if (!stat_flag_f) { -        TT.file_type = check_type_file(TT.toystat->st_mode, TT.toystat->st_size); +  if (!stat_flag_f) { +    TT.file_type = check_type_file(TT.toystat->st_mode, TT.toystat->st_size);  // check user and group name -        TT.user_name = getpwuid(TT.toystat->st_uid); -        TT.group_name = getgrgid(TT.toystat->st_gid); +    TT.user_name = getpwuid(TT.toystat->st_uid); +    TT.group_name = getgrgid(TT.toystat->st_gid);  // function to get access in human readable format -        TT.access_str = get_access_str((TT.toystat->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)), TT.toystat->st_mode); -        TT.time_toy = gmtime(&(TT.toystat->st_atime)); -    } -    if (!(stat_flag_f |stat_flag_Z)) { -        if (stat_format) print_stat_format(toys.optargs[0], stat_flag_f); -        xprintf(" File: `%s'\n", toys.optargs[TT.toy_obj_file_arg]); -        xprintf(" Size: %llu\t Blocks: %llu\t IO Blocks: %lu\t", TT.toystat->st_size, TT.toystat->st_blocks, TT.toystat->st_blksize); -        xprintf("%s\n", TT.file_type); -        xprintf("Device: %llxh\t Inode: %llu\t Links: %lu\n", TT.toystat->st_dev, TT.toystat->st_ino, TT.toystat->st_nlink); -        xprintf("Access: (%04lo/%s)\tUid: (%lu/%8s)\tGid: (%lu/%8s)\n", (TT.toystat->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)), TT.access_str, TT.toystat->st_uid, TT.user_name->pw_name, TT.toystat->st_gid, TT.group_name->gr_name); -        xprintf("Access: %s\nModify: %s\nChange: %s\n", date_stat_format(TT.toystat->st_atime), date_stat_format(TT.toystat->st_mtime), date_stat_format(TT.toystat->st_ctime)); -    } else if (stat_flag_f) { -        // implementation of statfs -f, file system -        if (stat_format) print_stat_format(toys.optargs[0], stat_flag_f); -        xprintf(" File: \"%s\"\n", toys.optargs[TT.toy_obj_file_arg]); -        xprintf("   ID: %d%d Namelen: %ld    Type: %lx\n", TT.toystatfs->f_fsid.__val[0], TT.toystatfs->f_fsid.__val[1], TT.toystatfs->f_namelen, TT.toystatfs->f_type); -        xprintf("Block Size: %d    Fundamental block size: %d\n", TT.toystatfs->f_bsize, TT.toystatfs->f_frsize); -        xprintf("Blocks: Total: %lu\t", TT.toystatfs->f_blocks); -        xprintf("Free: %lu\t", TT.toystatfs->f_bfree); -        xprintf("Available: %lu\n", TT.toystatfs->f_bavail); -        xprintf("Inodes: Total: %lu\t", TT.toystatfs->f_files); -        xprintf("\tFree: %d\n", TT.toystatfs->f_ffree); -    } +    TT.access_str = get_access_str((TT.toystat->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)), TT.toystat->st_mode); +    TT.time_toy = gmtime(&(TT.toystat->st_atime)); +  } +  if (!(stat_flag_f |stat_flag_Z)) { +    if (stat_format) print_stat_format(toys.optargs[0], stat_flag_f); +    xprintf(" File: `%s'\n", toys.optargs[TT.toy_obj_file_arg]); +    xprintf(" Size: %llu\t Blocks: %llu\t IO Blocks: %lu\t", TT.toystat->st_size, TT.toystat->st_blocks, TT.toystat->st_blksize); +    xprintf("%s\n", TT.file_type); +    xprintf("Device: %llxh\t Inode: %llu\t Links: %lu\n", TT.toystat->st_dev, TT.toystat->st_ino, TT.toystat->st_nlink); +    xprintf("Access: (%04lo/%s)\tUid: (%lu/%8s)\tGid: (%lu/%8s)\n", (TT.toystat->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)), TT.access_str, TT.toystat->st_uid, TT.user_name->pw_name, TT.toystat->st_gid, TT.group_name->gr_name); +    xprintf("Access: %s\nModify: %s\nChange: %s\n", date_stat_format(TT.toystat->st_atime), date_stat_format(TT.toystat->st_mtime), date_stat_format(TT.toystat->st_ctime)); +  } else if (stat_flag_f) { +    // implementation of statfs -f, file system +    if (stat_format) print_stat_format(toys.optargs[0], stat_flag_f); +    xprintf(" File: \"%s\"\n", toys.optargs[TT.toy_obj_file_arg]); +    xprintf("   ID: %d%d Namelen: %ld    Type: %lx\n", TT.toystatfs->f_fsid.__val[0], TT.toystatfs->f_fsid.__val[1], TT.toystatfs->f_namelen, TT.toystatfs->f_type); +    xprintf("Block Size: %d    Fundamental block size: %d\n", TT.toystatfs->f_bsize, TT.toystatfs->f_frsize); +    xprintf("Blocks: Total: %lu\t", TT.toystatfs->f_blocks); +    xprintf("Free: %lu\t", TT.toystatfs->f_bfree); +    xprintf("Available: %lu\n", TT.toystatfs->f_bavail); +    xprintf("Inodes: Total: %lu\t", TT.toystatfs->f_files); +    xprintf("\tFree: %d\n", TT.toystatfs->f_ffree); +  }  } | 
