XCode С++ отсутствует сперма()

Я использую С++ и XCode для создания приложения cmd для сохранения прав доступа к файлам, однако я не могу определить метод sperm(), ошибка

'Использование незаявленного идентификатора' sperm '

My includes и часть кода, о которой идет речь, ниже...

// My includes ...
#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <vector>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <locale.h>
#include <langinfo.h>
#include <stdint.h>

// Code fragment ...

dp = opendir ("/var/someplace");
if (dp != NULL)
{
    while ((ep = readdir (dp)))
    {

        oFile = new FileObject;

        oFile->setName( ep->d_name );
        oFile->setIsDirectory( ep->d_type == isFolder );

        oFiles.push_back (*oFile);            
        // If it a folder then we can get it innards 

        if (stat(ep->d_name, &statbuf) == -1)
            continue;
        cout << "%10.10s", sperm(statbuf.st_mode);

        iFile++;
    }



    closedir (dp);
}
else
    perror ("Couldn't open the directory");

Ответ 1

Это может сделать меня похожим на извращенца, но я искал google для 'sperm' (конечно же только для файлов .h и .cpp). Плохая новость заключается в том, что я не могу найти никаких ссылок на нее (кроме самой страницы stat function).

Хорошая новость: я нашел этот фрагмент кода, который определяет его собственную функцию 'sperm':

char const * sperm(__mode_t mode) {
    static char local_buff[16] = {0};
    int i = 0;
    // user permissions
    if ((mode & S_IRUSR) == S_IRUSR) local_buff[i] = 'r';
    else local_buff[i] = '-';
    i++;
    if ((mode & S_IWUSR) == S_IWUSR) local_buff[i] = 'w';
    else local_buff[i] = '-';
    i++;
    if ((mode & S_IXUSR) == S_IXUSR) local_buff[i] = 'x';
    else local_buff[i] = '-';
    i++;
    // group permissions
    if ((mode & S_IRGRP) == S_IRGRP) local_buff[i] = 'r';
    else local_buff[i] = '-';
    i++;
    if ((mode & S_IWGRP) == S_IWGRP) local_buff[i] = 'w';
    else local_buff[i] = '-';
    i++;
    if ((mode & S_IXGRP) == S_IXGRP) local_buff[i] = 'x';
    else local_buff[i] = '-';
    i++;
    // other permissions
    if ((mode & S_IROTH) == S_IROTH) local_buff[i] = 'r';
    else local_buff[i] = '-';
    i++;
    if ((mode & S_IWOTH) == S_IWOTH) local_buff[i] = 'w';
    else local_buff[i] = '-';
    i++;
    if ((mode & S_IXOTH) == S_IXOTH) local_buff[i] = 'x';
    else local_buff[i] = '-';
    return local_buff;
}

просто:

#include <sys/types.h>
#include <sys/stat.h>
#include <iostream>

int main(int argc, char ** argv)
{
    std::cout<<sperm(S_IRUSR | S_IXUSR | S_IWGRP | S_IROTH)<<std::endl;
    std::cout<<sperm(S_IRUSR)<<std::endl;
    std::cout<<sperm(S_IRUSR | S_IRGRP | S_IWOTH | S_IROTH)<<std::endl;
    return 0;
}

на ideone:

r-x-w-r--
r--------
r--r--rw-

Ответ 2

Я столкнулся с этим пару лет назад. Я не чувствую, что на данный момент я просматриваю свой путь через Google с этим конкретным поисковым термином, но если я правильно помню, ответ заключается в том, что sperm() - это нестандартная системная функция, доступная на Solaris. Но поскольку он не является частью стандарта unix, вы не найдете его на OS X.

Ответ 3

Предполагая, что функция определена (и я не буду указывать это имя с работы), у вас возникла проблема с тем, как вы ее печатаете:

cout << "%10.10s", sperm(statbuf.st_mode);

Это не собирается печатать отформатированную строку, поскольку С++ iostreams не работают, как C printf. Вы не можете его форматировать:

cout << sperm(statbuf.st_mode);

или используйте printf:

printf("%10.10s", sperm(statbuf.st_mode));

или сделайте некоторое дрожание-pokery с манипуляторами iostream.