|
|
1.1 ! root 1: /* ! 2: * fd = ptopen (buf) ! 3: * ! 4: * Attempt to open an odd pt - if successful, return the ! 5: * file descriptor in fd and place the name of the corresponding ! 6: * even pt in buf. Buf must be large enough. ! 7: * ! 8: * We assume that the digits 0-9 are consecutive in the ! 9: * machine's character set. ! 10: */ ! 11: ! 12: #include <errno.h> ! 13: ! 14: #define PTNAME "/dev/pt/pt01" ! 15: ! 16: extern int errno; ! 17: ! 18: int ! 19: ptopen (name) ! 20: char *name; ! 21: { ! 22: register int fd; ! 23: register char *p, *q; ! 24: ! 25: /* ! 26: * copy the initial name to user's buffer ! 27: * leave p pointing at the last character ! 28: */ ! 29: p = name; ! 30: q = PTNAME; ! 31: while ((*p++ = *q++) != '\0') ! 32: ; ! 33: p -= 2; ! 34: ! 35: /* try to open pt files until success or we run out */ ! 36: for (;;) { ! 37: fd = open (name, 2); ! 38: ! 39: /* check for success */ ! 40: if (fd >= 0) { ! 41: --*p; ! 42: return fd; ! 43: } ! 44: ! 45: /* check for run-out */ ! 46: if (errno != ENXIO) ! 47: return -1; ! 48: ! 49: /* this pt is busy, try the next */ ! 50: if (*p != '9') ! 51: *p += 2; ! 52: else { ! 53: /* propagate carry from low-order digit */ ! 54: *p = '1'; ! 55: q = p - 1; ! 56: while (*q == '9') ! 57: *q-- = '0'; ! 58: if (*q >= '0' && *q <= '9') ! 59: ++*q; ! 60: else { ! 61: /* insert a leading digit */ ! 62: register char *r = ++p; ! 63: while (r > q) { ! 64: r[1] = r[0]; ! 65: --r; ! 66: } ! 67: q[1] = '1'; ! 68: } ! 69: } ! 70: } ! 71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.