Я изо всех сил пытаюсь преобразовать исполняемую программу в функцию, которую я могу вызвать из своей основной процедуры. Как сейчас написано, исполняемый файл выглядит так:
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: предупреждение: передача аргумента 3 setxattr делает указатель целым без приведения [включено по умолчанию]
/usr/include/i386-linux-gnu/sys/xattr.h:40:12: примечание: ожидается ‘const void *’, но аргумент имеет тип ‘int’
Когда я играю с этим, я вижу, что strlen(argv[3]) == 1, поэтому я не понимаю, почему я не могу просто заменить это целым числом 1. Что касается проблемы ввода, я пробовал кастинг (что я считаю вообще плохой идеей), но я не могу заставить его работать.
Кто-нибудь может помочь? Спасибо!