gpt4 book ai didi

c - 将 st_mode (来自 stat)存储在文件中并在 chmod 中重用它

转载 作者:行者123 更新时间:2023-11-30 15:55:51 27 4
gpt4 key购买 nike

我快要疯了。我正在尝试编写一个可以存储和提取文件的存档库。存档文件如下所示:

<0,/home/user/file.txt,154,0755>
file contents (154 byte)

每个文件都由 header ( <...> ) 标识,其中包含四个“标签”(以逗号分隔)、文件类型(0 表示文件,1 表示目录)、路径、字节大小、权限(以八进制)。我使用 stat 系统调用检索大小和权限(我在 Linux 上)。我的问题是我必须将八进制值从 st_mode 转换为字符串,将其存储在存档文件中( header 中的第四个标记),然后提取它并与 chmod 系统调用一起使用。

要将其转换为字符串,我使用:

char mode[6];
sprintf (mode, "%o", statr.st_mode);

为了检索它,我使用 atoi,但它似乎不起作用。例如,第 4 个标签中存储的值是 100644,但 chmod 设置了错误的权限(我的用户无法读取文件)。

我不确定我是否解释得好,如果需要的话我会发布整个代码(但它不认为存在实现问题,只是从八进制转换为字符串之间的问题)

编辑:已解决!实际上 strtol 方法有效,但我也忘记将其应用到目录(因此,由于文件夹的权限掩码错误,提取包含文件的目录会导致段错误)。谢谢大家的帮助!

最佳答案

据我所知,没有一个unix标准函数可以做到这一点。

您很可能必须屏蔽 st_mode 才能获取您想要的每个权限位并将其转换为对您有意义的内容。

related post

也许有一种更简单的方法可以做到这一点,但我提供了一个简单的示例,展示了如何获取您感兴趣的每一位。这确实可以编译并且似乎按预期运行。

st_mode.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>


#define SET_UID_BIT 0x4000
#define SET_GID_BIT 0x2000
#define STICKY_BIT 0x1000

// Readable USER bits defined here
#define USR_READ_BIT 0x400
#define USR_WRITE_BIT 0x200
#define USR_EXEC_BIT 0x100

// Readable GROUP bits defined here
#define GRP_READ_BIT 0x040
#define GRP_WRITE_BIT 0x020
#define GRP_EXEC_BIT 0x010

// Readable OTHER bits defined here
#define OTH_READ_BIT 0x004
#define OTH_WRITE_BIT 0x002
#define OTH_EXEC_BIT 0x001


int main()
{
// The file I'm opening
const char fp[] = "myfile.txt"; // -rw-rw-r--
struct stat stats;

// Get the stats
if ( 0 == stat( fp, &stats ) )
{
// store st_mode
mode_t mode = stats.st_mode;
// init printable_mode
unsigned int printable_mode = 0;


// Test for each permission bit in mode.
// If the bit is present, mark the corresponding bit in printable_mode
// using defined bits above.
if( mode & S_ISUID )
printable_mode |= SET_UID_BIT;

if( mode & S_ISGID )
printable_mode |= SET_GID_BIT;

if( mode & S_ISVTX )
printable_mode |= STICKY_BIT;

if( mode & S_IRUSR )
printable_mode |= USR_READ_BIT;

if( mode & S_IWUSR )
printable_mode |= USR_WRITE_BIT;

if( mode & S_IXUSR )
printable_mode |= USR_EXEC_BIT;

if( mode & S_IRGRP )
printable_mode |= GRP_READ_BIT;

if( mode & S_IWGRP )
printable_mode |= GRP_WRITE_BIT;

if( mode & S_IXGRP )
printable_mode |= GRP_EXEC_BIT;

if( mode & S_IROTH )
printable_mode |= OTH_READ_BIT;

if( mode & S_IWOTH )
printable_mode |= OTH_WRITE_BIT;

if( mode & S_IXOTH )
printable_mode |= OTH_EXEC_BIT;

// Let's see what it looks like....
printf("%04x\n", printable_mode);
printf("%x\n", mode);
}

return 0;
}

关于c - 将 st_mode (来自 stat)存储在文件中并在 chmod 中重用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11669504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com