#include <sys/ioctl.h>
#include <nsdp/attr.h>
-#include <nsdp/misc.h>
+#include <nsdp/str.h>
#include <nsdp/net.h>
#include <nsdp/protocol.h>
{
switch (nc->error) {
+ case 0:
+ return ERR_OK;
+
+ case ERROR_READONLY:
+ case ERROR_WRITEONLY:
+ return ERR_INVOP;
+
case ERROR_DENIED:
return (nc->attr_error == ATTR_PASSWORD) ? ERR_BADPASS : ERR_DENIED;
return ERR_INVARG;
default:
- return ERR_OK;
+ return ERR_UNKNOWN;
}
}
if (i == -EINVAL) {
ret = ERR_INVARG;
goto end;
+ } else if (i == -ETIMEDOUT) {
+ ret = ERR_TIMEOUT;
+ goto end;
} else if (i < 0) {
- ret = (errno == EAGAIN || errno == EWOULDBLOCK) ? ERR_TIMEOUT : ERR_NET;
+ ret = ERR_NET;
goto end;
}
-
/* check the switch error code */
ret = checkErrorCode(&nc);
if (i == -EINVAL) {
ret = ERR_INVARG;
goto end;
+ } else if (i == -ETIMEDOUT) {
+ ret = ERR_TIMEOUT;
} else if (i < 0) {
- ret = (errno == EAGAIN || errno == EWOULDBLOCK) ? ERR_TIMEOUT : ERR_NET;
+ ret = ERR_NET;
goto end;
}
}
-void extractSwitchAttributes (struct swi_attr *sa, const List *l)
+int extractSwitchAttributes (struct swi_attr *sa, const List *l)
{
const ListNode *ln;
const struct attr *at;
for (ln = l->first; ln != NULL; ln = ln->next) {
at = ln->data;
+ if (at->size == 0) {
+ if (at->attr == ATTR_NAME)
+ continue;
+ else
+ return -EMSGSIZE;
+ }
switch (at->attr) {
break;
case ATTR_DHCP:
- sa->nc.dhcp = (ntohs(*(unsigned short*)at->data) == 1);
+ /* Note: DHCP attribute is special, it is 2 two bytes long when sent
+ * by the switch but only 1 byte long when sent by the client
+ */
+ sa->nc.dhcp = (at->size == 2) && ((*(unsigned short*)at->data) == 1);
break;
case ATTR_FIRM_VER:
break;
case ATTR_END:
- return;
+ return 0;
}
}
+
+
+ return 0;
}