File: aiod_prot.h

package info (click to toggle)
sfs 1%3A0.5k-8
  • links: PTS
  • area: main
  • in suites: woody
  • size: 5,388 kB
  • ctags: 8,556
  • sloc: cpp: 43,410; ansic: 17,574; sh: 8,412; makefile: 771; yacc: 277; lex: 96; sed: 47
file content (141 lines) | stat: -rw-r--r-- 3,311 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// -*-c++-*-
/* $Id: aiod_prot.h,v 1.5 1999/11/12 03:37:29 dm Exp $ */

/*
 *
 * Copyright (C) 1998 David Mazieres (dm@uun.org)
 *
 * This program 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 2, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 *
 */

#ifndef _AIOD_AIOD_PROT_H_
#define _AIOD_AIOD_PROT_H_ 1

#include "sysconf.h"

typedef size_t aiomsg_t;

/* File handle type.  Arguments containing file handles contain an
 * aiomsg_t with the position of an aiod_file structure in the shared
 * memory buffer. */
struct aiod_file {
  int handle;
  int oflags;
  dev_t dev;
  ino_t ino;
  char path[1];
};

struct aiod_iobuf {
  off_t pos;			// Position in file
  aiomsg_t buf;			// Position in shared mem of buffer
  ssize_t len;			// Size of buffer/operation
};

enum aiod_op {
  AIOD_NOP = 0,

  /* Requests taking aiod_pathop */
  AIOD_UNLINK = 1,
  AIOD_LINK = 2,
  AIOD_SYMLINK = 3,
  AIOD_RENAME = 4,
  AIOD_READLINK = 5,
  AIOD_STAT = 6,
  AIOD_LSTAT = 7,
  AIOD_GETCWD = 8,

  /* Requests take an aiod_fhop */
  AIOD_OPEN = 9,
  AIOD_CLOSE = 10,
  AIOD_FSYNC = 11,
  AIOD_FTRUNC = 12,
  AIOD_READ = 13,
  AIOD_WRITE = 14,

  /* fstat is special */
  AIOD_FSTAT = 15,
};

/* Common header for all requests */
struct aiod_reqhdr {
  aiod_op op;
  int err;
};

struct aiod_nop {
  aiod_op op;
  int err;
  size_t nopsize;
};

/* Argument for operations that take pathnames */
struct aiod_pathop {
  aiod_op op;
  int err;
  size_t bufsize;
  union {
    off_t __alignment_hack;
    char pathbuf[2];		// 1 or 2 null-terminated paths in arg
  };

  char *path1 () { return pathbuf; }
  char *path2 () { return pathbuf + 1 + strlen (pathbuf); }
  struct stat *statbuf () {
#ifdef XXX_CHECK_BOUNDS		// Can't trust aiod's not to clobber bufsize
    assert (sizeof (struct stat) <= bufsize);
#endif /* CHECK_BOUNDS */
    return reinterpret_cast<struct stat *> (pathbuf);
  }
  void setpath (const char *p1, const char *p2 = "") {
    size_t len1 = strlen (p1);
#ifdef XXX_CHECK_BOUNDS
    assert (len1 + 2 + strlen (p2) <= bufsize);
#endif /* CHECK_BOUNDS */
    strcpy (pathbuf, p1);
    strcpy (pathbuf + len1 + 1, p2);
  }
  static size_t totsize (size_t bufsize);
};

inline size_t
aiod_pathop::totsize (size_t bufsize)
{
  return offsetof (aiod_pathop, pathbuf) + bufsize;
}

/* Argument for most operations that take a file handle */
struct aiod_fhop {
  aiod_op op;
  int err;
  aiomsg_t fh;			// Pointer to file handle
  union {
    mode_t mode;		// For open
    off_t length;		// For trunc
    aiod_iobuf iobuf;		// For read, write
  };
};

/* Argument for fstat */
struct aiod_fstat {
  aiod_op op;
  int err;
  aiomsg_t fh;			// Pointer to file handle
  struct stat statbuf;
};

#endif /* !_AIOD_AIOD_PROT_H_ */