common.c
上传用户:bilang918
上传日期:2010-03-24
资源大小:558k
文件大小:1k
源码类别:

网络

开发平台:

Unix_Linux

  1. #include <sys/types.h>
  2. #include <errno.h>
  3. //code from UNIX Network Programming by W.Richard Stevens
  4. ssize_t readn(int fd, void *vptr, size_t n)
  5. {
  6. ssize_t nleft, nread;
  7. char *ptr;
  8. ptr = vptr;
  9. nleft = n;
  10. while(nleft > 0){
  11. if( (nread = read(fd, ptr, nleft)) < 0 ){
  12. if(errno == EINTR) nread = 0;
  13. else return -1;
  14. } else if(nread == 0)
  15. break; //EOF
  16. nleft -= nread;
  17. ptr += nread;
  18. }
  19. return (n - nleft);
  20. }
  21. ssize_t writen(int fd, void *vptr, size_t n)
  22. {
  23. size_t nleft, nwritten;
  24. char *ptr;
  25. ptr = vptr;
  26. nleft = n;
  27. while(nleft > 0){
  28. if( (nwritten = write(fd, ptr, nleft)) <=0 ){
  29. if(errno == EINTR) nwritten = 0;
  30. else return -1; //error
  31. }
  32. nleft -= nwritten;
  33. ptr += nwritten;
  34. }
  35. return n;
  36. }
  37. ssize_t readline(int fd, void *vptr, size_t maxlen)
  38. {
  39. ssize_t n, rc;
  40. char c, *ptr;
  41. ptr = vptr;
  42. for(n = 1; n < maxlen; n++){
  43. again:
  44. if( (rc = read(fd, &c, 1)) == 1){
  45. *ptr++ = c;
  46. if(c == 'n') break; //readover
  47. } else if(rc == 0){
  48. if(n == 1) return 0; //EOF no data read
  49. else break; //EOF some data read
  50. } else {
  51. if(errno == EINTR) goto again;
  52. return -1; //error
  53. }
  54. }
  55. *ptr = 0;
  56. return n;
  57. }