示例#1
0
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;
}
示例#2
0
文件: env.c 项目: ksherlock/gno
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;
}