Ruby  3.1.0dev(2021-09-10revisionb76ad15ed0da636161de0243c547ee1e6fc95681)
unixserver.c
Go to the documentation of this file.
1 /************************************************
2 
3  unixserver.c -
4 
5  created at: Thu Mar 31 12:21:29 JST 1994
6 
7  Copyright (C) 1993-2007 Yukihiro Matsumoto
8 
9 ************************************************/
10 
11 #include "rubysocket.h"
12 
13 #ifdef HAVE_SYS_UN_H
14 /*
15  * call-seq:
16  * UNIXServer.new(path) => unixserver
17  *
18  * Creates a new UNIX server socket bound to _path_.
19  *
20  * require 'socket'
21  *
22  * serv = UNIXServer.new("/tmp/sock")
23  * s = serv.accept
24  * p s.read
25  */
26 static VALUE
27 unix_svr_init(VALUE sock, VALUE path)
28 {
29  return rsock_init_unixsock(sock, path, 1);
30 }
31 
32 /*
33  * call-seq:
34  * unixserver.accept => unixsocket
35  *
36  * Accepts an incoming connection.
37  * It returns a new UNIXSocket object.
38  *
39  * UNIXServer.open("/tmp/sock") {|serv|
40  * UNIXSocket.open("/tmp/sock") {|c|
41  * s = serv.accept
42  * s.puts "hi"
43  * s.close
44  * p c.read #=> "hi\n"
45  * }
46  * }
47  *
48  */
49 static VALUE
50 unix_accept(VALUE server)
51 {
52  struct sockaddr_un buffer;
53  socklen_t length = sizeof(buffer);
54 
55  return rsock_s_accept(rb_cUNIXSocket, server, (struct sockaddr*)&buffer, &length);
56 }
57 
58 /* :nodoc: */
59 static VALUE
60 unix_accept_nonblock(VALUE sock, VALUE ex)
61 {
62  rb_io_t *fptr;
63  struct sockaddr_un from;
64  socklen_t fromlen;
65 
66  GetOpenFile(sock, fptr);
67  fromlen = (socklen_t)sizeof(from);
68  return rsock_s_accept_nonblock(rb_cUNIXSocket, ex, fptr,
69  (struct sockaddr *)&from, &fromlen);
70 }
71 
72 /*
73  * call-seq:
74  * unixserver.sysaccept => file_descriptor
75  *
76  * Accepts a new connection.
77  * It returns the new file descriptor which is an integer.
78  *
79  * UNIXServer.open("/tmp/sock") {|serv|
80  * UNIXSocket.open("/tmp/sock") {|c|
81  * fd = serv.sysaccept
82  * s = IO.new(fd)
83  * s.puts "hi"
84  * s.close
85  * p c.read #=> "hi\n"
86  * }
87  * }
88  *
89  */
90 static VALUE
91 unix_sysaccept(VALUE server)
92 {
93  struct sockaddr_un buffer;
94  socklen_t length = sizeof(buffer);
95 
96  return rsock_s_accept(0, server, (struct sockaddr*)&buffer, &length);
97 }
98 
99 #endif
100 
101 void
103 {
104 #ifdef HAVE_SYS_UN_H
105  /*
106  * Document-class: UNIXServer < UNIXSocket
107  *
108  * UNIXServer represents a UNIX domain stream server socket.
109  *
110  */
111  rb_cUNIXServer = rb_define_class("UNIXServer", rb_cUNIXSocket);
112  rb_define_method(rb_cUNIXServer, "initialize", unix_svr_init, 1);
113  rb_define_method(rb_cUNIXServer, "accept", unix_accept, 0);
114 
115  rb_define_private_method(rb_cUNIXServer,
116  "__accept_nonblock", unix_accept_nonblock, 1);
117 
118  rb_define_method(rb_cUNIXServer, "sysaccept", unix_sysaccept, 0);
119  rb_define_method(rb_cUNIXServer, "listen", rsock_sock_listen, 1); /* in socket.c */
120 #endif
121 }
rb_define_class
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
Definition: class.c:759
rsock_init_unixsock
VALUE rsock_init_unixsock(VALUE sock, VALUE path, int server)
GetOpenFile
#define GetOpenFile
Definition: io.h:125
rsock_s_accept_nonblock
VALUE rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
Definition: init.c:636
socklen_t
int socklen_t
Definition: getaddrinfo.c:83
rsock_s_accept
VALUE rsock_s_accept(VALUE klass, VALUE io, struct sockaddr *sockaddr, socklen_t *len)
Definition: init.c:678
rsock_init_unixserver
void rsock_init_unixserver(void)
Definition: unixserver.c:102
rb_define_private_method
#define rb_define_private_method(klass, mid, func, arity)
Defines klass#mid and makes it private.
Definition: cxxanyargs.hpp:662
VALUE
unsigned long VALUE
Definition: value.h:38
rsock_sock_listen
VALUE rsock_sock_listen(VALUE sock, VALUE log)
Definition: socket.c:607
rubysocket.h
rb_define_method
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
Definition: cxxanyargs.hpp:655
rb_io_t
Definition: io.h:61