Changeset bb84bf791b8380b1ed2e0a65b2f595fab3bd711d

Show
Ignore:
Timestamp:
03/02/12 16:46:28 (2 years ago)
Author:
Philip Maddox <pmaddox@pmaddox.(none)>
git-committer:
Philip Maddox <pmaddox@pmaddox.(none)> 1330706788 -0500
git-parent:

[a6700cad43acfe8707a50af2a3f7f4f62f211019]

git-author:
Philip Maddox <pmaddox@pmaddox.(none)> 1330706788 -0500
Message:

Modified external data read to avoid use of MSG_PEEK

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/modules/external.c

    rf91ddca rbb84bf7  
    229229    struct check_info *ci; 
    230230    void *vci; 
     231    int ret; 
    231232 
    232233    if(!data->cr) { 
    233234      struct external_response r; 
    234       struct msghdr msg
    235       struct iovec v[3]; 
     235      external_header h
     236 
    236237      memset(&r, 0, sizeof(r)); 
    237       v[0].iov_base = (char *)&r.check_no; 
    238       v[0].iov_len = sizeof(r.check_no); 
    239       v[1].iov_base = (char *)&r.exit_code; 
    240       v[1].iov_len = sizeof(r.exit_code); 
    241       v[2].iov_base = (char *)&r.stdoutlen; 
    242       v[2].iov_len = sizeof(r.stdoutlen); 
    243       expectlen = v[0].iov_len + v[1].iov_len + v[2].iov_len; 
    244  
    245       /* Make this into a recv'ble message so we can PEEK */ 
    246       memset(&msg, 0, sizeof(msg)); 
    247       msg.msg_iov = v; 
    248       msg.msg_iovlen = 3; 
    249       inlen = recvmsg(e->fd, &msg, MSG_PEEK); 
    250       if(inlen == 0) goto widowed; 
    251       if((inlen == -1 && errno == EAGAIN) || 
    252          (inlen > 0 && inlen < expectlen)) 
    253         return EVENTER_READ | EVENTER_EXCEPTION; 
    254       if(inlen == -1) 
    255         noitL(noit_error, "recvmsg() failed: %s\n", strerror(errno)); 
     238      memset(&h, 0, sizeof(h)); 
     239      expectlen = sizeof(h); 
     240      inlen = 0; 
     241 
     242      while (1) 
     243      { 
     244        ret = read(e->fd, (char*)(&h)+inlen, expectlen - inlen); 
     245        if (ret == -1) 
     246        { 
     247          if (errno == EAGAIN) 
     248          { 
     249            return EVENTER_READ | EVENTER_EXCEPTION; 
     250          } 
     251          else if (errno != EINTR) 
     252          { 
     253            break; 
     254          } 
     255        } 
     256        else if (ret == 0) 
     257        { 
     258          goto widowed; 
     259        } 
     260        else 
     261        { 
     262          inlen += ret; 
     263          if (inlen >= 14) 
     264          { 
     265            break; 
     266          } 
     267        } 
     268      } 
     269 
    256270      assert(inlen == expectlen); 
    257       while(-1 == (inlen = recvmsg(e->fd, &msg, 0)) && errno == EINTR); 
    258       assert(inlen == expectlen); 
     271      r.check_no = h.check_no; 
     272      r.exit_code = h.exit_code; 
     273      r.stdoutlen = h.stdoutlen; 
    259274      data->cr = calloc(sizeof(*data->cr), 1); 
    260275      memcpy(data->cr, &r, sizeof(r)); 
  • src/modules/external_proc.h

    r88a7178 rbb84bf7  
    6363} external_data_t; 
    6464 
     65typedef struct { 
     66  int64_t check_no; 
     67  int32_t exit_code; 
     68  u_int16_t stdoutlen; 
     69} __attribute__((packed)) external_header; 
     70 
    6571int external_child(external_data_t *); 
    6672