Print this page
NEX-9532 NDMP: readdir errors when file/directory has special characters
Reviewed by: Peer Dampmann <peer.dampmann@nexenta.com>
Reviewed by: Alexander Eremin <alexander.eremin@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-2911 NDMP logging should use syslog and is too chatty

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/ndmpd/ndmp/ndmpd_door.c
          +++ new/usr/src/cmd/ndmpd/ndmp/ndmpd_door.c
↓ open down ↓ 28 lines elided ↑ open up ↑
  29   29   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  30   30   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  31   31   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  32   32   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  33   33   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  34   34   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  35   35   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  36   36   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  37   37   * POSSIBILITY OF SUCH DAMAGE.
  38   38   */
       39 +/* Copyright 2017 Nexenta Systems, Inc. All rights reserved. */
  39   40  
  40   41  /* This file contains all the door server code */
  41   42  
       43 +#include <syslog.h>
  42   44  #include <door.h>
  43   45  #include <alloca.h>
  44   46  #include <errno.h>
  45   47  #include <note.h>
  46   48  #include <libintl.h>
  47   49  #include <ndmpd_door.h>
  48   50  #include "ndmpd.h"
  49   51  
  50   52  /* static variables */
  51   53  static int      ndmp_door_fildes = -1;
↓ open down ↓ 9 lines elided ↑ open up ↑
  61   63  ndmp_stat_t ndstat;
  62   64  
  63   65  int
  64   66  ndmp_door_init(void)
  65   67  {
  66   68          int fd;
  67   69  
  68   70          (void) mutex_lock(&ndmp_doorsrv_mutex);
  69   71  
  70   72          if (ndmp_door_fildes != -1) {
  71      -                NDMP_LOG(LOG_DEBUG,
       73 +                syslog(LOG_ERR,
  72   74                      "ndmp_door_init: ndmpd service is already running.");
  73   75                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
  74   76                  return (0);
  75   77          }
  76   78  
  77   79          if ((ndmp_door_fildes = door_create(ndmp_door_server,
  78   80              NULL, DOOR_UNREF)) < 0) {
  79      -                NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Could not create door.");
       81 +                syslog(LOG_ERR, "ndmp_door_init: Could not create door.");
  80   82                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
  81   83                  return (-1);
  82   84          }
  83   85  
  84   86          (void) unlink(NDMP_DOOR_SVC);
  85   87  
  86   88          if ((fd = creat(NDMP_DOOR_SVC, 0444)) < 0) {
  87      -                NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Can't create %s: %m.",
       89 +                syslog(LOG_ERR, "ndmp_door_init: Can't create %s: %m.",
  88   90                      NDMP_DOOR_SVC);
  89   91                  (void) door_revoke(ndmp_door_fildes);
  90   92                  ndmp_door_fildes = -1;
  91   93                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
  92   94                  return (-1);
  93   95          }
  94   96  
  95   97          (void) close(fd);
  96   98          (void) fdetach(NDMP_DOOR_SVC);
  97   99  
  98  100          if (fattach(ndmp_door_fildes, NDMP_DOOR_SVC) < 0) {
  99      -                NDMP_LOG(LOG_DEBUG, "ndmp_door_init: fattach failed %m");
      101 +                syslog(LOG_ERR, "ndmp_door_init: fattach failed %m");
 100  102                  (void) door_revoke(ndmp_door_fildes);
 101  103                  ndmp_door_fildes = -1;
 102  104                  (void) mutex_unlock(&ndmp_doorsrv_mutex);
 103  105                  return (-1);
 104  106          }
 105  107  
 106      -        NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Door server successfully started");
      108 +        syslog(LOG_DEBUG, "ndmp_door_init: Door server successfully started");
 107  109          (void) mutex_unlock(&ndmp_doorsrv_mutex);
 108  110          return (0);
 109  111  }
 110  112  
 111  113  void
 112  114  ndmp_door_fini(void)
 113  115  {
 114  116          (void) mutex_lock(&ndmp_doorsrv_mutex);
 115  117  
 116  118          if (ndmp_door_fildes != -1) {
↓ open down ↓ 13 lines elided ↑ open up ↑
 130  132  
 131  133          if ((door = open(NDMP_DOOR_SVC, O_RDONLY)) < 0)
 132  134                  return (0);
 133  135  
 134  136          if (door_info(door, &info) < 0) {
 135  137                  (void) close(door);
 136  138                  return (0);
 137  139          }
 138  140  
 139  141          if (info.di_target > 0) {
 140      -                NDMP_LOG(LOG_ERR,
      142 +                syslog(LOG_ERR,
 141  143                      "Service already running: pid %ld", info.di_target);
 142  144                  (void) close(door);
 143  145                  return (1);
 144  146          }
 145  147  
 146  148          (void) close(door);
 147  149          return (0);
 148  150  }
 149  151  
 150  152  /* door server */
↓ open down ↓ 2 lines elided ↑ open up ↑
 153  155  ndmp_door_server(void *cookie, char *ptr, size_t size,
 154  156      door_desc_t *dp, uint_t n_desc)
 155  157  {
 156  158          NOTE(ARGUNUSED(cookie,dp,n_desc))
 157  159          int req_type;
 158  160          char *buf;
 159  161          int buflen;
 160  162          unsigned int used;
 161  163          ndmp_door_ctx_t *dec_ctx;
 162  164          ndmp_door_ctx_t *enc_ctx;
 163      -        unsigned int dec_status;
 164      -        unsigned int enc_status;
      165 +        unsigned int dec_status = EINVAL;
      166 +        unsigned int enc_status = EINVAL;
 165  167  
 166  168          dec_ctx = ndmp_door_decode_start(ptr, size);
 167  169          if (dec_ctx == 0)
 168  170                  return;
 169  171  
 170  172          req_type = ndmp_door_get_uint32(dec_ctx);
 171  173          buflen = NDMP_DOOR_SIZE;
 172  174  
 173  175          if ((buf = alloca(buflen)) == NULL) {
 174      -                NDMP_LOG(LOG_DEBUG, "Out of memory.");
      176 +                syslog(LOG_ERR, "Out of memory.");
 175  177                  (void) ndmp_door_decode_finish(dec_ctx);
 176  178                  return;
 177  179          }
 178  180  
 179  181          enc_ctx = ndmp_door_encode_start(buf, buflen);
 180  182          if (enc_ctx == 0) {
 181  183                  (void) ndmp_door_decode_finish(dec_ctx);
 182  184                  return;
 183  185          }
 184  186  
 185  187          if (req_type != NDMP_GET_STAT)
 186      -                NDMP_LOG(LOG_DEBUG, "ndmp_door_server: req_type=%d", req_type);
      188 +                syslog(LOG_DEBUG, "ndmp_door_server: req_type=%d", req_type);
 187  189  
 188  190          switch (req_type) {
 189  191          case NDMP_GET_DOOR_STATUS: {
 190  192                  ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
 191  193                  break;
 192  194                  }
 193  195          case NDMP_DEVICES_GET_INFO: {
 194  196                  ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
 195  197                  ndmpd_get_devs(enc_ctx);
 196  198                  break;
↓ open down ↓ 25 lines elided ↑ open up ↑
 222  224                  ndmp_door_put_uint32(enc_ctx, ndstat.ns_nrs);
 223  225                  ndmp_door_put_uint32(enc_ctx, ndstat.ns_rfile);
 224  226                  ndmp_door_put_uint32(enc_ctx, ndstat.ns_wfile);
 225  227                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_rdisk);
 226  228                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_wdisk);
 227  229                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_rtape);
 228  230                  ndmp_door_put_uint64(enc_ctx, ndstat.ns_wtape);
 229  231                  break;
 230  232  
 231  233          default:
 232      -                NDMP_LOG(LOG_DEBUG,
      234 +                syslog(LOG_ERR,
 233  235                      "ndmp_door_server: Invalid request type 0x%x", req_type);
 234  236                  goto decode_error;
 235  237          }
 236  238  
 237  239          if ((dec_status = ndmp_door_decode_finish(dec_ctx)) != 0)
 238  240                  goto decode_error;
 239  241  
 240  242          if ((enc_status = ndmp_door_encode_finish(enc_ctx, &used)) != 0)
 241  243                  goto encode_error;
 242  244  
↓ open down ↓ 18 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX