:shutdown() errors on all invalid argument strings

It used to error only on invalid argument strings that started with 's',
'r', or 'b'.
This commit is contained in:
Sam Roberts 2012-04-26 16:50:27 -07:00
parent 30d1aae140
commit e86eac96fa
2 changed files with 9 additions and 37 deletions

View File

@ -308,27 +308,13 @@ static int meth_listen(lua_State *L)
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static int meth_shutdown(lua_State *L) static int meth_shutdown(lua_State *L)
{ {
/* SHUT_RD, SHUT_WR, SHUT_RDWR have the value 0, 1, 2, so we can use method index directly */
static const char* methods[] = { "receive", "send", "both", NULL };
p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1); p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1);
const char *how = luaL_optstring(L, 2, "both"); int how = luaL_checkoption(L, 2, "both", methods);
switch (how[0]) { socket_shutdown(&tcp->sock, how);
case 'b':
if (strcmp(how, "both")) goto error;
socket_shutdown(&tcp->sock, 2);
break;
case 's':
if (strcmp(how, "send")) goto error;
socket_shutdown(&tcp->sock, 1);
break;
case 'r':
if (strcmp(how, "receive")) goto error;
socket_shutdown(&tcp->sock, 0);
break;
}
lua_pushnumber(L, 1); lua_pushnumber(L, 1);
return 1; return 1;
error:
luaL_argerror(L, 2, "invalid shutdown method");
return 0;
} }
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\

View File

@ -292,27 +292,13 @@ static int meth_listen(lua_State *L)
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static int meth_shutdown(lua_State *L) static int meth_shutdown(lua_State *L)
{ {
p_unix un = (p_unix) auxiliar_checkclass(L, "unix{client}", 1); /* SHUT_RD, SHUT_WR, SHUT_RDWR have the value 0, 1, 2, so we can use method index directly */
const char *how = luaL_optstring(L, 2, "both"); static const char* methods[] = { "receive", "send", "both", NULL };
switch (how[0]) { p_unix tcp = (p_unix) auxiliar_checkclass(L, "unix{client}", 1);
case 'b': int how = luaL_checkoption(L, 2, "both", methods);
if (strcmp(how, "both")) goto error; socket_shutdown(&tcp->sock, how);
socket_shutdown(&un->sock, 2);
break;
case 's':
if (strcmp(how, "send")) goto error;
socket_shutdown(&un->sock, 1);
break;
case 'r':
if (strcmp(how, "receive")) goto error;
socket_shutdown(&un->sock, 0);
break;
}
lua_pushnumber(L, 1); lua_pushnumber(L, 1);
return 1; return 1;
error:
luaL_argerror(L, 2, "invalid shutdown method");
return 0;
} }
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\