bossan 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -59,7 +59,7 @@
59
59
 
60
60
  #define MSG_413 ("HTTP/1.0 413 Request Entity Too Large\r\nContent-Type: text/html\r\nServer: " SERVER "\r\n\r\n<html><head><title>Request Entity Too Large</title></head><body><p>Request Entity Too Large.</p></body></html>")
61
61
 
62
- #define SERVER "bossan/0.1"
62
+ #define SERVER "bossan/0.1.4"
63
63
 
64
64
  VALUE server; // Bossan
65
65
 
@@ -110,6 +110,8 @@ static short server_port = 8000;
110
110
 
111
111
  static int listen_sock; // listen socket
112
112
 
113
+ static char *unix_sock_name = NULL;
114
+
113
115
  static int loop_done; // main loop flag
114
116
  static picoev_loop* main_loop; //main loop
115
117
  static VALUE rack_app = NULL; //rack app
@@ -1847,6 +1849,61 @@ inet_listen(void)
1847
1849
  return 1;
1848
1850
  }
1849
1851
 
1852
+ static inline int
1853
+ check_unix_sockpath(char *sock_name)
1854
+ {
1855
+ if(!access(sock_name, F_OK)){
1856
+ if(unlink(sock_name) < 0){
1857
+ rb_raise(rb_eIOError, "failed to access sock_name\n");
1858
+ }
1859
+ }
1860
+ return 1;
1861
+ }
1862
+
1863
+ static inline int
1864
+ unix_listen(char *sock_name)
1865
+ {
1866
+ int flag = 1;
1867
+ struct sockaddr_un saddr;
1868
+ mode_t old_umask;
1869
+
1870
+ #ifdef DEBUG
1871
+ printf("unix domain socket %s\n", sock_name);
1872
+ #endif
1873
+ memset(&saddr, 0, sizeof(saddr));
1874
+ check_unix_sockpath(sock_name);
1875
+
1876
+ if ((listen_sock = socket(AF_UNIX, SOCK_STREAM,0)) == -1) {
1877
+ rb_raise(rb_eIOError, "server: failed to listen sock\n");
1878
+ }
1879
+
1880
+ if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &flag,
1881
+ sizeof(int)) == -1) {
1882
+ close(listen_sock);
1883
+ rb_raise(rb_eIOError, "server: failed to set sockopt\n");
1884
+ }
1885
+
1886
+ saddr.sun_family = PF_UNIX;
1887
+ strcpy(saddr.sun_path, sock_name);
1888
+
1889
+ old_umask = umask(0);
1890
+
1891
+ if (bind(listen_sock, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) {
1892
+ close(listen_sock);
1893
+ rb_raise(rb_eIOError, "server: failed to bind\n");
1894
+ }
1895
+ umask(old_umask);
1896
+
1897
+ // BACKLOG 1024
1898
+ if (listen(listen_sock, BACKLOG) == -1) {
1899
+ close(listen_sock);
1900
+ rb_raise(rb_eIOError, "server: failed to set backlog\n");
1901
+ }
1902
+
1903
+ unix_sock_name = sock_name;
1904
+ return 1;
1905
+ }
1906
+
1850
1907
  static void
1851
1908
  sigint_cb(int signum)
1852
1909
  {
@@ -1882,39 +1939,44 @@ bossan_access_log(VALUE self, VALUE args)
1882
1939
  return Qnil;
1883
1940
  }
1884
1941
 
1885
- // Bossan.run('127.0.0.1', 8000, proc do |env|
1886
- // ...
1887
- // end
1888
1942
  static VALUE
1889
- bossan_run_loop(VALUE self, VALUE args1, VALUE args2, VALUE args3)
1943
+ bossan_run_loop(int argc, VALUE *argv, VALUE self)
1890
1944
  {
1891
1945
  int ret;
1946
+ VALUE args1, args2, args3;
1947
+
1948
+ rb_scan_args(argc, argv, "21", &args1, &args2, &args3);
1892
1949
 
1893
1950
  if(listen_sock > 0){
1894
1951
  rb_raise(rb_eException, "already set listen socket");
1895
1952
  }
1896
-
1897
- server_name = StringValuePtr(args1);
1898
- server_port = NUM2INT(args2);
1899
1953
 
1900
- long _port = NUM2INT(args2);
1954
+ if (argc == 3){
1955
+ server_name = StringValuePtr(args1);
1956
+ server_port = NUM2INT(args2);
1901
1957
 
1902
- if (_port <= 0 || _port >= 65536) {
1903
- // out of range
1904
- rb_raise(rb_eArgError, "port number outside valid range");
1905
- }
1958
+ long _port = NUM2INT(args2);
1906
1959
 
1907
- server_port = (short)_port;
1960
+ if (_port <= 0 || _port >= 65536) {
1961
+ // out of range
1962
+ rb_raise(rb_eArgError, "port number outside valid range");
1963
+ }
1908
1964
 
1909
- ret = inet_listen();
1965
+ server_port = (short)_port;
1966
+
1967
+ ret = inet_listen();
1968
+ rack_app = args3;
1969
+ } else {
1970
+ Check_Type(args1, T_STRING);
1971
+ ret = unix_listen(args1);
1972
+ rack_app = args2;
1973
+ }
1910
1974
 
1911
1975
  if(ret < 0){
1912
1976
  //error
1913
1977
  listen_sock = -1;
1914
1978
  }
1915
1979
 
1916
- rack_app = args3;
1917
-
1918
1980
  if(listen_sock <= 0){
1919
1981
  rb_raise(rb_eTypeError, "not found listen socket");
1920
1982
  }
@@ -2013,7 +2075,7 @@ Init_bossan_ext(void)
2013
2075
  server = rb_define_module("Bossan");
2014
2076
  rb_gc_register_address(&server);
2015
2077
 
2016
- rb_define_module_function(server, "run", bossan_run_loop, 3);
2078
+ rb_define_module_function(server, "run", bossan_run_loop, -1);
2017
2079
  rb_define_module_function(server, "stop", bossan_stop, 0);
2018
2080
 
2019
2081
  rb_define_module_function(server, "access_log", bossan_access_log, 1);
@@ -2,6 +2,6 @@ require_relative "bossan/version"
2
2
  require_relative "bossan/bossan_ext"
3
3
  require_relative "rack/handler/bossan"
4
4
 
5
- def run(host='127.0.0.1', port=8000, app)
6
- Bossan.run(host, port, app)
5
+ def run *args
6
+ Bossan.run *args
7
7
  end
@@ -1,3 +1,3 @@
1
1
  module Bossan
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bossan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-12 00:00:00.000000000 Z
12
+ date: 2012-12-18 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: high performance asynchronous rack web server
15
15
  email: