Author: iratqq
Date: Mon Jan 19 22:17:25 2009
New Revision: 5758

Modified:
   trunk/uim/socket.c

Log:
* uim/socket.c (c_make_sockaddr_un, c_delete_sockaddr_un)
  (c_set_sockaddr_un_sun_family, c_ref_sockaddr_un_sun_family)
  (c_set_sockaddr_un_sun_path, c_ref_sockaddr_un_sun_path, c_sun_len):
  - Add unix domain handling functions.
  (uim_plugin_instance_init):
  - Regist.


Modified: trunk/uim/socket.c
==============================================================================
--- trunk/uim/socket.c  (original)
+++ trunk/uim/socket.c  Mon Jan 19 22:17:25 2009
@@ -43,6 +43,7 @@
 #include <sys/socket.h>
 #include <netdb.h>
 #include <netinet/in.h>
+#include <sys/un.h>

 #include "uim.h"
 #include "uim-internal.h"
@@ -293,6 +294,70 @@
   return MAKE_INT(connect(C_INT(s_), C_PTR(name_), C_INT(namelen_)));
 }

+static uim_lisp
+c_make_sockaddr_un(void)
+{
+  struct sockaddr_un *sun;
+
+  sun = uim_malloc(sizeof(struct sockaddr_un));
+  memset(sun, 0, sizeof(struct sockaddr_un));
+  return MAKE_PTR(sun);
+}
+
+static uim_lisp
+c_delete_sockaddr_un(uim_lisp sun_)
+{
+  struct sockaddr_un *sun = C_PTR(sun_);
+
+  free(sun);
+  return uim_scm_t();
+}
+
+static uim_lisp
+c_set_sockaddr_un_sun_family(uim_lisp sun_, uim_lisp family_)
+{
+  struct sockaddr_un *sun = C_PTR(sun_);
+
+  sun->sun_family = C_INT(family_);
+  return uim_scm_t();
+}
+static uim_lisp
+c_ref_sockaddr_un_sun_family(uim_lisp sun_)
+{
+  struct sockaddr_un *sun = C_PTR(sun_);
+
+  return MAKE_INT(sun->sun_family);
+}
+
+static uim_lisp
+c_set_sockaddr_un_sun_path(uim_lisp sun_, uim_lisp path_)
+{
+  struct sockaddr_un *sun = C_PTR(sun_);
+
+  strlcpy(sun->sun_path, REFER_C_STR(path_), sizeof(sun->sun_path));
+  return uim_scm_t();
+}
+static uim_lisp
+c_ref_sockaddr_un_sun_path(uim_lisp sun_)
+{
+  struct sockaddr_un *sun = C_PTR(sun_);
+
+  return MAKE_STR(sun->sun_path);
+}
+
+#ifndef SUN_LEN
+#define SUN_LEN(su) \
+  (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+#endif
+
+static uim_lisp
+c_sun_len(uim_lisp sun_)
+{
+  struct sockaddr_un *sun = C_PTR(sun_);
+
+  return MAKE_INT(SUN_LEN(sun));
+}
+
 void
 uim_plugin_instance_init(void)
 {
@@ -325,6 +390,17 @@

   uim_scm_init_proc1("addrinfo-ai-addrlen?", c_addrinfo_ref_ai_addrlen);
   uim_scm_init_proc1("addrinfo-ai-addr?", c_addrinfo_ref_ai_addr);
+
+  uim_scm_init_proc0("make-sockaddr-un", c_make_sockaddr_un);
+  uim_scm_init_proc1("delete-sockaddr-un", c_delete_sockaddr_un);
+
+ uim_scm_init_proc2("sockaddr-set-un-sun-family!", c_set_sockaddr_un_sun_family); + uim_scm_init_proc1("sockaddr-un-sun-family?", c_ref_sockaddr_un_sun_family);
+
+ uim_scm_init_proc2("sockaddr-set-un-sun-path!", c_set_sockaddr_un_sun_path);
+  uim_scm_init_proc1("sockaddr-un-sun-path?", c_ref_sockaddr_un_sun_path);
+
+  uim_scm_init_proc1("sun-len", c_sun_len);

   uim_scm_init_proc3("getaddrinfo", c_getaddrinfo);
   uim_scm_init_proc1("freeaddrinfo", c_freeaddrinfo);

Reply via email to