# FAT_IOCTL_SET_ATTRIBUTES

## NAME



           FAT_IOCTL_GET_ATTRIBUTES, FAT_IOCTL_SET_ATTRIBUTES - get and set
           file attributes in a FAT filesystem
    


## LIBRARY



           Standard C library (_libc_ , _-lc_)
    


## SYNOPSIS



           **#include <linux/msdos_fs.h>  **/* Definition of **FAT_*** and
                                           **ATTR_*** constants */
           **#include <sys/ioctl.h>**
    
           **int ioctl(int** _fd_**, FAT_IOCTL_GET_ATTRIBUTES, uint32_t ***_attr_**);**
           **int ioctl(int** _fd_**, FAT_IOCTL_SET_ATTRIBUTES, uint32_t ***_attr_**);**
    


## DESCRIPTION



           Files and directories in the FAT filesystem possess an attribute
           bit mask that can be read with **FAT_IOCTL_GET_ATTRIBUTES** and
           written with **FAT_IOCTL_SET_ATTRIBUTES**.
    
           The _fd_ argument contains a file descriptor for a file or
           directory.  It is sufficient to create the file descriptor by
           calling open(2) with the **O_RDONLY** flag.
    
           The _attr_ argument contains a pointer to a bit mask.  The bits of
           the bit mask are:
    
           **ATTR_RO**
                  This bit specifies that the file or directory is read-only.
    
           **ATTR_HIDDEN**
                  This bit specifies that the file or directory is hidden.
    
           **ATTR_SYS**
                  This bit specifies that the file is a system file.
    
           **ATTR_VOLUME**
                  This bit specifies that the file is a volume label.  This
                  attribute is read-only.
    
           **ATTR_DIR**
                  This bit specifies that this is a directory.  This
                  attribute is read-only.
    
           **ATTR_ARCH**
                  This bit indicates that this file or directory should be
                  archived.  It is set when a file is created or modified.
                  It is reset by an archiving system.
    
           The zero value **ATTR_NONE** can be used to indicate that no attribute
           bit is set.
    


## RETURN VALUE



           On success, 0 is returned.  On error, -1 is returned, and _errno_ is
           set to indicate the error.
    


## STANDARDS



           Linux.
    


## EXAMPLES



           The following program demonstrates the usage of ioctl(2) to
           manipulate file attributes.  The program reads and displays the
           archive attribute of a file.  After inverting the value of the
           attribute, the program reads and displays the attribute again.
    
           The following was recorded when applying the program for the file
           _/mnt/user/foo_ :
    
               # ./toggle_fat_archive_flag /mnt/user/foo
               Archive flag is set
               Toggling archive flag
               Archive flag is not set
    
       **Program source (toggle_fat_archive_flag.c)**
    
           #include <fcntl.h>
           #include <linux/msdos_fs.h>
           #include <stdint.h>
           #include <stdio.h>
           #include <stdlib.h>
           #include <sys/ioctl.h>
           #include <unistd.h>
    
           /*
            * Read file attributes of a file on a FAT filesystem.
            * Output the state of the archive flag.
            */
           static uint32_t
           readattr(int fd)
           {
               int       ret;
               uint32_t  attr;
    
               ret = ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, &attr);
               if (ret == -1) {
                   perror("ioctl");
                   exit(EXIT_FAILURE);
               }
    
               if (attr & ATTR_ARCH)
                   printf("Archive flag is set\n");
               else
                   printf("Archive flag is not set\n");
    
               return attr;
           }
    
           int
           main(int argc, char *argv[])
           {
               int       fd;
               int       ret;
               uint32_t  attr;
    
               if (argc != 2) {
                   printf("Usage: %s FILENAME\n", argv[0]);
                   exit(EXIT_FAILURE);
               }
    
               fd = open(argv[1], O_RDONLY);
               if (fd == -1) {
                   perror("open");
                   exit(EXIT_FAILURE);
               }
    
               /*
                * Read and display the FAT file attributes.
                */
               attr = readattr(fd);
    
               /*
                * Invert archive attribute.
                */
               printf("Toggling archive flag\n");
               attr ^= ATTR_ARCH;
    
               /*
                * Write the changed FAT file attributes.
                */
               ret = ioctl(fd, FAT_IOCTL_SET_ATTRIBUTES, &attr);
               if (ret == -1) {
                   perror("ioctl");
                   exit(EXIT_FAILURE);
               }
    
               /*
                * Read and display the FAT file attributes.
                */
               readattr(fd);
    
               close(fd);
    
               exit(EXIT_SUCCESS);
           }
    


* * *