Method: Socket.getservbyname

Defined in:
socket.c

.getservbyname(service_name) ⇒ Object .getservbyname(service_name, protocol_name) ⇒ Object

Obtains the port number for service_name.

If protocol_name is not given, “tcp” is assumed.

Socket.getservbyname("smtp")          #=> 25
Socket.getservbyname("shell")         #=> 514
Socket.getservbyname("syslog", "udp") #=> 514


1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
# File 'socket.c', line 1106

static VALUE
sock_s_getservbyname(int argc, VALUE *argv, VALUE _)
{
    VALUE service, proto;
    struct servent *sp;
    long port;
    const char *servicename, *protoname = "tcp";

    rb_scan_args(argc, argv, "11", &service, &proto);
    StringValue(service);
    if (!NIL_P(proto)) StringValue(proto);
    servicename = StringValueCStr(service);
    if (!NIL_P(proto)) protoname = StringValueCStr(proto);
    sp = getservbyname(servicename, protoname);
    if (sp) {
  port = ntohs(sp->s_port);
    }
    else {
  char *end;

  port = STRTOUL(servicename, &end, 0);
  if (*end != '\0') {
      rb_raise(rb_eSocket, "no such service %s/%s", servicename, protoname);
  }
    }
    return INT2FIX(port);
}