Знающие люди, помогите написать программу!Задание:
Написать аналог команды ls -l, выдающий имена файлов каталога и их коды доступа в формате rwxrw-r--.
Для получения кодов доступа используйте вызов stat
stat( имяФайла, &st);
кодыДоступа = st.st_mode & 0777;
Для изменения кодов доступа используется вызов
chmod(имя_файла, новые_коды);
Можно изменять коды доступа, соответствующие битовой маске
0777 | S_ISUID | S_ISGID | S_ISVTX
(смотри <sys/stat.h>). Тип файла (см. функцию typeOf) не может быть изменен. Изменить коды доступа к файлу может только его владелец.
На сайте opennet.ru (http://www.opennet.me/docs/RUS/bogatyrev/gl_6_1.html) нашёл пару скриптов. Вдруг помогут быстро сориентироваться:
- Первый реализует вывод списка файлов в каталоге:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int listdir(char *dirname)
{
register struct dirent *dirbuf;
DIR *fddir;
ino_t dot_ino = 0, dotdot_ino = 0;
if((fddir = opendir (dirname)) == NULL)
{
fprintf(stderr, "Can't read %s\n", dirname);
return 1;
}
/* Без сортировки по алфавиту */
while ((dirbuf = readdir (fddir)) != NULL )
{
if (dirbuf->d_ino == 0) continue;
if (strcmp (dirbuf->d_name, "." ) == 0)
{
dot_ino = dirbuf->d_ino;
continue;
}
else if(strcmp (dirbuf->d_name, "..") == 0)
{
dotdot_ino = dirbuf->d_ino;
continue;
}
else printf("%s\n", dirbuf->d_name);
}
closedir (fddir);
if(dot_ino == 0) printf("Поврежденный каталог: нет имени \".\"\n");
if(dotdot_ino == 0) printf("Поврежденный каталог: нет имени \"..\"\n");
if(dot_ino && dot_ino == dotdot_ino) printf("Это корневой каталог диска\n");
return 0;
}
int main(int ac, char *av[])
{
int i;
if(ac > 1) for(i=1; i < ac; i++) listdir(av);
else listdir(".");
return 0;
}
- Второй реализует вывод инфо о файле:
#include <sys/types.h>
#include <sys/stat.h>
typeOf( name ) char *name;
{
int type; struct stat st;
if( stat( name, &st ) < 0 )
{
printf( "%s не существует\n", name );
return 0;
}
printf("Файл имеет %d имен\n", st.st_nlink);
switch(type = (st.st_mode & S_IFMT))
{
case S_IFREG:
printf( "Обычный файл размером %ld байт\n",
st.st_size );
break;
case S_IFDIR:
printf( "Каталог\n" );
break;
case S_IFCHR: /* байтоориентированное */
case S_IFBLK: /* блочноориентированное */
printf( "Устройство\n" );
break;
case S_IFIFO:
printf( "FIFO-файл\n" );
break;
default:
printf( "Другой тип\n" );
break;
}
return type;
}