Я получаю следующую ошибку:
wlan_config_vap_priv_int vap lan0 cmd cpauth val 0(0) error: Bad address
Это из печати в wlan_config_vap_priv_int. Кто-нибудь знает, что может вызвать ошибку "Плохой адрес"?
Из почему ioctl возвращает неверный адрес, я подозреваю, что виновником может быть вызов ioctl , но я не понимаю почему.
int wlan_config_vap_priv(char *vap, char *cmd, char * val) {
int fd, ret;
struct ifreq ifr;
param_t fp;
strncpy(ifr.ifr_name, vap, IFNAMSIZ);
strncpy(fp.cmd, cmd, sizeof(fp.cmd));
strncpy(fp.val, val, sizeof(fp.val));
ifr.ifr_data = (void *) &fp;
printf("%s:%d: config vap %s priv %s=%s\n", __func__, __LINE__, vap, cmd, val);
if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
return -1;
}
ret = ioctl(fd, SIOCSPARAM, &ifr);
close(fd);
return (ret);
}
int wlan_config_vap_priv_int(uint8_t rId, char *vap, char *cmd, int val) {
char buf[32];
int ret;
snprintf(buf, sizeof(buf), "%d", val);
ret = wlan_config_vap_priv(vap, cmd, buf);
if (ret < 0) {
CW_LOG_ERR("%s vap %s cmd %s val %s(%d) error: %s\n",
__FUNCTION__, vap, cmd, buf, val, strerror(errno));
}
return ret;
}
SIOCSPARAM
? Вызов завершается неудачно наioctl
или наsocket
? Строка это просто функция CW_LOG_ERR, напечатанная в ней. EFAULT - это странная ошибка, вы сбрасывали ее перед вызовомwlan_config_vap_priv
? - person KamilCuk   schedule 19.09.2018strncpy(str, str2, sizeof(str))
- плохая практика, в случае, если строкаstrlen(str2) == sizeof(str)
не будет завершена нулем. Используйтеstrscpy
. - person KamilCuk   schedule 19.09.2018SIOCSPARAM
ни в Google, ни на страницах руководства, ни в исходных текстах ядра Linux, ни в заголовках C ... - person o11c   schedule 19.09.2018strncpy
, независимо от того, что вы с ней используете. Если вы ожидаете, что строки будут завершаться нулем, используйтеstrscpy
. Забудьте оstrncpy
. Отрицательное значение, возвращаемоеwlan_config_vap_priv
, возвращается вызовом ioctl или вызовом сокета? Как вы реализовали вызов ioctl? Как определяется SIOCSPARAM? Что это за система / среда? - person KamilCuk   schedule 19.09.2018SIOCSPARAM
. В противном случае этот вопрос не дает достаточно информации. - person milaniez   schedule 19.09.2018strscpy
предназначен для ядра. Это похоже на код пользовательского пространства. - person milaniez   schedule 19.09.2018strscpy
не является стандартной библиотечной функцией C. Наверное, лучше просто научиться правильно использоватьstrncpy
. - person Christian Gibbons   schedule 19.09.2018