Exemplo n.º 1
0
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;
  }
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
static int rsc68_ismine(const char * uri)
{
  if (!strncmp68(uri, "sc68://", 7))
    return SCHEME68_ISMINE | SCHEME68_READ | SCHEME68_WRITE;
  return 0;
}