Create file link connect function handler

Prototype:

int (*link) ( resmgr_context_t *ctp,
              io_link_t *msg,
              RESMGR_HANDLE_T *handle,
              io_link_extra_t *extra ) 

Classification:

Connect

Default handler:

none

Helper functions:

iofunc_link()

Client function:

link()

Messages:

_IO_CONNECT with subtype _IO_CONNECT_LINK

Data structure:

struct _io_connect {
  // internal fields (as described above)
  uint16_t path_len;
  uint8_t  extra_type;
  uint16_t extra_len;
  char     path [1];
};

struct _io_connect_link_reply {
  uint32_t reserved1;
  uint32_t file_type;
  uint8_t  eflag;
  uint8_t  reserved2[1];
  uint16_t chroot_len;
  uint32_t umask;
  uint16_t nentries;
  uint16_t path_len;
};

struct _io_connect_ftype_reply {
  uint16_t status;      /* Typically an errno */
  uint16_t reserved;
  uint32_t file_type;   /* _FTYPE_? in sys/ftype.h */
};

typedef union {
  struct _io_connect             connect;
  struct _io_connect_link_reply  link_reply;
  struct _io_connect_ftype_reply ftype_reply;
} io_link_t;

typedef union _io_link_extra {
  struct _msg_info              info;
  void                          *ocb;
  char                          path [1];
  struct _io_resmgr_link_extra  resmgr;
} io_link_extra_t;

Description:

Creates a new link with the name given in the path member of msg to the already-existing pathname specified by the path member of extra (passed to your function). For convenience, the ocb member of extra contains a pointer to the OCB for the existing pathname.

Returns:

The status via the helper macro _RESMGR_STATUS().

Referenced by:

resmgr_connect_funcs_t connect table

Permission checking:

The iofunc_link() function uses iofunc_check_access() with the S_ISUID, S_ISGID, and S_IREAD flags to check access on the OCB for the existing pathname.