Beispiel #1
0
int
decode_DIS_svrattrl(int sock, pbs_list_head *phead)
{
	int		i;
	unsigned int	hasresc;
	size_t		ls;
	unsigned int	data_len;
	unsigned int	numattr;
	svrattrl       *psvrat;
	int		rc;
	size_t		tsize;


	numattr = disrui(sock, &rc);	/* number of attributes in set */
	if (rc) return rc;

	for (i=0; i<numattr; ++i) {

		data_len = disrui(sock, &rc);	/* here it is used */
		if (rc) return rc;

		tsize = sizeof(svrattrl) + data_len;
		if ((psvrat = (svrattrl *)malloc(tsize)) == 0)
			return DIS_NOMALLOC;

		CLEAR_LINK(psvrat->al_link);
		psvrat->al_sister = (svrattrl *)0;
		psvrat->al_atopl.next = 0;
		psvrat->al_tsize = tsize;
		psvrat->al_name  = (char *)psvrat + sizeof(svrattrl);
		psvrat->al_resc  = 0;
		psvrat->al_value = 0;
		psvrat->al_nameln = 0;
		psvrat->al_rescln = 0;
		psvrat->al_valln  = 0;
		psvrat->al_flags  = 0;
		psvrat->al_refct  = 1;

		if ((rc = disrfcs(sock, &ls, data_len, psvrat->al_name)) != 0)
			break;
		*(psvrat->al_name + ls++) = '\0';
		psvrat->al_nameln = (int)ls;
		data_len -= ls;

		hasresc = disrui(sock, &rc);
		if (rc) break;
		if (hasresc) {
			psvrat->al_resc = psvrat->al_name + ls;
			rc = disrfcs(sock, &ls, data_len, psvrat->al_resc);
			if (rc)
				break;
			*(psvrat->al_resc + ls++) = '\0';
			psvrat->al_rescln = (int)ls;
			data_len -= ls;
		}

		psvrat->al_value  = psvrat->al_name + psvrat->al_nameln +
			psvrat->al_rescln;
		if ((rc = disrfcs(sock, &ls, data_len, psvrat->al_value)) != 0)
			break;
		*(psvrat->al_value + ls++) = '\0';
		psvrat->al_valln = (int)ls;

		psvrat->al_op = (enum batch_op)disrui(sock, &rc);
		if (rc) break;

		append_link(phead, &psvrat->al_link, psvrat);
	}

	if (rc) {
		(void)free(psvrat);
	}

	return (rc);
}
Beispiel #2
0
int decode_DIS_svrattrl(
    
  struct tcp_chan *chan,
  tlist_head      *phead)

  {
  unsigned int  i;
  unsigned int  hasresc;
  size_t        ls;
  unsigned int  data_len;
  unsigned int  numattr;
  svrattrl     *psvrat = NULL;
  int           rc;
  size_t        tsize;


  numattr = disrui(chan, &rc); /* number of attributes in set */

  if (rc) return rc;

  for (i = 0; i < numattr; ++i)
    {
    data_len = disrui(chan, &rc); /* here it is used */

    if (data_len == 0)
      data_len = sizeof(char);

    if (rc)
      return(rc);

    tsize = sizeof(svrattrl) + data_len + 2; /* 2 more for nulls in name & resc*/

    if ((psvrat = (svrattrl *)calloc(1, tsize)) == 0)
      return DIS_NOMALLOC;

    CLEAR_LINK(psvrat->al_link);

    psvrat->al_atopl.next = 0;

    psvrat->al_tsize = tsize;

    psvrat->al_name  = (char *)psvrat + sizeof(svrattrl);

    psvrat->al_resc  = 0;

    psvrat->al_value = 0;

    psvrat->al_nameln = 0;

    psvrat->al_rescln = 0;

    psvrat->al_valln  = 0;

    psvrat->al_flags  = 0;

    if ((rc = disrfcs(chan, &ls, data_len, psvrat->al_name)))
      break;

    *(psvrat->al_name + ls++) = '\0';

    psvrat->al_nameln = (int)ls;

    data_len -= ls;

    hasresc = disrui(chan, &rc);

    if (rc) 
	  break;

    if (hasresc)
      {
      psvrat->al_resc = psvrat->al_name + ls;

      if ((rc = disrfcs(chan, &ls, data_len, psvrat->al_resc)))
        break;

      *(psvrat->al_resc + ls++) = '\0';

      psvrat->al_rescln = (int)ls;

      data_len -= ls;
      }

    psvrat->al_value  = psvrat->al_name + psvrat->al_nameln +

                        psvrat->al_rescln;

    if ((rc = disrfcs(chan, &ls, data_len, psvrat->al_value)))
      break;

    *(psvrat->al_value + ls++) = '\0';

    psvrat->al_valln = (int)ls;

    psvrat->al_op = (enum batch_op)disrui(chan, &rc);

    if (rc) break;

    append_link(phead, &psvrat->al_link, psvrat);
    }

  if (rc)
    {
    (void)free(psvrat);
    }

  return (rc);
  }