getservbyname(...)
public
name is a service name ("ftp", "telnet",
…) and proto is a protocol name ("udp", "tcp",
…). ’/etc/services’ (or your system’s equivalent)
is searched for a service for name and proto, and the
port number is returned.
Note that unlike Socket.getaddrinfo, proto may not be specified
using the Socket::SOCK_* constants, a string must must be used.
Show source
/*
* Document-method: getservbyname
* call-seq: Socket.getservbyname(name, proto="tcp") => port
*
* +name+ is a service name ("ftp", "telnet", ...) and proto is a protocol name
* ("udp", "tcp", ...). '/etc/services' (or your system's equivalent) is
* searched for a service for +name+ and +proto+, and the port number is
* returned.
*
* Note that unlike Socket.getaddrinfo, +proto+ may not be specified using the
* Socket::SOCK_* constants, a string must must be used.
*/
static VALUE
sock_s_getservbyaname(argc, argv)
int argc;
VALUE *argv;
{
VALUE service, proto;
struct servent *sp;
int port;
rb_scan_args(argc, argv, "11", &service, &proto);
if (NIL_P(proto)) proto = rb_str_new2("tcp");
StringValue(service);
StringValue(proto);
sp = getservbyname(StringValueCStr(service), StringValueCStr(proto));
if (sp) {
port = ntohs(sp->s_port);
}
else {
char *s = RSTRING(service)->ptr;
char *end;
port = strtoul(s, &end, 0);
if (*end != '\0') {
rb_raise(rb_eSocket, "no such service %s/%s", s, RSTRING(proto)->ptr);
}
}
return INT2FIX(port);
}