Ticket #1724: getprotobyname.patch

File getprotobyname.patch, 4.9 KB (added by ocharles, 4 years ago)

Adds getprotobyname to Socket

  • src/pmc/socket.pmc

     
    177177 
    178178/* 
    179179 
     180=item C<getprotobyname(STRING * name)> 
     181 
     182C<getprotobyname> returns a protocol number suitable for passing to 
     183C<socket>, based on the given protocol name. This is normal only 
     184necessary when opening sockets in raw mode. 
     185 
     186=cut 
     187 
     188*/ 
     189 
     190    METHOD getprotobyname(STRING * name) { 
     191        INTVAL proto = Parrot_io_get_proto_by_name(INTERP, name); 
     192        RETURN(INTVAL proto); 
     193    } 
     194 
     195/* 
     196 
    180197=item C<connect(PMC * address)> 
    181198 
    182199Connects a socket object to an address. 
  • src/io/socket_api.c

     
    353353 
    354354    return new_io; 
    355355} 
     356 
     357PARROT_EXPORT 
     358PARROT_WARN_UNUSED_RESULT 
     359INTVAL 
     360Parrot_io_get_proto_by_name(PARROT_INTERP, ARGIN(STRING * name)) 
     361{ 
     362    ASSERT_ARGS(Parrot_io_get_proto_by_name) 
     363     
     364    return PIO_GET_PROTO_BY_NAME(interp, name); 
     365} 
     366 
    356367/* 
    357368 
    358369=back 
  • src/io/socket_unix.c

     
    3535#ifdef PIO_OS_UNIX 
    3636 
    3737#  include <sys/socket.h> 
     38#  include <netdb.h> 
    3839 
    3940/* HEADERIZER HFILE: include/parrot/io_unix.h */ 
    4041 
     
    479480    sa->sin_port = htons(port); 
    480481} 
    481482 
     483/* 
    482484 
     485=item C<INTVAL Parrot_io_get_proto_by_name(PARROT_INTERP, STRING * name)> 
     486 
     487Return a protocol number based on the name of a protocol 
     488 
     489=cut 
     490 
     491*/ 
     492 
     493PARROT_WARN_UNUSED_RESULT 
     494INTVAL 
     495Parrot_io_get_proto_by_name_unix(PARROT_INTERP, ARGIN(STRING *name)) 
     496{ 
     497    ASSERT_ARGS(Parrot_io_get_proto_by_name_unix) 
     498 
     499    char            * const s        = Parrot_str_to_cstring(interp, name); 
     500    struct protoent * const protoent = getprotobyname(s); 
     501    int                     proto_number; 
     502 
     503    Parrot_str_free_cstring(s); 
     504    proto_number = protoent->p_proto; 
     505    return proto_number; 
     506} 
     507 
    483508#endif /* PIO_OS_UNIX */ 
    484509 
    485510/* 
  • CREDITS

     
    787787N: OOLLEY kj 
    788788D: Miscellaneous cleanup and PDD07-conformance 
    789789 
     790N: Oliver Charles 
     791D: Initial patch to add 'getprotobyname' to Socket PMC 
     792U: ocharles 
     793E: oliver@ocharles.org.uk 
     794 
    790795N: Ovid 
    791796D: Rename 'pbc_to_c' to 'pbc_to_exe' 
    792797 
  • include/parrot/io_unix.h

     
    198198        __attribute__nonnull__(3) 
    199199        FUNC_MODIFIES(*socket); 
    200200 
     201PARROT_WARN_UNUSED_RESULT 
     202INTVAL Parrot_io_get_proto_by_name_unix(PARROT_INTERP, ARGIN(STRING *name)) 
     203        __attribute__nonnull__(1) 
     204        __attribute__nonnull__(2); 
     205 
    201206INTVAL Parrot_io_listen_unix(SHIM_INTERP, ARGMOD(PMC *socket), INTVAL sec) 
    202207        __attribute__nonnull__(2) 
    203208        FUNC_MODIFIES(*socket); 
     
    254259       PARROT_ASSERT_ARG(interp) \ 
    255260    , PARROT_ASSERT_ARG(socket) \ 
    256261    , PARROT_ASSERT_ARG(r)) 
     262#define ASSERT_ARGS_Parrot_io_get_proto_by_name_unix \ 
     263     __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ 
     264       PARROT_ASSERT_ARG(interp) \ 
     265    , PARROT_ASSERT_ARG(name)) 
    257266#define ASSERT_ARGS_Parrot_io_listen_unix __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ 
    258267       PARROT_ASSERT_ARG(socket)) 
    259268#define ASSERT_ARGS_Parrot_io_poll_unix __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ 
     
    313322    Parrot_io_listen_unix((interp), (pmc), (backlog)) 
    314323#define PIO_ACCEPT(interp, pmc) \ 
    315324    Parrot_io_accept_unix((interp), (pmc)) 
     325#define PIO_GET_PROTO_BY_NAME(interp, name) \ 
     326    Parrot_io_get_proto_by_name_unix((interp), (name)) 
    316327 
    317328#endif /* PARROT_IO_UNIX_H_GUARD */ 
    318329 
  • include/parrot/io.h

     
    825825 
    826826PARROT_EXPORT 
    827827PARROT_WARN_UNUSED_RESULT 
     828INTVAL Parrot_io_get_proto_by_name(PARROT_INTERP, ARGIN(STRING * name)) 
     829        __attribute__nonnull__(1) 
     830        __attribute__nonnull__(2); 
     831 
     832PARROT_EXPORT 
     833PARROT_WARN_UNUSED_RESULT 
    828834INTVAL Parrot_io_listen(PARROT_INTERP, ARGMOD(PMC *pmc), INTVAL backlog) 
    829835        __attribute__nonnull__(1) 
    830836        __attribute__nonnull__(2) 
     
    892898       PARROT_ASSERT_ARG(interp) \ 
    893899    , PARROT_ASSERT_ARG(pmc) \ 
    894900    , PARROT_ASSERT_ARG(address)) 
     901#define ASSERT_ARGS_Parrot_io_get_proto_by_name __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ 
     902       PARROT_ASSERT_ARG(interp) \ 
     903    , PARROT_ASSERT_ARG(name)) 
    895904#define ASSERT_ARGS_Parrot_io_listen __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ 
    896905       PARROT_ASSERT_ARG(interp) \ 
    897906    , PARROT_ASSERT_ARG(pmc))