This is lib.c in view mode; [Download] [Up]
#define I_IOCTL
#define I_ERRNO
#include "includes.h"
#include "debug.h"
int term_errno = 0;
/*-----------------------------------------------------------------------*/
void set_nonblock(int fd) {
#ifdef USE_FCNTL
#ifdef USE_NONBLOCK
if (!(fcntl (fd, F_GETFL) & O_NONBLOCK)) {
fcntl (fd, F_SETFL, (fcntl(fd, F_GETFL) | O_NONBLOCK));
}
#else
if (!(fcntl (fd, F_GETFL) & FNDELAY)) {
fcntl (fd, F_SETFL, (fcntl(fd, F_GETFL) | FNDELAY));
}
#endif
#else
int one = 1;
ioctl( fd, FIONBIO, &one);
#endif
}
void set_block(int fd) {
#ifdef USE_FCNTL
#ifdef USE_NONBLOCK
fcntl (fd, F_SETFL, (fcntl(fd, F_GETFL) & ~O_NONBLOCK));
#else
fcntl (fd, F_SETFL, (fcntl(fd, F_GETFL) & ~FNDELAY));
#endif
#else
int zero = 0;
ioctl(fd, FIONBIO, &zero);
#endif
}
/*------------------------------------------------------------------------*/
/* Do a partial read into the buffer. */
int do_read_into_buff(int fd, struct Buffer *b, int size) {
int r = 0, t;
if (!size || size > BUFFER_SIZE - 1 - b->size)
size = BUFFER_SIZE - 1 - b->size;
term_errno = 0;
t = BUFFER_SIZE - b->start;
if (t > size) t = size;
r = read(fd, b->data + b->start, t);
DEBUG_LL(stderr, "%s: d_r_i_b: read1 from %d (%d) did %d\n",
term_server, fd, t, r);
if (r <= 0) {
if (!r) term_errno = 1;
else
#ifndef SVR4
if (errno != ERR_BLOCK)
#endif /* SVR4 */
term_errno = errno + 1;
return r;
}
b->start += r;
b->size += r;
SANITY(b->start <= BUFFER_SIZE);
if (b->start == BUFFER_SIZE)
b->start = 0;
size -= r;
if (!size || b->start != 0) return r;
t = BUFFER_SIZE - b->start;
if (t > size) t = size;
t = read(fd, b->data + b->start, t);
DEBUG_LL(stderr, "%s: d_r_i_b: read2 from %d (%d) did %d\n",
term_server, fd, t, t);
if (t <= 0) {
if (!t) term_errno = 1;
else if(errno != ERR_BLOCK)
term_errno = errno+1;
return r;
}
b->start += t;
b->size += t;
if (b->start == BUFFER_SIZE)
b->start = 0;
size -= t;
r += t;
return r;
}
/* Read from a file-descriptor into a ring buffer. Read atmost size bytes */
int read_into_buff(int fd, struct Buffer *b, int size) {
int ret, l = 0;
if (!size) size = BUFFER_SIZE - 1 - b->size;
do {
ret = do_read_into_buff(fd, b, size);
if (ret < 1) break;
l += ret;
size -= ret;
} while (!term_errno && size);
if (!l) return ret;
return l;
}
/*------------------------------------------------------------------------*/
/* Write from ring buffer to file descriptor. Write at most size bytes */
int write_from_buff(int fd, struct Buffer *b, int size) {
int r = 0, t;
if (!size) size = b->size;
t = BUFFER_SIZE - b->end;
if (t > size) t = size;
r = write(fd, b->data + b->end, t);
DEBUG_LL(stderr, "%s: d_w_f_b: write1 from %d (%d) did %d\n",
term_server, fd, t, r);
if (r <= 0) {
if (!r) term_errno = 1;
else if (errno != ERR_BLOCK)
term_errno = errno+1;
return r;
}
b->end += r;
b->size -= r;
SANITY(b->end <= BUFFER_SIZE);
if (b->end >= BUFFER_SIZE)
b->end -= BUFFER_SIZE;
size -= r;
if (!size || b->end != 0)
return r;
t = BUFFER_SIZE - b->end;
if (t > size) t = size;
t = write(fd, b->data + b->end, t);
DEBUG_LL(stderr, "%s: d_w_f_b: write2 from %d (%d) did %d\n",
term_server, fd, t, r);
if (t <= 0) {
if (!t) term_errno = 1;
else if (errno != ERR_BLOCK)
term_errno = errno+1;
return r;
}
b->end += t;
b->size -= t;
SANITY(b->end <= BUFFER_SIZE);
if (b->end >= BUFFER_SIZE)
b->end -= BUFFER_SIZE;
r += t;
return r;
}
/* Should check for overflow here.. */
int add_to_buffer(struct Buffer *b, un_char c) {
b->data[b->start++] = c;
b->size++;
/*
if (b->size >= BUFFER_SIZE - 2)
fprintf (stderr, "add_to_buffer() buffer overflow %d\n", b->size);
*/
if (b->start >= BUFFER_SIZE)
b->start -= BUFFER_SIZE;
return 1;
}
int get_from_buffer(struct Buffer *b) {
un_char c;
if (b->size < 1)
return -1;
c = b->data[b->end++];
--b->size;
if (b->end == BUFFER_SIZE)
b->end = 0;
return c&255;
}
/*-----------------------------------------------------------------------*/
#ifdef sun
char *strerror(int errno) {
extern char *sys_errlist[];
return sys_errlist[errno];
}
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.