chstack.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /* chstack - set stack size */
  2. #include <stdio.h>
  3. #define OFF 48L /* offset of stacksize in file */
  4. #define MAX 32768L /* maximum accepted stacksize */
  5. main(argc, argv)
  6. int argc;
  7. char *argv[];
  8. {
  9. char *p;
  10. long n;
  11. int fd;
  12. long current;
  13. long old;
  14. long atol(), lseek();
  15. p = argv[1];
  16. if (argc != 3 || (*p != '=' && *p != '+' && *p != '-')) {
  17. fprintf(stderr, "Usage: %s {=+-}amount file\n", argv[0]);
  18. exit(1);
  19. }
  20. n = atol(p+1);
  21. fd = open(argv[2], 2);
  22. if (fd < 0) {
  23. fprintf(stderr, "%s: cannot open %s\n", argv[0], argv[2]);
  24. exit(1);
  25. }
  26. if (lseek(fd, OFF, 0) < 0 || getlong(fd, &current) < 0) {
  27. fprintf(stderr, "%s: cannot read %s\n", argv[0], argv[2]);
  28. exit(1);
  29. }
  30. old = current;
  31. if (*p == '=') current = n;
  32. else if (*p == '-') current -= n;
  33. else current += n;
  34. if (current > MAX || current <= 0) {
  35. fprintf(stderr, "%s: resulting stack size %ld too large or too small\n", argv[0], current);
  36. exit(1);
  37. }
  38. if (lseek(fd, OFF, 0) < 0 || putlong(fd, &current) < 0) {
  39. fprintf(stderr, "%s: can't modify %s\n", argv[0], argv[2]);
  40. exit(1);
  41. }
  42. printf("%s: Stack area changed from %ld to %ld bytes.\n",
  43. argv[2], old, current);
  44. exit(0);
  45. }
  46. getlong(fd, l)
  47. long *l;
  48. {
  49. char buf[4];
  50. if (read(fd, buf, 4) < 4) return -1;
  51. *l = ((((long)(buf[3]&0377)<<8)|(long)(buf[2]&0377)<<8)|(long)(buf[1]&0377)<<8)|(long)(buf[0]&0377);
  52. return 0;
  53. }
  54. putlong(fd, l)
  55. long *l;
  56. {
  57. char buf[4];
  58. buf[3] = *l >> 24;
  59. buf[2] = *l >> 16;
  60. buf[1] = *l >> 8;
  61. buf[0] = *l;
  62. if (write(fd, buf, 4) < 4) return -1;
  63. return 0;
  64. }