devlfd.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "u.h"
  2. #include <errno.h>
  3. #include "lib.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. #include "error.h"
  7. #undef pread
  8. #undef pwrite
  9. Chan*
  10. lfdchan(int fd)
  11. {
  12. Chan *c;
  13. c = newchan();
  14. c->type = devno('L', 0);
  15. c->aux = (void*)(uintptr)fd;
  16. c->name = newcname("fd");
  17. c->mode = ORDWR;
  18. c->qid.type = 0;
  19. c->qid.path = 0;
  20. c->qid.vers = 0;
  21. c->dev = 0;
  22. c->offset = 0;
  23. return c;
  24. }
  25. int
  26. lfdfd(int fd)
  27. {
  28. return newfd(lfdchan(fd));
  29. }
  30. static Chan*
  31. lfdattach(char *x)
  32. {
  33. USED(x);
  34. error(Egreg);
  35. return nil;
  36. }
  37. static Walkqid*
  38. lfdwalk(Chan *c, Chan *nc, char **name, int nname)
  39. {
  40. USED(c);
  41. USED(nc);
  42. USED(name);
  43. USED(nname);
  44. error(Egreg);
  45. return nil;
  46. }
  47. static int
  48. lfdstat(Chan *c, uchar *dp, int n)
  49. {
  50. USED(c);
  51. USED(dp);
  52. USED(n);
  53. error(Egreg);
  54. return -1;
  55. }
  56. static Chan*
  57. lfdopen(Chan *c, int omode)
  58. {
  59. USED(c);
  60. USED(omode);
  61. error(Egreg);
  62. return nil;
  63. }
  64. static void
  65. lfdclose(Chan *c)
  66. {
  67. close((int)(uintptr)c->aux);
  68. }
  69. static long
  70. lfdread(Chan *c, void *buf, long n, vlong off)
  71. {
  72. USED(off); /* can't pread on pipes */
  73. n = read((int)(uintptr)c->aux, buf, n);
  74. if(n < 0){
  75. iprint("error %d\n", errno);
  76. oserror();
  77. }
  78. return n;
  79. }
  80. static long
  81. lfdwrite(Chan *c, void *buf, long n, vlong off)
  82. {
  83. USED(off); /* can't pread on pipes */
  84. n = write((int)(uintptr)c->aux, buf, n);
  85. if(n < 0){
  86. iprint("error %d\n", errno);
  87. oserror();
  88. }
  89. return n;
  90. }
  91. Dev lfddevtab = {
  92. 'L',
  93. "lfd",
  94. devreset,
  95. devinit,
  96. devshutdown,
  97. lfdattach,
  98. lfdwalk,
  99. lfdstat,
  100. lfdopen,
  101. devcreate,
  102. lfdclose,
  103. lfdread,
  104. devbread,
  105. lfdwrite,
  106. devbwrite,
  107. devremove,
  108. devwstat,
  109. };