int chdir (const char *pathname) { PrefixRecGS record; struct stat statbuf; int result; errno = 0; if (stat(pathname,&statbuf) == -1) return -1; /* verify that it's a directory */ if (!(statbuf.st_mode & S_IFDIR)) { errno = ENOTDIR; return -1; } /* change directory */ record.pCount = 2; record.prefixNum = 0; /* prefix 0 is the current directory */ record.buffer.setPrefix = __C2GSMALLOC(pathname); if (record.buffer.setPrefix == (GSString255Ptr) NULL) { errno = ENOMEM; return -1; } SetPrefixGS(&record); /* verify success, clean up, and return */ result = toolerror(); free(record.buffer.setPrefix); if (result) { errno = EINVAL; return -1; } return 0; }
int set_prefix(const char *cp) { /* union of ResultBuf255Ptr / GSString255Ptr */ static PrefixRecGS dcb = { 2, 0, (ResultBuf255Ptr)&value.bufString }; int pfx = -1; unsigned l; char *ptr = cp; if (_v) fprintf(stderr, "#env setprefix:\t%s\n", cp); if (isdigit(*cp)) pfx = strtol(cp, &ptr, 10); if (pfx < 0 || pfx > 31 || *ptr != '=' ) errx(1, "setprefix %s: invalid argument", cp); ++ptr; /* = */ l = strlen(ptr); if (l == 0 || l > 255) { errx(1, "setprefix %s: Invalid argument", cp); } /* in SetPrefixGS, relative paths are relative to the prefix being set, not prefix 0 to counteract this, make it relative to prefix 0 */ if (pfx && relative(ptr)) { if (l > 253) errx(1, "setprefix %s: Invalid argument", cp); value.bufString.length = l + 2; value.bufString.text[0] = '0'; value.bufString.text[1] = ':'; memcpy(value.bufString.text + 2 , ptr, l); } else { value.bufString.length = l; memcpy(value.bufString.text, ptr, l); } dcb.prefixNum = pfx; SetPrefixGS(&dcb); if (_toolErr) { errx(1, "SetPrefixGS %s: $%04x", cp, _toolErr); } return 1; }