static vfs68_t * fd_create(const char * uri, int mode, int argc , va_list list) { int fd = -1; if (!strncmp68(uri,"fd:", 3)) fd = strtoul(uri+3, 0, 10); else if (!strncmp68(uri,"file://", 7)) uri += 7; else if (!strncmp68(uri,"local://", 8)) uri += 8; else if (!strncmp68(uri,"stdin:", 6)) return (mode & 3) == 1 ? create(0, 0, mode) : 0 ; else if (!strncmp68(uri,"stdout:", 7)) return (mode & 3) == 2 ? create(0, 1, mode) : 0 ; else if (!strncmp68(uri,"stderr:", 7)) return (mode & 3) == 2 ? create(0, 2, mode) : 0 ; if (fd == -1 && argc == 1) { fd = va_arg(list,int); uri = 0; }
static int fd_ismine(const char * uri) { int i = uri68_get_scheme(0, 0, uri); if (!i) return SCHEME68_ISMINE|SCHEME68_READ|SCHEME68_WRITE; else if (i > 0) { #ifdef NATIVE_WIN32 if (i == 2 && isalpha((int)uri[0])) return SCHEME68_ISMINE|SCHEME68_READ|SCHEME68_WRITE; #endif for (i = 0; i < sizeof(myshemes)/sizeof(*myshemes); ++i) if (!strncmp68(uri, myshemes[i].name, myshemes[i].len)) return myshemes[i].mode; } return 0; }
static vfs68_t * create(const char * fname, int fd, int mode) { vfs68_fd_t *isf; int len; if (fname && !strncmp68(fname,"fd:",3) && isdigit((int)fname[3])) { fd = strtoul(fname+3, 0, 10); fname = 0; } if (fname) len = strlen(fname); else if (fd >= 0) len = 40; else return 0; /* Don't need 0, because 1 byte already allocated in the * vfs68_fd_t::fname. */ isf = malloc(sizeof(vfs68_fd_t) + len); if (!isf) return 0; /* Copy vfs functions. */ memcpy(&isf->vfs, &vfs68_fd, sizeof(vfs68_fd)); /* Clean init. */ isf->fd = -1; isf->org_fd = fd; isf->mode = mode & (VFS68_OPEN_READ|VFS68_OPEN_WRITE); if (!fname) sprintf(isf->name, "fd:%u", fd); else /* Copy filename. */ /* $$$ May be later, we should add a check for relative path and add * CWD ... or make it URL compatible */ strcpy(isf->name, fname); return &isf->vfs; }
static int rsc68_ismine(const char * uri) { if (!strncmp68(uri, "sc68://", 7)) return SCHEME68_ISMINE | SCHEME68_READ | SCHEME68_WRITE; return 0; }