LLA and DLPI Example Programs
DLPI Example Program
struct strbuf data_buf = { |
|
|
| |
AREA_SIZE, | /* maxlen = | AREA_SIZE */ | ||
0, |
| /* len gets | filled in for each message */ | |
data_area | /* buf = data area */ | |||
}; |
|
|
|
|
/********************************************************************* | ||||
get the next message from a | stream; get_msg() returns one of the | |||
following defines |
|
| ||
*********************************************************************/ | ||||
#define GOT_CTRL |
| 1 | /* | message has only a control part */ |
#define GOT_DATA |
| 2 | /* | message has only a data part */ |
#define GOT_BOTH |
| 3 | /* | message has control and data parts */ |
int |
|
|
|
|
get_msg(fd) |
|
|
|
|
int | fd; |
| /* | file descriptor */ |
{ |
|
|
|
|
int | flags = 0; | /* | 0 | |
int | result = 0; | /* | return value */ | |
/* |
|
|
|
|
zero first byte of control area so the caller can call check_ctrl | ||||
without checking the get_msg return value; if only data was | ||||
in the message and the user | was expecting control or control + |
data, then when he calls check_ctrl it will compare the expected primitive zero and print information about the primitive
that it got. */ ctrl_area[0] = 0;
/* call getmsg and check for an error */ if(getmsg(fd, &ctrl_buf, &data_buf, &flags) < 0) {
printf(”error: getmsg failed, errno = %d\n”, errno); exit(1);
}
if(ctrl_buf.len > 0) { result = GOT_CTRL;
}
if(data_buf.len > 0) { result = GOT_DATA;
}
return(result);
}
/*********************************************************************
check that control message is the expected message
*********************************************************************/
void
check_ctrl(ex_prim)
int | ex_prim; /* the expected primitive */ |
{
dl_error_ack_t*err_ack = (dl_error_ack_t *)ctrl_area;
/* did we get the expected primitive? */
22 | Chapter 2 |