ssize_t kwrite(const void *buf, size_t size, struct file_desc *file) { ssize_t ret; if (!file) { DPRINTF(("EBADF ")); ret = -EBADF; goto end; } if (!idesc_check_mode(&file->idesc, FS_MAY_WRITE)) { DPRINTF(("EBADF ")); ret = -EBADF; goto end; } if (NULL == file->ops->write) { DPRINTF(("EBADF ")); ret = -EBADF; goto end; } if (file->file_flags & O_APPEND) { kseek(file, 0, SEEK_END); } ret = file->ops->write(file, (void *)buf, size); end: DPRINTF(("write(%s, ...) = %d\n", file->node->name, ret)); return ret; }
ssize_t kwrite(const void *buf, size_t size, struct file_desc *file) { ssize_t ret; if (!file) { ret = -EBADF; goto end; } if (!idesc_check_mode(&file->idesc, FS_MAY_WRITE)) { ret = -EBADF; goto end; } if (NULL == file->ops->write) { ret = -EBADF; goto end; } if (file->file_flags & O_APPEND) { kseek(file, 0, SEEK_END); } ret = file->ops->write(file, (void *)buf, size); end: return ret; }
static int csdial(DS *ds) { int n, fd, rv; char *p, buf[Maxstring], clone[Maxpath], err[ERRMAX], besterr[ERRMAX]; /* * open connection server */ snprint(buf, sizeof(buf), "%s/cs", ds->netdir); fd = kopen(buf, ORDWR); if(fd < 0){ /* no connection server, don't translate */ snprint(clone, sizeof(clone), "%s/%s/clone", ds->netdir, ds->proto); return call(clone, ds->rem, ds); } /* * ask connection server to translate */ sprint(buf, "%s!%s", ds->proto, ds->rem); if(kwrite(fd, buf, strlen(buf)) < 0){ kerrstr(err, sizeof err); kclose(fd); kwerrstr("%s (%s)", err, buf); return -1; } /* * loop through each address from the connection server till * we get one that works. */ *besterr = 0; strcpy(err, Egreg); rv = -1; kseek(fd, 0, 0); while((n = kread(fd, buf, sizeof(buf) - 1)) > 0){ buf[n] = 0; p = strchr(buf, ' '); if(p == 0) continue; *p++ = 0; rv = call(buf, p, ds); if(rv >= 0) break; err[0] = 0; kerrstr(err, sizeof err); if(strstr(err, "does not exist") == 0) memmove(besterr, err, sizeof besterr); } kclose(fd); if(rv < 0 && *besterr) kerrstr(besterr, sizeof besterr); else kerrstr(err, sizeof err); return rv; }
ft_ansi_stream_io( FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count ) { int fd; fd = STREAM_FD( stream ); kseek( fd, offset, SEEK_SET ); if(count == 0) return 0; return (unsigned long)kread( fd, buffer, count); }
/* * call up the connection server and get a translation */ static int nettrans(char *addr, char *naddr, int na, char *file, int nf) { int i, fd; char buf[Maxpath]; char netdir[NETPATHLEN]; char *p, *p2; long n; /* * parse, get network directory */ p = strchr(addr, '!'); if(p == 0){ kwerrstr("bad dial string: %s", addr); return -1; } if(*addr != '/'){ strcpy(netdir, "/net"); } else { for(p2 = p; *p2 != '/'; p2--) ; i = p2 - addr; if(i == 0 || i >= sizeof(netdir)){ kwerrstr("bad dial string: %s", addr); return -1; } strncpy(netdir, addr, i); netdir[i] = 0; addr = p2 + 1; } /* * ask the connection server */ sprint(buf, "%s/cs", netdir); fd = kopen(buf, ORDWR); if(fd < 0) return identtrans(netdir, addr, naddr, na, file, nf); if(kwrite(fd, addr, strlen(addr)) < 0){ kclose(fd); return -1; } kseek(fd, 0, 0); n = kread(fd, buf, sizeof(buf)-1); kclose(fd); if(n <= 0) return -1; buf[n] = 0; /* * parse the reply */ p = strchr(buf, ' '); if(p == 0) return -1; *p++ = 0; strncpy(naddr, p, na); naddr[na-1] = 0; strncpy(file, buf, nf); file[nf-1] = 0; return 0; }
static vlong seekfd(void *a, vlong off, int t) { return kseek(((Fd*)a)->fd, off, t); }