summaryrefslogtreecommitdiff
path: root/hurd
diff options
context:
space:
mode:
Diffstat (limited to 'hurd')
-rw-r--r--hurd/shared.h69
1 files changed, 58 insertions, 11 deletions
diff --git a/hurd/shared.h b/hurd/shared.h
index 8244eec0..9d7edb55 100644
--- a/hurd/shared.h
+++ b/hurd/shared.h
@@ -1,11 +1,11 @@
/* Definitions for shared IO control pages
- Copyright (C) 1991 Free Software Foundation
+ Copyright (C) 1992 Free Software Foundation
This file is part of the GNU Hurd.
The GNU Hurd is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
The GNU Hurd is distributed in the hope that it will be useful,
@@ -19,10 +19,11 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
struct shared_io
{
- int shared_page_version;
+ int shared_page_magic;
/* This lock protects against modification to it_status. */
spin_lock_t lock;
+
enum
{
USER_IT, /* User is it */
@@ -40,10 +41,29 @@ struct shared_io
int do_sigio; /* call io_sigio after each operation */
int use_file_size; /* file_size is meaningful */
- off_t file_size;
int use_read_size; /* read_size is meaningful */
int read_size;
+
+ enum
+ {
+ /* This means that there isn't any data to be read */
+ RBR_NO_DATA,
+
+ /* This means that more data cannot be added to the buffer. If
+ the rd_file_pointer is advanced, then more data might become
+ readable. This condition has priority over NO_DATA: protocols
+ might refuse to receive data when the buffer is full; then this
+ will be BUFFER_FULL. If file pointer gets advanced, then the
+ protocol will tell the sender to go ahead, and the read_block_reason
+ will be NO_DATA until the first data arrives.
+ */
+ RBR_BUFFER_FULL,
+
+ /* These conditions are generally only meaningful for nonseekable
+ objects. */
+ }
+ read_block_reason; /* identifies what holds up reading */
int seekable; /* the file pointer can be reduced */
@@ -62,19 +82,46 @@ struct shared_io
off_t wr_file_pointer;
off_t xx_file_pointer;
-
- /* These are set by the user only: */
+ off_t file_size;
/* These two indicate that the appropriate times need updated */
int written;
int accessed;
-
- /* Reserved for future extensions */
- int reserved [32];
- /* Owned by the user from here to the end of the page */
- int user_owned[0];
+ /* File structuring: */
+
+ /* If the file is not seekable and read data is separate from write
+ data, then the read data might be structured. Each record is
+ identified by one of these structures. The "auxil" field
+ contains extra data which might be of interest to some readers,
+ but is not part of the data proper (for example, UDP and raw IP
+ put the internet headers there).
+
+ The IO server guarantees that these will be consecutive, and that
+ the file_pointer_start of each record will be that of the last
+ plus its data_length. The last valid structure might grow
+ whenever the server is it. All previous records from the
+ rd_file_pointer to the current read_size/file_size will not
+ change. Records before that can be dropped and the valid records
+ moved forward in the array (when the server is it); if this
+ happens indexes_changed will be set to the number of records
+ dropped. */
+
+ int indexes_changed; /* users can clear this when they want */
+
+ /* Users should not modify the rest of this: */
+ int use_structure; /* structure is being used */
+ struct iomap_structure
+ {
+ int file_pointer_start; /* file pointer offset of data */
+ int object_start; /* offset of auxil in memory object */
+ int auxil_length; /* length of auxil data */
+ int data_length; /* length of real data */
+ } structure[0];
};
+/* Look at this value to determine the byte order the server is using,
+ and then use it. */
+#define SHARED_PAGE_MAGIC 0xaabbccdd