readxs.c
上传用户:lampled
上传日期:2007-01-07
资源大小:94k
文件大小:2k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /* Copyright (C) 1995, 1996 by Sven Berkvens (sven@stack.nl) */
  2. #include "config.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <sys/stat.h>
  7. #include <errno.h>
  8. #include <fcntl.h>
  9. #include <signal.h>
  10. #ifdef HAVE_ERR_H
  11. #include <err.h>
  12. #else /* Not HAVE_ERR_H */
  13. #include "err.h"
  14. #endif /* HAVE_ERR_H */
  15. #include <pwd.h>
  16. #include "xscounter.h"
  17. #include "getopt.h"
  18. #include "string.h"
  19. #define MODE_TODAY 0
  20. #define MODE_MONTH 1
  21. #define MODE_TOTAL 2
  22. extern int
  23. main DECL2(int, argc, char **, argv)
  24. {
  25. int x, y, z, comp, total, fd, mode = MODE_TOTAL,
  26. option;
  27. char counterfile[XS_PATH_MAX], url[BUFSIZ];
  28. countstr counter;
  29. while ((option = getopt(argc, argv, "dmt")) != EOF)
  30. {
  31. switch(option)
  32. {
  33. case 'd':
  34. mode = MODE_TODAY;
  35. break;
  36. case 'm':
  37. mode = MODE_MONTH;
  38. break;
  39. case 't':
  40. mode = MODE_TOTAL;
  41. break;
  42. default:
  43. errx(1, "Usage: %s -[d|m|t] URL", argv[0]);
  44. }
  45. }
  46. if (argc != (optind + 1))
  47. errx(1, "URL missing or too many arguments");
  48. strcpy(url, argv[optind]);
  49. sprintf(counterfile, "%s/%s", HTTPD_ROOT, CNT_DATA);
  50. if ((fd = open(counterfile, O_RDONLY, 0)) < 0)
  51. err(1, "Could not open(%s)", counterfile);
  52. if ((total = lseek(fd, 0, SEEK_END)) == -1)
  53. err(1, "Could not lseek()");
  54. total /= sizeof(countstr);
  55. if (total < 2)
  56. errx(1, "Counter file is corrupt");
  57. x = 0; z = total-1; y = z/2; comp = 1;
  58. while ((x < (z-1)) && (comp))
  59. {
  60. y = (x + z) / 2;
  61. if (lseek(fd, y * sizeof(countstr), SEEK_SET) == -1)
  62. err(1, "lseek()");
  63. if (read(fd, &counter, sizeof(countstr)) != sizeof(countstr))
  64. err(1, "read()");
  65. if ((comp = strcmp(url, counter.filename)) < 0)
  66. z = y;
  67. else
  68. x = y;
  69. }
  70. if (comp)
  71. errx(1, "This URL has no counter");
  72. switch(mode)
  73. {
  74. case MODE_TOTAL:
  75. printf("%dn", counter.total);
  76. break;
  77. case MODE_TODAY:
  78. printf("%dn", counter.today);
  79. break;
  80. case MODE_MONTH:
  81. printf("%dn", counter.month);
  82. break;
  83. }
  84. fflush(stdout);
  85. close(fd);
  86. return(0);
  87. }