9iounit.c 981 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "lib.h"
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <fmt.h>
  5. #include "sys9.h"
  6. #include "dir.h"
  7. /*
  8. * Format:
  9. 3 r M 4 (0000000000457def 11 00) 8192 512 /rc/lib/rcmain
  10. */
  11. static int
  12. getfields(char *str, char **args, int max, int mflag)
  13. {
  14. char r;
  15. int nr, intok, narg;
  16. if(max <= 0)
  17. return 0;
  18. narg = 0;
  19. args[narg] = str;
  20. if(!mflag)
  21. narg++;
  22. intok = 0;
  23. for(;;) {
  24. r = *str++;
  25. if(r == 0)
  26. break;
  27. if(r == ' ' || r == '\t'){
  28. if(narg >= max)
  29. break;
  30. *str = 0;
  31. intok = 0;
  32. args[narg] = str + nr;
  33. if(!mflag)
  34. narg++;
  35. } else {
  36. if(!intok && mflag)
  37. narg++;
  38. intok = 1;
  39. }
  40. }
  41. return narg;
  42. }
  43. int
  44. _IOUNIT(int fd)
  45. {
  46. int i, cfd;
  47. char buf[128], *args[10];
  48. snprint(buf, sizeof buf, "#d/%dctl", fd);
  49. cfd = _OPEN(buf, OREAD);
  50. if(cfd < 0)
  51. return 0;
  52. i = _READ(cfd, buf, sizeof buf-1);
  53. _CLOSE(cfd);
  54. if(i <= 0)
  55. return 0;
  56. buf[i] = '\0';
  57. if(getfields(buf, args, 10, 1) != 10)
  58. return 0;
  59. return atoi(args[7]);
  60. }