我正在努力将可执行程序转换为可以从主程序中调用的函数。按照目前的编写,可执行文件如下所示:
int main(int argc, char* argv[]){
//do stuff
if(setxattr(argv[4], tmpstr, argv[3], strlen(argv[3]), 0)){
perror("setxattr error");
exit(EXIT_FAILURE);
}
//do more stuff
}
我可以按如下方式调用它并且它可以成功运行:
./set_attributes -s 加密 1 ~/text.txt
但现在我想把它移到另一个程序中嵌入的函数中。失败的部分是strlen(argv[3])
. 我的新功能如下所示:
int set_encr_attr(char* fpath, int value) {
char* userstr = NULL;
/* Check that the value to set is either 0 or 1 */
if (!( (value == 0) || (value == 1) )) {
return -1;
}
//do stuff (including malloc(userstr)
strcpy(userstr, XATTR_USER_PREFIX);
/* Set attribute */
if(setxattr(fpath, userstr, value, 1, 0)){
perror("setxattr error");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
如您所见,我已将第四个参数替换为数字 1,因为我已经检查过传入的值是 0 还是 1,因此它的 strlen 必须为 1。我尝试了一些其他事情,但我总是得到这个错误:
xattr_new.c:在函数“set_encr_attr”中:
xattr_new.c:52:2:警告:传递 'setxattr' 的参数 3 使指针从整数而不进行强制转换 [默认启用]
/usr/include/i386-linux-gnu/sys/xattr.h:40:12:注意:预期为“const void *”,但参数的类型为“int”</p>
当我玩这个时,我可以看到 strlen(argv[3]) == 1,所以我不明白为什么我不能用整数 1 替换它。至于打字问题,我试过了铸造(我认为这通常是一个坏主意),但我无法让它发挥作用。
任何人都可以帮忙吗?谢谢!