/***************************************************** a wrapper for pwrite() *******************************************************/ ssize_t smbw_pwrite(int fd, void *buf, size_t count, off_t ofs) { struct smbw_file *file; int ret; smbw_busy++; file = smbw_file(fd); if (!file) { errno = EBADF; smbw_busy--; return -1; } ret = cli_write(&file->srv->cli, file->f->cli_fd, 0, buf, ofs, count); if (ret == -1) { errno = smbw_errno(&file->srv->cli); smbw_busy--; return -1; } smbw_busy--; return ret; }
/***************************************************** a wrapper for read() *******************************************************/ ssize_t smbw_read(int fd, void *buf, size_t count) { struct smbw_file *file; int ret; DEBUG(4,("smbw_read(%d, %d)\n", fd, (int)count)); smbw_busy++; file = smbw_file(fd); if (!file) { errno = EBADF; smbw_busy--; return -1; } ret = cli_read(&file->srv->cli, file->f->cli_fd, buf, file->f->offset, count); if (ret == -1) { errno = smbw_errno(&file->srv->cli); smbw_busy--; return -1; } file->f->offset += ret; DEBUG(4,(" -> %d\n", ret)); smbw_busy--; return ret; }
/***************************************************** a wrapper for dup() *******************************************************/ int smbw_dup(int fd) { int fd2; struct smbw_file *file, *file2; smbw_busy++; file = smbw_file(fd); if (!file) { errno = EBADF; goto failed; } fd2 = dup(file->fd); if (fd2 == -1) { goto failed; } if (bitmap_query(smbw_file_bmap, fd2)) { DEBUG(0,("ERROR: fd already open in dup!\n")); errno = EIO; goto failed; } file2 = (struct smbw_file *)malloc(sizeof(*file2)); if (!file2) { close(fd2); errno = ENOMEM; goto failed; } ZERO_STRUCTP(file2); *file2 = *file; file2->fd = fd2; file->f->ref_count++; bitmap_set(smbw_file_bmap, fd2); DLIST_ADD(smbw_files, file2); smbw_busy--; return fd2; failed: smbw_busy--; return -1; }
/***************************************************** a wrapper for fstat() *******************************************************/ int smbw_fstat(int fd, struct stat *st) { struct smbw_file *file; time_t c_time, a_time, m_time; size_t size; uint16 mode; SMB_INO_T ino = 0; smbw_busy++; ZERO_STRUCTP(st); file = smbw_file(fd); if (!file) { int ret = smbw_dir_fstat(fd, st); smbw_busy--; return ret; } if (!cli_qfileinfo(&file->srv->cli, file->f->cli_fd, &mode, &size, &c_time, &a_time, &m_time, NULL, &ino) && !cli_getattrE(&file->srv->cli, file->f->cli_fd, &mode, &size, &c_time, &a_time, &m_time)) { errno = EINVAL; smbw_busy--; return -1; } st->st_ino = ino; smbw_setup_stat(st, file->f->fname, size, mode); st->st_atime = a_time; st->st_ctime = c_time; st->st_mtime = m_time; st->st_dev = file->srv->dev; smbw_busy--; return 0; }
/***************************************************** a wrapper for close() *******************************************************/ int smbw_close(int fd) { struct smbw_file *file; smbw_busy++; file = smbw_file(fd); if (!file) { int ret = smbw_dir_close(fd); smbw_busy--; return ret; } if (file->f->ref_count == 1 && !cli_close(&file->srv->cli, file->f->cli_fd)) { errno = smbw_errno(&file->srv->cli); smbw_busy--; return -1; } bitmap_clear(smbw_file_bmap, file->fd); close(file->fd); DLIST_REMOVE(smbw_files, file); file->f->ref_count--; if (file->f->ref_count == 0) { SAFE_FREE(file->f->fname); SAFE_FREE(file->f); } ZERO_STRUCTP(file); SAFE_FREE(file); smbw_busy--; return 0; }
/***************************************************** a wrapper for lseek() *******************************************************/ off_t smbw_lseek(int fd, off_t offset, int whence) { struct smbw_file *file; size_t size; smbw_busy++; file = smbw_file(fd); if (!file) { off_t ret = smbw_dir_lseek(fd, offset, whence); smbw_busy--; return ret; } switch (whence) { case SEEK_SET: file->f->offset = offset; break; case SEEK_CUR: file->f->offset += offset; break; case SEEK_END: if (!cli_qfileinfo(&file->srv->cli, file->f->cli_fd, NULL, &size, NULL, NULL, NULL, NULL, NULL) && !cli_getattrE(&file->srv->cli, file->f->cli_fd, NULL, &size, NULL, NULL, NULL)) { errno = EINVAL; smbw_busy--; return -1; } file->f->offset = size + offset; break; } smbw_busy--; return file->f->offset; }