Print this page
OS-3524 in order to support interaction with docker containers, need to be able to connect to stdio for init from GZ
OS-3525 in order to support 'docker logs' need to be able to get stdio from zone to log file
OS-3294 add support for inotify
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
        
*** 30,39 ****
--- 30,40 ----
  #include <strings.h>
  #include <stdlib.h>
  #include <limits.h>
  #include <sys/zone.h>
  #include <sys/zcons.h>
+ #include <sys/zfd.h>
  #include <sys/cpuid_drv.h>
  
  static int display(di_minor_t minor, di_node_t node);
  static int parallel(di_minor_t minor, di_node_t node);
  static int node_slash_minor(di_minor_t minor, di_node_t node);
*** 51,60 ****
--- 52,62 ----
  static int gpio(di_minor_t minor, di_node_t node);
  static int av_create(di_minor_t minor, di_node_t node);
  static int tsalarm_create(di_minor_t minor, di_node_t node);
  static int ntwdt_create(di_minor_t minor, di_node_t node);
  static int zcons_create(di_minor_t minor, di_node_t node);
+ static int zfd_create(di_minor_t minor, di_node_t node);
  static int cpuid(di_minor_t minor, di_node_t node);
  static int glvc(di_minor_t minor, di_node_t node);
  static int ses_callback(di_minor_t minor, di_node_t node);
  static int kmdrv_create(di_minor_t minor, di_node_t node);
  
*** 112,121 ****
--- 114,126 ----
              "(^ip6$)|(^tcp6$)|(^udp6$)|(^icmp6$)|"
              "(^rts$)|(^arp$)|(^ipsecah$)|(^ipsecesp$)|(^keysock$)|(^spdsock$)|"
              "(^nca$)|(^rds$)|(^sdp$)|(^ipnet$)|(^dlpistub$)|(^bpf$)",
              TYPE_EXACT | DRV_RE, ILEVEL_1, minor_name
          },
+         { "pseudo", "ddi_pseudo", "inotify",
+             TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name
+         },
          { "pseudo", "ddi_pseudo", "ipd",
              TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name
          },
          { "pseudo", "ddi_pseudo",
              "(^ipf$)|(^ipnat$)|(^ipstate$)|(^ipauth$)|"
*** 178,187 ****
--- 183,195 ----
              TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name
          },
          { "pseudo", "ddi_pseudo", "zcons",
              TYPE_EXACT | DRV_EXACT, ILEVEL_0, zcons_create,
          },
+         { "pseudo", "ddi_pseudo", "zfd",
+             TYPE_EXACT | DRV_EXACT, ILEVEL_0, zfd_create,
+         },
          { "pseudo", "ddi_pseudo", CPUID_DRIVER_NAME,
              TYPE_EXACT | DRV_EXACT, ILEVEL_0, cpuid,
          },
          { "pseudo", "ddi_pseudo", "glvc",
              TYPE_EXACT | DRV_EXACT, ILEVEL_0, glvc,
*** 226,235 ****
--- 234,246 ----
          },
          { "pseudo", "^zcons/" ZONENAME_REGEXP "/(" ZCONS_MASTER_NAME "|"
                  ZCONS_SLAVE_NAME ")$",
              RM_PRE | RM_HOT | RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
          },
+         { "pseudo", "^zfd/" ZONENAME_REGEXP "/(master|slave)/[0-9]+$",
+             RM_PRE | RM_HOT | RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+         },
          { "pseudo", "^" CPUID_SELF_NAME "$", RM_ALWAYS | RM_PRE | RM_HOT,
              ILEVEL_0, devfsadm_rm_all
          },
          { "enclosure", "^es/ses[0-9]+$", RM_POST,
                  ILEVEL_0, devfsadm_rm_all
*** 670,679 ****
--- 681,719 ----
  
          (void) snprintf(path, sizeof (path), "zcons/%s/%s", zonename,
              minor_str);
          (void) devfsadm_mklink(path, node, minor, 0);
  
+         return (DEVFSADM_CONTINUE);
+ }
+ 
+ static int
+ zfd_create(di_minor_t minor, di_node_t node)
+ {
+         char    *minor_str;
+         char    *zonename;
+         int     *id;
+         char    path[MAXPATHLEN];
+ 
+         minor_str = di_minor_name(minor);
+ 
+         if (di_prop_lookup_strings(DDI_DEV_T_ANY, node, "zfd_zname",
+             &zonename) == -1)
+                 return (DEVFSADM_CONTINUE);
+ 
+         if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "zfd_id", &id) == -1)
+                 return (DEVFSADM_CONTINUE);
+ 
+         if (strncmp(minor_str, "slave", 5) == 0) {
+                 (void) snprintf(path, sizeof (path), "zfd/%s/slave/%d",
+                     zonename, id[0]);
+         } else {
+                 (void) snprintf(path, sizeof (path), "zfd/%s/master/%d",
+                     zonename, id[0]);
+         }
+         (void) devfsadm_mklink(path, node, minor, 0);
+ 
          return (DEVFSADM_CONTINUE);
  }
  
  /*
   *      /dev/cpu/self/cpuid     ->      /devices/pseudo/cpuid@0:self