servicestxt doesn't use network byte order anymore

as mentioned by @jart in #204, the LookupServicesBy functions don't need
to handle network byte order, that can be done in getservbyname or
getservbyport. Changed the tests to also reflect this arrangement.
This commit is contained in:
ahgamut 2021-07-09 12:21:24 +05:30
parent 93146199fd
commit 76ca1e8d7d
5 changed files with 26 additions and 28 deletions

View file

@ -31,7 +31,7 @@
struct protoent *getprotobyname(const char *name) {
static struct protoent *ptr0, pe0;
static char p_name[DNS_NAME_MAX + 1];
if (!ptr0) {
pe0.p_name = p_name;
if (!(pe0.p_aliases = calloc(1, sizeof(char *)))) return NULL;
@ -44,4 +44,3 @@ struct protoent *getprotobyname(const char *name) {
return ptr0;
}

View file

@ -50,7 +50,7 @@ struct servent *getservbyname(const char *name, const char *proto) {
return NULL;
}
ptr0->s_port = p;
ptr0->s_port = htons(p);
if (ptr0->s_proto) free(ptr0->s_proto);
ptr0->s_proto = strdup(localproto);

View file

@ -41,7 +41,7 @@ struct servent *getservbyport(int port, const char *proto) {
ptr1 = &se1;
}
if (LookupServicesByPort(port, &localproto, ptr1->s_name, DNS_NAME_MAX,
if (LookupServicesByPort(ntohs(port), &localproto, ptr1->s_name, DNS_NAME_MAX,
NULL) == -1) {
// localproto got alloc'd during the lookup?
if (!proto && localproto != proto) free(localproto);

View file

@ -63,7 +63,7 @@ static textwindows noinline char *GetNtServicesTxtPath(char *pathbuf,
* fsp 21/udp fspd
* ssh 22/tcp
*
* @param servport is the port number (in network byte order)
* @param servport is the port number
* @param servproto is a pointer to a string (*servproto can be NULL)
* @param buf is a buffer to store the official name of the service
* @param bufsize is the size of buf
@ -103,7 +103,7 @@ int LookupServicesByPort(const int servport, char **servproto, char *buf,
name = strtok_r(line, " \t\r\n\v", &tok);
port = strtok_r(NULL, "/ \t\r\n\v", &tok);
proto = strtok_r(NULL, " \t\r\n\v", &tok);
if (name && port && proto && servport == htons(atoi(port))) {
if (name && port && proto && servport == atoi(port)) {
if (!servproto[0]) {
servproto[0] = strdup(proto);
strncpy(buf, name, bufsize);
@ -137,7 +137,7 @@ int LookupServicesByPort(const int servport, char **servproto, char *buf,
* @param filepath is the location of services file
* (if NULL, uses /etc/services)
* @returns -1 on error, or
* positive port number (in network byte order)
* positive port number
*
* @note aliases are read from file for comparison, but not returned.
* @see LookupServicesByPort
@ -182,11 +182,11 @@ int LookupServicesByName(const char *servname, char **servproto, char *buf,
{
if (!servproto[0]) {
servproto[0] = strdup(proto);
result = htons(atoi(port));
result = atoi(port);
strncpy(buf, name, bufsize);
found = 1;
} else if (strcasecmp(proto, servproto[0]) == 0) {
result = htons(atoi(port));
result = atoi(port);
strncpy(buf, name, bufsize);
found = 1;
}

View file

@ -27,9 +27,9 @@
*/
#include "libc/dns/servicestxt.h"
#include "libc/calls/calls.h"
#include "libc/dns/dns.h"
#include "libc/dns/ent.h"
#include "libc/calls/calls.h"
#include "libc/testlib/testlib.h"
char testlib_enable_tmp_setup_teardown;
@ -59,33 +59,33 @@ TEST(LookupServicesByPort, GetNameWhenPortCorrect) {
LookupServicesByPort(965, localproto, name, sizeof(name), "services"));
ASSERT_EQ(NULL, localproto[0]);
ASSERT_EQ(
-1, /* port not in network byte order */
LookupServicesByPort(22, localproto, name, sizeof(name), "services"));
ASSERT_EQ(-1, /* port in network byte order */
LookupServicesByPort(htons(22), localproto, name, sizeof(name),
"services"));
ASSERT_EQ(NULL, localproto[0]);
localproto[0] = proto2;
ASSERT_EQ(-1, /* port ok but wrong protocol */
LookupServicesByPort(htons(22), localproto, name, sizeof(name),
"services"));
ASSERT_EQ(
-1, /* port ok but wrong protocol */
LookupServicesByPort(22, localproto, name, sizeof(name), "services"));
ASSERT_EQ(localproto[0], proto2);
localproto[0] = proto1;
ASSERT_EQ(0, LookupServicesByPort(htons(22), localproto, name, sizeof(name),
"services"));
ASSERT_EQ(
0, LookupServicesByPort(22, localproto, name, sizeof(name), "services"));
ASSERT_STREQ(name, "ssh");
ASSERT_EQ(localproto[0], proto1);
localproto[0] = proto2;
ASSERT_EQ(0, LookupServicesByPort(htons(19), localproto, name,
sizeof(name), "services"));
ASSERT_EQ(
0, LookupServicesByPort(19, localproto, name, sizeof(name), "services"));
ASSERT_STREQ(name, "chargen");
ASSERT_EQ(localproto[0], proto2);
localproto[0] = NULL;
ASSERT_EQ(0, /* pick first matching protocol */
LookupServicesByPort(htons(19), localproto, name, sizeof(name),
"services"));
ASSERT_EQ(
0, /* pick first matching protocol */
LookupServicesByPort(19, localproto, name, sizeof(name), "services"));
ASSERT_STREQ(name, "chargen");
ASSERT_NE(NULL, localproto[0]); /* got alloc'd during the call */
ASSERT_STREQ(localproto[0], "tcp");
@ -111,21 +111,20 @@ TEST(LookupServicesByName, GetPortWhenNameOrAlias) {
ASSERT_EQ(localproto[0], proto2);
localproto[0] = proto1;
ASSERT_EQ(
htons(22), /* in network byte order */
LookupServicesByName("ssh", localproto, name, sizeof(name), "services"));
ASSERT_EQ(22, LookupServicesByName("ssh", localproto, name, sizeof(name),
"services"));
ASSERT_STREQ(name, "ssh"); /* official name written to buffer */
ASSERT_EQ(localproto[0], proto1);
localproto[0] = proto2;
ASSERT_EQ(htons(19), /* works if alias provided */
ASSERT_EQ(19, /* works if alias provided */
LookupServicesByName("ttytst", localproto, name, sizeof(name),
"services"));
ASSERT_STREQ(name, "chargen"); /* official name written to buffer */
ASSERT_EQ(localproto[0], proto2);
localproto[0] = NULL;
ASSERT_EQ(htons(19), /* pick first matching protocol */
ASSERT_EQ(19, /* pick first matching protocol */
LookupServicesByName("source", localproto, name, sizeof(name),
"services"));
ASSERT_STREQ(name, "chargen");