server.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <fcntl.h>
  7. #include <sys/mman.h>
  8. #include <sys/stat.h>
  9. #define DIR "/sys/bus/iio/devices/iio:device0/"
  10. const char *directory = "/media/mmcblk0p1/apps";
  11. const char *forbidden = "HTTP/1.0 403 Forbidden\n\n";
  12. const char *redirect = "HTTP/1.0 302 Found\nLocation: /\n\n";
  13. const char *okheader = "HTTP/1.0 200 OK\n\n";
  14. void detach(char *path)
  15. {
  16. int pid = fork();
  17. if(pid != 0) return;
  18. close(STDIN_FILENO);
  19. close(STDOUT_FILENO);
  20. close(STDERR_FILENO);
  21. execlp(path, path, NULL);
  22. exit(0);
  23. }
  24. float read_value(char *name)
  25. {
  26. FILE *fp;
  27. char buffer[64];
  28. if((fp = fopen(name, "r")) == NULL)
  29. {
  30. printf("Cannot open %s.\n", name);
  31. exit(1);
  32. }
  33. fgets(buffer, sizeof(buffer), fp);
  34. fclose(fp);
  35. return atof(buffer);
  36. }
  37. int main(int argc, char *argv[])
  38. {
  39. FILE *fp;
  40. int fd, id, i, j, top;
  41. float off, raw, scl;
  42. struct stat sb;
  43. size_t size;
  44. char buffer[256];
  45. char path[291];
  46. char *end;
  47. long freq;
  48. volatile int *slcr;
  49. if((fd = open("/dev/mem", O_RDWR)) < 0)
  50. {
  51. fwrite(forbidden, 24, 1, stdout);
  52. return 1;
  53. }
  54. slcr = mmap(NULL, sysconf(_SC_PAGESIZE), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0xF8000000);
  55. id = (slcr[332] >> 12) & 0x1f;
  56. freq = (argc == 2) ? strtol(argv[1], &end, 10) : -1;
  57. if(errno != 0 || end == argv[1] || freq < 0)
  58. {
  59. freq = 125;
  60. }
  61. if(fgets(buffer, 256, stdin) == NULL)
  62. {
  63. fwrite(forbidden, 24, 1, stdout);
  64. return 1;
  65. }
  66. if(buffer[4] != '/')
  67. {
  68. fwrite(forbidden, 24, 1, stdout);
  69. return 1;
  70. }
  71. if(strncmp(buffer, "GET ", 4) && strncmp(buffer, "get ", 4))
  72. {
  73. fwrite(forbidden, 24, 1, stdout);
  74. return 1;
  75. }
  76. top = 1;
  77. for(i = 5; i < 255; ++i)
  78. {
  79. if(buffer[i] == ' ')
  80. {
  81. buffer[i] = 0;
  82. break;
  83. }
  84. if(buffer[i] != '/') top = 0;
  85. }
  86. for(j = 5; j < i - 1; ++j)
  87. {
  88. if(buffer[j] == '.' && buffer[j + 1] == '.')
  89. {
  90. fwrite(forbidden, 24, 1, stdout);
  91. return 1;
  92. }
  93. }
  94. if(i == 10 && strncmp(buffer + 5, "temp0", 5) == 0)
  95. {
  96. fwrite(okheader, 17, 1, stdout);
  97. off = read_value(DIR "in_temp0_offset");
  98. raw = read_value(DIR "in_temp0_raw");
  99. scl = read_value(DIR "in_temp0_scale");
  100. printf("%.1f\n", (off + raw) * scl / 1000);
  101. return 0;
  102. }
  103. memcpy(path, directory, 21);
  104. memcpy(path + 21, buffer + 4, i - 3);
  105. if(stat(path, &sb) < 0)
  106. {
  107. fwrite(redirect, 32, 1, stdout);
  108. return 1;
  109. }
  110. if(S_ISDIR(sb.st_mode))
  111. {
  112. memcpy(path + 21 + i - 4, "/start.sh", 10);
  113. detach(path);
  114. if(top && id == 7 && freq == 122)
  115. {
  116. memcpy(path + 21 + i - 4, "/index_122_88.html", 19);
  117. }
  118. else
  119. {
  120. memcpy(path + 21 + i - 4, "/index.html", 12);
  121. }
  122. }
  123. fp = fopen(path, "r");
  124. if(fp == NULL)
  125. {
  126. fwrite(redirect, 32, 1, stdout);
  127. return 1;
  128. }
  129. fwrite(okheader, 17, 1, stdout);
  130. while((size = fread(buffer, 1, 256, fp)) > 0)
  131. {
  132. if(!fwrite(buffer, size, 1, stdout)) break;
  133. }
  134. return 0;
  135. }