bossan 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: