Опция GCC для получения statvfs64 - PullRequest
2 голосов
/ 19 января 2010

Я использую функцию statvfs в AIX. И с помощью компилятора GCC. Я хотел бы, чтобы вызов statvfs разрешался препроцессором в statvfs64.

Пример: В Solaris, используя "-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS = 64" флаги с gcc, я разрешен в statvfs64.

Не могли бы вы помочь получить аналогичные флаги в AIX, которые разрешают мне statvfs64 из statvfs.

Спасибо и С уважением, Сиварам Т

Ответы [ 3 ]

2 голосов
/ 19 января 2010

Большое спасибо за немедленный ответ. К сожалению, в файле включения AIX не определено "_LARGEFILE64_SOURCE".

Я узнаю следующие варианты «-maix64 -mpowerpc64» может преобразовываться в statvfs64. Не уверен, правильно ли они используются или нет.

Пожалуйста, найдите следующий файл sys / statvfs.h

=============================================== ==

#ifndef _H_STATVFS
#define _H_STATVFS

#ifndef _H_STANDARDS
#include <standards.h>
#endif

#if _XOPEN_SOURCE_EXTENDED==1

#include <strict_stdtypes.h>

#ifndef _H_TYPES
#include <sys/types.h>
#endif

#include <end_strict_stdtypes.h>

#define _FSTYPSIZ       16

#ifdef _ALL_SOURCE
#include <sys/vmount.h>

#define FSTYPSIZ        _FSTYPSIZ
#endif

/*
 * statvfs system call return structure
 */

struct statvfs {
    ulong_t    f_bsize;     /* preferred file system block size          */
    ulong_t    f_frsize;    /* fundamental file system block size        */
    fsblkcnt_t f_blocks;    /* total # of blocks of f_frsize in fs       */
    fsblkcnt_t f_bfree;     /* total # of free blocks                    */
    fsblkcnt_t f_bavail;    /* # of blocks available to non super user   */
    fsfilcnt_t f_files;     /* total # of file nodes (inode in JFS)      */
    fsfilcnt_t f_ffree;     /* total # of free file nodes                */
    fsfilcnt_t f_favail;    /* # of nodes available to non super user    */
#ifdef _ALL_SOURCE
    fsid_t     f_fsid;      /* file system id                            */
#else
    ulong_t    f_fsid;      /* file system id                            */
#ifndef __64BIT__
    ulong_t    f_fstype;    /* file system type                          */
#endif
#endif  /* _ALL_SOURCE */
    char       f_basetype[_FSTYPSIZ]; /* Filesystem type name (eg. jfs)  */
    ulong_t    f_flag;      /* bit mask of flags                         */
    ulong_t    f_namemax;   /* maximum filename length                   */
    char       f_fstr[32];  /* filesystem-specific string */
    ulong_t    f_filler[16];/* reserved for future use                   */
};

#define ST_NOSUID       0x0040          /* don't maintain SUID capability    */

#define ST_RDONLY       0x0001          /* file system mounted read only     */
#define ST_NODEV        0x0080          /* don't allow device access across  */
                                    /* this mount                        */

/*
 * Prototypes
 */
#ifdef _NO_PROTO
extern int statvfs();
extern int fstatvfs();
#else
extern int statvfs(const char *__restrict__, struct statvfs *__restrict__);
extern int fstatvfs(int, struct statvfs *);
#endif

/*
 * statvfs64 system call return structure
 */
#ifdef _ALL_SOURCE

struct statvfs64 {
    blksize64_t f_bsize;    /* preferred file system block size          */
    blksize64_t f_frsize;   /* fundamental file system block size        */
    blkcnt64_t f_blocks;    /* total # of blocks of f_frsize in fs       */
    blkcnt64_t f_bfree;     /* total # of free blocks                    */
    blkcnt64_t f_bavail;    /* # of blocks available to non super user   */
    blkcnt64_t f_files;     /* total # of file nodes (inode in JFS)      */
    blkcnt64_t f_ffree;     /* total # of free file nodes                */
    blkcnt64_t f_favail;    /* # of nodes available to non super user    */
    fsid64_t   f_fsid;      /* file system id                            */
    char       f_basetype[FSTYPSIZ]; /* Filesystem type name (eg. jfs)  */
    ulong_t    f_flag;      /* bit mask of flags                         */
    ulong_t    f_namemax;   /* maximum filename length                   */
    char       f_fstr[32];  /* filesystem-specific string */
    ulong_t    f_filler[16];/* reserved for future use                   */
};

/*
 * Prototypes
 */
#ifdef _NO_PROTO
extern int statvfs64();
extern int fstatvfs64();
#else
extern int statvfs64(const char *__restrict__, struct statvfs64 *__restrict__);
extern int fstatvfs64(int, struct statvfs64 *);
#endif

#endif  /* _ALL_SOURCE */

#endif /* _XOPEN_SOURCE_EXTENDED */
#endif /* _H_STATVFS */

=============================================== ==

0 голосов
/ 19 января 2010

iirc в AIX вам нужен набор токенов _LARGE_FILES, который позволит неявно поддерживать большие файлы.

-D_LARGE_FILES 

Если вы хотите явно вызвать statvfs64, вам нужно сделать

-D_LARGE_FILE_API
0 голосов
/ 19 января 2010

У меня нет системы AIX, поэтому я не могу сказать вам, какие флаги нужно установить. Однако в Solaris вы можете просмотреть sys/statvfs.h и посмотреть, как это работает, например, выполнить поиск statvfs64 и найти окружающие его блоки #ifdef. Вы увидите линии

#if defined(_LARGEFILE64_SOURCE)
    typedef struct statvfs64 {
    .....
    } statvfs64_t;
#endif

#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
...
#define statvfs_t               statvfs64_t
#define statvfs                 statvfs64
#define fstatvfs                fstatvfs64
#endif

Вы сможете сделать то же самое в AIX. Однако AIX может вести себя по-другому и не использовать препроцессор для переключения между 32- и 64-разрядными версиями.

Если это не очевидно для вас, вы можете опубликовать содержание sys/statvfs.h здесь, и мы сможем взглянуть на вас.

...