Я изо всех сил пытаюсь преобразовать исполняемую программу в функцию, которую я могу вызвать из моей основной процедуры. Как в настоящее время написано, исполняемый выглядит следующим образом:Тип данных командной строки args
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 encrypted 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: In function ‘set_encr_attr’:
xattr_new.c:52:2: warning: passing argument 3 of ‘setxattr’ makes pointer from integer without a cast [enabled by default]
/usr/include/i386-linux-gnu/sys/xattr.h:40:12: note: expected ‘const void *’ but argument is of type ‘int’
Когда я играю с этим, я могу видеть, что STRLEN (ARGV [3]) == 1, поэтому я не понимаю, почему я не могу просто заменить это целым числом 1. Что касается проблемы с вводом текста, я пробовал кастинг (который, как я думаю, вообще плохая идея), но я не могу это сделать Работа.
Может ли кто-нибудь помочь? Благодаря!
Спасибо. Я все это понимаю, но я до сих пор не вижу решения. Среди многих вещей, которые я заменил для этого аргумента, есть «1», strlen («1»), а также объявление char * и присвоение ему значения 1 (и нулевого терминатора). – Alex
В новом коде, который вы отправили, третьим аргументом setxattr является int. Он должен быть указателем символа, как в вашем исходном коде. Вы пытаетесь передать INTEGER, а не строку! – DoxyLover