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,10 +30,11 @@
 #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,10 +52,11 @@
 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,10 +114,13 @@
             "(^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,10 +183,13 @@
             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,10 +234,13 @@
         },
         { "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,10 +681,39 @@
 
         (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