75 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* chstack - set stack size */
 | |
| 
 | |
| #include <stdio.h>
 | |
| 
 | |
| #define OFF         48L		/* offset of stacksize in file */
 | |
| #define MAX	    32768L	/* maximum accepted stacksize */
 | |
| 
 | |
| main(argc, argv)
 | |
| int argc;
 | |
| char *argv[];
 | |
| {
 | |
|   char *p;
 | |
|   long n;
 | |
|   int fd;
 | |
|   long current;
 | |
|   long old;
 | |
|   long atol(), lseek();
 | |
| 
 | |
|   p = argv[1];
 | |
|   if (argc != 3 || (*p != '=' && *p != '+' && *p != '-')) {
 | |
|   	fprintf(stderr, "Usage: %s {=+-}amount file\n", argv[0]);
 | |
| 	exit(1);
 | |
|   }
 | |
|   n = atol(p+1);
 | |
| 
 | |
|   fd = open(argv[2], 2);
 | |
|   if (fd < 0) {
 | |
| 	fprintf(stderr, "%s: cannot open %s\n", argv[0], argv[2]);
 | |
| 	exit(1);
 | |
|   }
 | |
| 
 | |
|   if (lseek(fd, OFF, 0) < 0 || getlong(fd, ¤t) < 0) {
 | |
| 	fprintf(stderr, "%s: cannot read %s\n", argv[0], argv[2]);
 | |
| 	exit(1);
 | |
|   }
 | |
|   old = current;
 | |
|   if (*p == '=') current = n;
 | |
|   else if (*p == '-') current -= n;
 | |
|   else current += n;
 | |
| 
 | |
|   if (current > MAX || current <= 0) {
 | |
| 	fprintf(stderr, "%s: resulting stack size %ld too large or too small\n", argv[0], current);
 | |
| 	exit(1);
 | |
|   }
 | |
|   if (lseek(fd, OFF, 0) < 0 || putlong(fd, ¤t) < 0) {
 | |
| 	fprintf(stderr, "%s: can't modify %s\n", argv[0], argv[2]);
 | |
| 	exit(1);
 | |
|   }
 | |
|   printf("%s: Stack area changed from %ld to %ld bytes.\n",
 | |
| 			 argv[2],  old, current);
 | |
|   exit(0);
 | |
| }
 | |
| 
 | |
| getlong(fd, l)
 | |
| 	long *l;
 | |
| {
 | |
| 	char buf[4];
 | |
| 
 | |
| 	if (read(fd, buf, 4) < 4) return -1;
 | |
| 	*l = ((((long)(buf[3]&0377)<<8)|(long)(buf[2]&0377)<<8)|(long)(buf[1]&0377)<<8)|(long)(buf[0]&0377);
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| putlong(fd, l)
 | |
| 	long *l;
 | |
| {
 | |
| 	char buf[4];
 | |
| 
 | |
| 	buf[3] = *l >> 24;
 | |
| 	buf[2] = *l >> 16;
 | |
| 	buf[1] = *l >> 8;
 | |
| 	buf[0] = *l;
 | |
| 	if (write(fd, buf, 4) < 4) return -1;
 | |
| 	return 0;
 | |
| }
 |