mkfuzz.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <arpa/inet.h>
  2. #include <unistd.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. enum tftp_opcode {
  8. RRQ = 1,
  9. WRQ = 2,
  10. DATA = 3,
  11. ACK = 4,
  12. ERR = 5,
  13. OACK = 6
  14. };
  15. static inline char *pkt_mknum(char *pkt, uint16_t n)
  16. {
  17. *(uint16_t*)pkt = htons(n);
  18. return pkt + 2;
  19. }
  20. static char *pkt_mkopt(char *pkt, const char *opt, const char* val)
  21. {
  22. strcpy(pkt, opt);
  23. pkt += strlen(opt) + 1;
  24. strcpy(pkt, val);
  25. pkt += strlen(val) + 1;
  26. return pkt;
  27. }
  28. int main(int argc, char** argv)
  29. {
  30. if (argc != 2) {
  31. return 1;
  32. }
  33. const size_t fsize = 4096;
  34. char pkt[1024 + 4];
  35. char* p;
  36. size_t len = 512;
  37. memset(pkt, 0, sizeof(pkt));
  38. if (argc == 2 && argv[1][0] == 'k') {
  39. len = 1024;
  40. p = pkt_mknum(pkt, OACK);
  41. pkt_mkopt(p, "blksize", "1024");
  42. } else {
  43. p = pkt_mknum(pkt, ACK);
  44. pkt_mknum(p, 0);
  45. }
  46. write(STDOUT_FILENO, pkt, len + 4);
  47. size_t i = 0;
  48. for (; i < (fsize/len + 1); ++i) {
  49. memset(pkt, 0, sizeof(pkt));
  50. p = pkt_mknum(pkt, ACK);
  51. pkt_mknum(p, i + 1);
  52. write(STDOUT_FILENO, pkt, len + 4);
  53. }
  54. }