mirror of
https://framagit.org/bortzmeyer/echoping
synced 2024-11-18 15:26:17 +00:00
47 lines
926 B
C
47 lines
926 B
C
|
/*
|
||
|
* Read a line from a descriptor. Read the line one byte at a time, looking
|
||
|
* for the newline. We store the newline in the buffer, then follow it with
|
||
|
* a null (the same as fgets(3)). We return the number of characters up to,
|
||
|
* but not including, the null (the same as strlen(3)). If ln == 0, we treat
|
||
|
* newline as an ordinary charracter.
|
||
|
*/
|
||
|
|
||
|
/* Stolen from Stevens' book */
|
||
|
|
||
|
#include "echoping.h"
|
||
|
|
||
|
int
|
||
|
readline (fd, ptr, maxlen, ln)
|
||
|
int fd;
|
||
|
char *ptr;
|
||
|
int maxlen;
|
||
|
unsigned short ln;
|
||
|
{
|
||
|
int n, rc;
|
||
|
char c;
|
||
|
|
||
|
for (n = 1; n < maxlen; n++)
|
||
|
{
|
||
|
if (timeout_flag)
|
||
|
return n;
|
||
|
if ((rc = read (fd, &c, 1)) == 1)
|
||
|
{
|
||
|
*ptr++ = c;
|
||
|
if (c == '\n' && ln == 1)
|
||
|
break;
|
||
|
}
|
||
|
else if (rc == 0)
|
||
|
{
|
||
|
if (n == 1)
|
||
|
return (0); /* EOF, no data read */
|
||
|
else
|
||
|
break; /* EOF, some data was read */
|
||
|
}
|
||
|
else
|
||
|
return (-1); /* error */
|
||
|
}
|
||
|
|
||
|
*ptr = 0;
|
||
|
return (n);
|
||
|
}
|