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