Matthew Fioravante
2012-Oct-08 19:06 UTC
[PATCH vtpm v3 06/12] add select definition to sys/time.h when HAVE_LIBC is defined
This patch adds the select function to sys/time.h when HAVE_LIBC is defined, which is according to standard (see the select() manpage). It also removes a redudant lwip include from posix/sys/select.h. Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu> diff --git a/extras/mini-os/include/posix/sys/select.h b/extras/mini-os/include/posix/sys/select.h index a9337be..5132c51 100644 --- a/extras/mini-os/include/posix/sys/select.h +++ b/extras/mini-os/include/posix/sys/select.h @@ -2,7 +2,6 @@ #define _POSIX_SELECT_H #include <sys/time.h> -#include <lwip/sockets.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); #endif /* _POSIX_SELECT_H */ diff --git a/extras/mini-os/include/sys/time.h b/extras/mini-os/include/sys/time.h index d6623a4..3be3653 100644 --- a/extras/mini-os/include/sys/time.h +++ b/extras/mini-os/include/sys/time.h @@ -22,6 +22,7 @@ #ifdef HAVE_LIBC #include_next <sys/time.h> + #else struct timespec { time_t tv_sec; @@ -37,6 +38,10 @@ struct timeval { }; int gettimeofday(struct timeval *tv, void *tz); + +#endif +#ifdef HAVE_LIBC +#include <sys/select.h> #endif #endif /* _MINIOS_SYS_TIME_H_ */ -- 1.7.4.4
This patch adds posix io support (read,write,lseek) to block devices using blkfront. Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu> Acked-by: Samuel Thibault <samuel.thibault@ens-lyons.org> diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c index 74b8b26..f4283a9 100644 --- a/extras/mini-os/blkfront.c +++ b/extras/mini-os/blkfront.c @@ -392,6 +392,7 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write) static void blkfront_aio_cb(struct blkfront_aiocb *aiocbp, int ret) { aiocbp->data = (void*) 1; + aiocbp->aio_cb = NULL; } void blkfront_io(struct blkfront_aiocb *aiocbp, int write) @@ -547,9 +548,177 @@ moretodo: #ifdef HAVE_LIBC int blkfront_open(struct blkfront_dev *dev) { + /* Silently prevent multiple opens */ + if(dev->fd != -1) { + return dev->fd; + } dev->fd = alloc_fd(FTYPE_BLK); printk("blk_open(%s) -> %d\n", dev->nodename, dev->fd); files[dev->fd].blk.dev = dev; + files[dev->fd].blk.offset = 0; return dev->fd; } + +int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write) +{ + struct blkfront_dev* dev = files[fd].blk.dev; + off_t offset = files[fd].blk.offset; + struct blkfront_aiocb aiocb; + unsigned long long disksize = dev->info.sectors * dev->info.sector_size; + unsigned int blocksize = dev->info.sector_size; + + int blknum; + int blkoff; + size_t bytes; + int rc = 0; + int alignedbuf = 0; + uint8_t* copybuf = NULL; + + /* RW 0 bytes is just a NOP */ + if(count == 0) { + return 0; + } + /* Check for NULL buffer */ + if( buf == NULL ) { + errno = EFAULT; + return -1; + } + + /* Write mode checks */ + if(write) { + /*Make sure we have write permission */ + if(dev->info.info & VDISK_READONLY + || (dev->info.mode != O_RDWR && dev->info.mode != O_WRONLY)) { + errno = EACCES; + return -1; + } + /*Make sure disk is big enough for this write */ + if(offset + count > disksize) { + errno = ENOSPC; + return -1; + } + } + /* Read mode checks */ + else + { + /* Reading past the disk? Just return 0 */ + if(offset >= disksize) { + return 0; + } + + /*If the requested read is bigger than the disk, just + * read as much as we can until the end */ + if(offset + count > disksize) { + count = disksize - offset; + } + } + /* Determine which block to start at and at which offset inside of it */ + blknum = offset / blocksize; + blkoff = offset % blocksize; + + /* Optimization: We need to check if buf is aligned to the sector size. + * This is somewhat tricky code. We have to add the blocksize - block offset + * because the first block may be a partial block and then for every subsequent + * block rw the buffer will be offset.*/ + if(!((uintptr_t) (buf +(blocksize - blkoff)) & (dev->info.sector_size-1))) { + alignedbuf = 1; + } + + /* Setup aiocb block object */ + aiocb.aio_dev = dev; + aiocb.aio_offset = blknum * blocksize; + aiocb.aio_cb = NULL; + aiocb.data = NULL; + + /* If our buffer is unaligned or its aligned but we will need to rw a partial block + * then a copy will have to be done */ + if(!alignedbuf || blkoff != 0 || count % blocksize != 0) { + copybuf = _xmalloc(blocksize, dev->info.sector_size); + } + + rc = count; + while(count > 0) { + /* determine how many bytes to read/write from/to the current block buffer */ + if(!alignedbuf || blkoff != 0 || count < blocksize) { + /* This is the case for unaligned R/W or partial block */ + bytes = count < blocksize - blkoff ? count : blocksize - blkoff; + aiocb.aio_nbytes = blocksize; + } else { + /* We can optimize further if buffer is page aligned */ + int not_page_aligned = 0; + if(((uintptr_t)buf) & (PAGE_SIZE -1)) { + not_page_aligned = 1; + } + + /* For an aligned R/W we can read up to the maximum transfer size */ + bytes = count > (BLKIF_MAX_SEGMENTS_PER_REQUEST-not_page_aligned)*PAGE_SIZE + ? (BLKIF_MAX_SEGMENTS_PER_REQUEST-not_page_aligned)*PAGE_SIZE + : count & ~(blocksize -1); + aiocb.aio_nbytes = bytes; + } + + /* read operation */ + if(!write) { + if (alignedbuf && bytes >= blocksize) { + /* If aligned and were reading a whole block, just read right into buf */ + aiocb.aio_buf = buf; + blkfront_read(&aiocb); + } else { + /* If not then we have to do a copy */ + aiocb.aio_buf = copybuf; + blkfront_read(&aiocb); + memcpy(buf, ©buf[blkoff], bytes); + } + } + /* Write operation */ + else { + if(alignedbuf && bytes >= blocksize) { + /* If aligned and were writing a whole block, just write directly from buf */ + aiocb.aio_buf = buf; + blkfront_write(&aiocb); + } else { + /* If not then we have to do a copy. */ + aiocb.aio_buf = copybuf; + /* If we''re writing a partial block, we need to read the current contents first + * so we don''t overwrite the extra bits with garbage */ + if(blkoff != 0 || bytes < blocksize) { + blkfront_read(&aiocb); + } + memcpy(©buf[blkoff], buf, bytes); + blkfront_write(&aiocb); + } + } + /* Will start at beginning of all remaining blocks */ + blkoff = 0; + + /* Increment counters and continue */ + count -= bytes; + buf += bytes; + if(bytes < blocksize) { + //At minimum we read one block + aiocb.aio_offset += blocksize; + } else { + //If we read more than a block, was a multiple of blocksize + aiocb.aio_offset += bytes; + } + } + + free(copybuf); + files[fd].blk.offset += rc; + return rc; + +} + +int blkfront_posix_fstat(int fd, struct stat* buf) +{ + struct blkfront_dev* dev = files[fd].blk.dev; + + buf->st_mode = dev->info.mode; + buf->st_uid = 0; + buf->st_gid = 0; + buf->st_size = dev->info.sectors * dev->info.sector_size; + buf->st_atime = buf->st_mtime = buf->st_ctime = time(NULL); + + return 0; +} #endif diff --git a/extras/mini-os/include/blkfront.h b/extras/mini-os/include/blkfront.h index 724137e..3528af9 100644 --- a/extras/mini-os/include/blkfront.h +++ b/extras/mini-os/include/blkfront.h @@ -28,7 +28,17 @@ struct blkfront_info }; struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info); #ifdef HAVE_LIBC +#include <sys/stat.h> +/* POSIX IO functions: + * use blkfront_open() to get a file descriptor to the block device + * Don''t use the other blkfront posix functions here directly, instead use + * read(), write(), lseek() and fstat() on the file descriptor + */ int blkfront_open(struct blkfront_dev *dev); +int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write); +#define blkfront_posix_write(fd, buf, count) blkfront_posix_rwop(fd, (uint8_t*)buf, count, 1) +#define blkfront_posix_read(fd, buf, count) blkfront_posix_rwop(fd, (uint8_t*)buf, count, 0) +int blkfront_posix_fstat(int fd, struct stat* buf); #endif void blkfront_aio(struct blkfront_aiocb *aiocbp, int write); #define blkfront_aio_read(aiocbp) blkfront_aio(aiocbp, 0) diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h index 1af2717..d4641b6 100644 --- a/extras/mini-os/include/lib.h +++ b/extras/mini-os/include/lib.h @@ -174,6 +174,7 @@ extern struct file { } tap; struct { struct blkfront_dev *dev; + off_t offset; } blk; struct { struct kbdfront_dev *dev; diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c index a7d35d6..7ddbbf8 100644 --- a/extras/mini-os/lib/sys.c +++ b/extras/mini-os/lib/sys.c @@ -289,6 +289,11 @@ int read(int fd, void *buf, size_t nbytes) return ret * sizeof(union xenfb_in_event); } #endif +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: { + return blkfront_posix_read(fd, buf, nbytes); + } +#endif default: break; } @@ -321,6 +326,10 @@ int write(int fd, const void *buf, size_t nbytes) netfront_xmit(files[fd].tap.dev, (void*) buf, nbytes); return nbytes; #endif +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: + return blkfront_posix_write(fd, buf, nbytes); +#endif default: break; } @@ -331,8 +340,37 @@ int write(int fd, const void *buf, size_t nbytes) off_t lseek(int fd, off_t offset, int whence) { - errno = ESPIPE; - return (off_t) -1; + switch(files[fd].type) { +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: + switch (whence) { + case SEEK_SET: + files[fd].file.offset = offset; + break; + case SEEK_CUR: + files[fd].file.offset += offset; + break; + case SEEK_END: + { + struct stat st; + int ret; + ret = fstat(fd, &st); + if (ret) + return -1; + files[fd].file.offset = st.st_size + offset; + break; + } + default: + errno = EINVAL; + return -1; + } + return files[fd].file.offset; + break; +#endif + default: /* Not implemented on this FTYPE */ + errno = ESPIPE; + return (off_t) -1; + } } int fsync(int fd) { @@ -445,6 +483,10 @@ int fstat(int fd, struct stat *buf) buf->st_ctime = time(NULL); return 0; } +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: + return blkfront_posix_fstat(fd, buf); +#endif default: break; } -- 1.7.4.4
Samuel Thibault
2012-Oct-08 22:33 UTC
Re: [PATCH vtpm v3 06/12] add select definition to sys/time.h when HAVE_LIBC is defined
Matthew Fioravante, le Mon 08 Oct 2012 15:06:41 -0400, a écrit :> This patch adds the select function to sys/time.h when HAVE_LIBC is > defined, which is according to standard (see the select() manpage). > It also removes a redudant lwip include from posix/sys/select.h. > > Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu>Acked-by: Samuel Thibault <samuel.thibault@ens-lyon.org>> diff --git a/extras/mini-os/include/posix/sys/select.h b/extras/mini-os/include/posix/sys/select.h > index a9337be..5132c51 100644 > --- a/extras/mini-os/include/posix/sys/select.h > +++ b/extras/mini-os/include/posix/sys/select.h > @@ -2,7 +2,6 @@ > #define _POSIX_SELECT_H > > #include <sys/time.h> > -#include <lwip/sockets.h> > int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); > > #endif /* _POSIX_SELECT_H */ > diff --git a/extras/mini-os/include/sys/time.h b/extras/mini-os/include/sys/time.h > index d6623a4..3be3653 100644 > --- a/extras/mini-os/include/sys/time.h > +++ b/extras/mini-os/include/sys/time.h > @@ -22,6 +22,7 @@ > > #ifdef HAVE_LIBC > #include_next <sys/time.h> > + > #else > struct timespec { > time_t tv_sec; > @@ -37,6 +38,10 @@ struct timeval { > }; > > int gettimeofday(struct timeval *tv, void *tz); > + > +#endif > +#ifdef HAVE_LIBC > +#include <sys/select.h> > #endif > > #endif /* _MINIOS_SYS_TIME_H_ */ > -- > 1.7.4.4 >-- Samuel <i> ben oui ce serait idiot, mais osb -+- m''en fous de faire un truc débile ! -+-
Matthew Fioravante, le Mon 08 Oct 2012 15:06:42 -0400, a écrit :> This patch adds posix io support (read,write,lseek) to block devices > using blkfront. > > Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu> > Acked-by: Samuel Thibault <samuel.thibault@ens-lyons.org>Confirmed on this version.> diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c > index 74b8b26..f4283a9 100644 > --- a/extras/mini-os/blkfront.c > +++ b/extras/mini-os/blkfront.c > @@ -392,6 +392,7 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write) > static void blkfront_aio_cb(struct blkfront_aiocb *aiocbp, int ret) > { > aiocbp->data = (void*) 1; > + aiocbp->aio_cb = NULL; > } > > void blkfront_io(struct blkfront_aiocb *aiocbp, int write) > @@ -547,9 +548,177 @@ moretodo: > #ifdef HAVE_LIBC > int blkfront_open(struct blkfront_dev *dev) > { > + /* Silently prevent multiple opens */ > + if(dev->fd != -1) { > + return dev->fd; > + } > dev->fd = alloc_fd(FTYPE_BLK); > printk("blk_open(%s) -> %d\n", dev->nodename, dev->fd); > files[dev->fd].blk.dev = dev; > + files[dev->fd].blk.offset = 0; > return dev->fd; > } > + > +int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write) > +{ > + struct blkfront_dev* dev = files[fd].blk.dev; > + off_t offset = files[fd].blk.offset; > + struct blkfront_aiocb aiocb; > + unsigned long long disksize = dev->info.sectors * dev->info.sector_size; > + unsigned int blocksize = dev->info.sector_size; > + > + int blknum; > + int blkoff; > + size_t bytes; > + int rc = 0; > + int alignedbuf = 0; > + uint8_t* copybuf = NULL; > + > + /* RW 0 bytes is just a NOP */ > + if(count == 0) { > + return 0; > + } > + /* Check for NULL buffer */ > + if( buf == NULL ) { > + errno = EFAULT; > + return -1; > + } > + > + /* Write mode checks */ > + if(write) { > + /*Make sure we have write permission */ > + if(dev->info.info & VDISK_READONLY > + || (dev->info.mode != O_RDWR && dev->info.mode != O_WRONLY)) { > + errno = EACCES; > + return -1; > + } > + /*Make sure disk is big enough for this write */ > + if(offset + count > disksize) { > + errno = ENOSPC; > + return -1; > + } > + } > + /* Read mode checks */ > + else > + { > + /* Reading past the disk? Just return 0 */ > + if(offset >= disksize) { > + return 0; > + } > + > + /*If the requested read is bigger than the disk, just > + * read as much as we can until the end */ > + if(offset + count > disksize) { > + count = disksize - offset; > + } > + } > + /* Determine which block to start at and at which offset inside of it */ > + blknum = offset / blocksize; > + blkoff = offset % blocksize; > + > + /* Optimization: We need to check if buf is aligned to the sector size. > + * This is somewhat tricky code. We have to add the blocksize - block offset > + * because the first block may be a partial block and then for every subsequent > + * block rw the buffer will be offset.*/ > + if(!((uintptr_t) (buf +(blocksize - blkoff)) & (dev->info.sector_size-1))) { > + alignedbuf = 1; > + } > + > + /* Setup aiocb block object */ > + aiocb.aio_dev = dev; > + aiocb.aio_offset = blknum * blocksize; > + aiocb.aio_cb = NULL; > + aiocb.data = NULL; > + > + /* If our buffer is unaligned or its aligned but we will need to rw a partial block > + * then a copy will have to be done */ > + if(!alignedbuf || blkoff != 0 || count % blocksize != 0) { > + copybuf = _xmalloc(blocksize, dev->info.sector_size); > + } > + > + rc = count; > + while(count > 0) { > + /* determine how many bytes to read/write from/to the current block buffer */ > + if(!alignedbuf || blkoff != 0 || count < blocksize) { > + /* This is the case for unaligned R/W or partial block */ > + bytes = count < blocksize - blkoff ? count : blocksize - blkoff; > + aiocb.aio_nbytes = blocksize; > + } else { > + /* We can optimize further if buffer is page aligned */ > + int not_page_aligned = 0; > + if(((uintptr_t)buf) & (PAGE_SIZE -1)) { > + not_page_aligned = 1; > + } > + > + /* For an aligned R/W we can read up to the maximum transfer size */ > + bytes = count > (BLKIF_MAX_SEGMENTS_PER_REQUEST-not_page_aligned)*PAGE_SIZE > + ? (BLKIF_MAX_SEGMENTS_PER_REQUEST-not_page_aligned)*PAGE_SIZE > + : count & ~(blocksize -1); > + aiocb.aio_nbytes = bytes; > + } > + > + /* read operation */ > + if(!write) { > + if (alignedbuf && bytes >= blocksize) { > + /* If aligned and were reading a whole block, just read right into buf */ > + aiocb.aio_buf = buf; > + blkfront_read(&aiocb); > + } else { > + /* If not then we have to do a copy */ > + aiocb.aio_buf = copybuf; > + blkfront_read(&aiocb); > + memcpy(buf, ©buf[blkoff], bytes); > + } > + } > + /* Write operation */ > + else { > + if(alignedbuf && bytes >= blocksize) { > + /* If aligned and were writing a whole block, just write directly from buf */ > + aiocb.aio_buf = buf; > + blkfront_write(&aiocb); > + } else { > + /* If not then we have to do a copy. */ > + aiocb.aio_buf = copybuf; > + /* If we''re writing a partial block, we need to read the current contents first > + * so we don''t overwrite the extra bits with garbage */ > + if(blkoff != 0 || bytes < blocksize) { > + blkfront_read(&aiocb); > + } > + memcpy(©buf[blkoff], buf, bytes); > + blkfront_write(&aiocb); > + } > + } > + /* Will start at beginning of all remaining blocks */ > + blkoff = 0; > + > + /* Increment counters and continue */ > + count -= bytes; > + buf += bytes; > + if(bytes < blocksize) { > + //At minimum we read one block > + aiocb.aio_offset += blocksize; > + } else { > + //If we read more than a block, was a multiple of blocksize > + aiocb.aio_offset += bytes; > + } > + } > + > + free(copybuf); > + files[fd].blk.offset += rc; > + return rc; > + > +} > + > +int blkfront_posix_fstat(int fd, struct stat* buf) > +{ > + struct blkfront_dev* dev = files[fd].blk.dev; > + > + buf->st_mode = dev->info.mode; > + buf->st_uid = 0; > + buf->st_gid = 0; > + buf->st_size = dev->info.sectors * dev->info.sector_size; > + buf->st_atime = buf->st_mtime = buf->st_ctime = time(NULL); > + > + return 0; > +} > #endif > diff --git a/extras/mini-os/include/blkfront.h b/extras/mini-os/include/blkfront.h > index 724137e..3528af9 100644 > --- a/extras/mini-os/include/blkfront.h > +++ b/extras/mini-os/include/blkfront.h > @@ -28,7 +28,17 @@ struct blkfront_info > }; > struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info); > #ifdef HAVE_LIBC > +#include <sys/stat.h> > +/* POSIX IO functions: > + * use blkfront_open() to get a file descriptor to the block device > + * Don''t use the other blkfront posix functions here directly, instead use > + * read(), write(), lseek() and fstat() on the file descriptor > + */ > int blkfront_open(struct blkfront_dev *dev); > +int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write); > +#define blkfront_posix_write(fd, buf, count) blkfront_posix_rwop(fd, (uint8_t*)buf, count, 1) > +#define blkfront_posix_read(fd, buf, count) blkfront_posix_rwop(fd, (uint8_t*)buf, count, 0) > +int blkfront_posix_fstat(int fd, struct stat* buf); > #endif > void blkfront_aio(struct blkfront_aiocb *aiocbp, int write); > #define blkfront_aio_read(aiocbp) blkfront_aio(aiocbp, 0) > diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h > index 1af2717..d4641b6 100644 > --- a/extras/mini-os/include/lib.h > +++ b/extras/mini-os/include/lib.h > @@ -174,6 +174,7 @@ extern struct file { > } tap; > struct { > struct blkfront_dev *dev; > + off_t offset; > } blk; > struct { > struct kbdfront_dev *dev; > diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c > index a7d35d6..7ddbbf8 100644 > --- a/extras/mini-os/lib/sys.c > +++ b/extras/mini-os/lib/sys.c > @@ -289,6 +289,11 @@ int read(int fd, void *buf, size_t nbytes) > return ret * sizeof(union xenfb_in_event); > } > #endif > +#ifdef CONFIG_BLKFRONT > + case FTYPE_BLK: { > + return blkfront_posix_read(fd, buf, nbytes); > + } > +#endif > default: > break; > } > @@ -321,6 +326,10 @@ int write(int fd, const void *buf, size_t nbytes) > netfront_xmit(files[fd].tap.dev, (void*) buf, nbytes); > return nbytes; > #endif > +#ifdef CONFIG_BLKFRONT > + case FTYPE_BLK: > + return blkfront_posix_write(fd, buf, nbytes); > +#endif > default: > break; > } > @@ -331,8 +340,37 @@ int write(int fd, const void *buf, size_t nbytes) > > off_t lseek(int fd, off_t offset, int whence) > { > - errno = ESPIPE; > - return (off_t) -1; > + switch(files[fd].type) { > +#ifdef CONFIG_BLKFRONT > + case FTYPE_BLK: > + switch (whence) { > + case SEEK_SET: > + files[fd].file.offset = offset; > + break; > + case SEEK_CUR: > + files[fd].file.offset += offset; > + break; > + case SEEK_END: > + { > + struct stat st; > + int ret; > + ret = fstat(fd, &st); > + if (ret) > + return -1; > + files[fd].file.offset = st.st_size + offset; > + break; > + } > + default: > + errno = EINVAL; > + return -1; > + } > + return files[fd].file.offset; > + break; > +#endif > + default: /* Not implemented on this FTYPE */ > + errno = ESPIPE; > + return (off_t) -1; > + } > } > > int fsync(int fd) { > @@ -445,6 +483,10 @@ int fstat(int fd, struct stat *buf) > buf->st_ctime = time(NULL); > return 0; > } > +#ifdef CONFIG_BLKFRONT > + case FTYPE_BLK: > + return blkfront_posix_fstat(fd, buf); > +#endif > default: > break; > } > -- > 1.7.4.4 >-- Samuel PS> Salut ! J''ai un sujet de philo à vous soumettre : "Suffit-il PS> d''observer pour connaître" Idées + plan Merçi Oui, ya qu''a t''observer pour connaître le fait que tu es une feignasse. -+- FF in: Guide du Neuneu d''Usenet - Neuneu fait de la philo -+-
Ian Campbell
2012-Oct-09 09:39 UTC
Re: [PATCH vtpm v3 06/12] add select definition to sys/time.h when HAVE_LIBC is defined
On Mon, 2012-10-08 at 23:33 +0100, Samuel Thibault wrote:> Matthew Fioravante, le Mon 08 Oct 2012 15:06:41 -0400, a écrit : > > This patch adds the select function to sys/time.h when HAVE_LIBC is > > defined, which is according to standard (see the select() manpage). > > It also removes a redudant lwip include from posix/sys/select.h. > > > > Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu> > > Acked-by: Samuel Thibault <samuel.thibault@ens-lyon.org>and applied, thanks.> > > diff --git a/extras/mini-os/include/posix/sys/select.h b/extras/mini-os/include/posix/sys/select.h > > index a9337be..5132c51 100644 > > --- a/extras/mini-os/include/posix/sys/select.h > > +++ b/extras/mini-os/include/posix/sys/select.h > > @@ -2,7 +2,6 @@ > > #define _POSIX_SELECT_H > > > > #include <sys/time.h> > > -#include <lwip/sockets.h> > > int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); > > > > #endif /* _POSIX_SELECT_H */ > > diff --git a/extras/mini-os/include/sys/time.h b/extras/mini-os/include/sys/time.h > > index d6623a4..3be3653 100644 > > --- a/extras/mini-os/include/sys/time.h > > +++ b/extras/mini-os/include/sys/time.h > > @@ -22,6 +22,7 @@ > > > > #ifdef HAVE_LIBC > > #include_next <sys/time.h> > > + > > #else > > struct timespec { > > time_t tv_sec; > > @@ -37,6 +38,10 @@ struct timeval { > > }; > > > > int gettimeofday(struct timeval *tv, void *tz); > > + > > +#endif > > +#ifdef HAVE_LIBC > > +#include <sys/select.h> > > #endif > > > > #endif /* _MINIOS_SYS_TIME_H_ */ > > -- > > 1.7.4.4 > > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
On Mon, 2012-10-08 at 23:35 +0100, Samuel Thibault wrote:> Matthew Fioravante, le Mon 08 Oct 2012 15:06:42 -0400, a écrit : > > This patch adds posix io support (read,write,lseek) to block devices > > using blkfront. > > > > Signed-off-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu> > > Acked-by: Samuel Thibault <samuel.thibault@ens-lyons.org> > > Confirmed on this version.And applied, thanks. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel