Print this page
OS-3280 need a way to specify the root of a native system in the lx brand
OS-3279 lx brand should allow delegated datasets
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
        
*** 22,34 ****
  /*
   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
- #pragma ident   "%Z%%M% %I%     %E% SMI"
- 
  #include "lint.h"
  #include <libc.h>
  #include <fcntl.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/types.h>
--- 22,33 ----
  /*
   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
  #include "lint.h"
+ #include "thr_uberdata.h"
  #include <libc.h>
  #include <fcntl.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/types.h>
*** 36,45 ****
--- 35,45 ----
  #include <sys/auxv.h>
  #include <mtlib.h>
  #include <thread.h>
  #include <synch.h>
  #include <atomic.h>
+ #include <limits.h>
  
  static mutex_t auxlock = DEFAULTMUTEX;
  
  /*
   * Get auxiliary entry.
*** 57,71 ****
           * passed to the process at exec(2).  Only do this once.
           */
          if (auxb == NULL) {
                  lmutex_lock(&auxlock);
                  if (auxb == NULL) {
                          struct stat statb;
                          auxv_t *buf = NULL;
                          int fd;
  
!                         if ((fd = open("/proc/self/auxv", O_RDONLY)) != -1 &&
                              fstat(fd, &statb) != -1)
                                  buf = libc_malloc(
                                      statb.st_size + sizeof (auxv_t));
  
                          if (buf != NULL) {
--- 57,80 ----
           * passed to the process at exec(2).  Only do this once.
           */
          if (auxb == NULL) {
                  lmutex_lock(&auxlock);
                  if (auxb == NULL) {
+                         uberdata_t *udp = curthread->ul_uberdata;
                          struct stat statb;
                          auxv_t *buf = NULL;
+                         char *path = "/proc/self/auxv";
+                         char pbuf[PATH_MAX];
                          int fd;
  
!                         if (udp->ub_broot != NULL) {
!                                 (void) snprintf(pbuf, sizeof (pbuf),
!                                     "%s/proc/self/auxv", udp->ub_broot);
!                                 path = pbuf;
!                         }
! 
!                         if ((fd = open(path, O_RDONLY)) != -1 &&
                              fstat(fd, &statb) != -1)
                                  buf = libc_malloc(
                                      statb.st_size + sizeof (auxv_t));
  
                          if (buf != NULL) {