File: unix.idl

package info (click to toggle)
camlidl 1.05-7
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 872 kB
  • ctags: 1,131
  • sloc: ml: 4,894; ansic: 940; cpp: 897; makefile: 294; sh: 182
file content (186 lines) | stat: -rw-r--r-- 4,705 bytes parent folder | download | duplicates (7)
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/* Parts of the Unix library */

quote(C,"#include <stdlib.h>")
quote(C,"#include <stdio.h>")
quote(C,"#include <sys/types.h>")
quote(C,"#include <sys/wait.h>")
quote(C,"#include <dirent.h>")
quote(C,"#include <unistd.h>")
quote(C,"#include <sys/stat.h>")
quote(C,"#include <sys/time.h>")
quote(C,"#include <fcntl.h>")

quote (C, "
  /* Wrapping of return code for wait */

  union process_status { int code; };

  enum { WEXITED, WSIGNALED, WSTOPPED };

  static void decode_status(int status, int * kind, union process_status * p)
  {
    if (WIFEXITED(status)) {
      *kind = WEXITED; p->code = WEXITSTATUS(status);
    } else if (WIFSIGNALED(status)) {
      *kind = WSIGNALED; p->code = WTERMSIG(status);
    } else {
      *kind = WSTOPPED; p->code = WSTOPSIG(status);
    }
  }

  int read2(int fd, int len, int * rd, char * buf)
  {
    int retcode = read(fd, buf, len);
    if (retcode != -1) { *rd = retcode; retcode = 0; }
    return retcode;
  }

  typedef DIR * dir_handle;
  typedef struct dirent dirent;
  typedef fd_set * file_descr_set;

  extern char ** environ;
")

[string*, null_terminated] char ** environment(void)
   quote(call, "_res = environ;");

[string] char * getenv([in,string] char * varname);

void putenv([in,string] char * name_val);

int execv([in,string] char * path,
          [in,null_terminated,string*] char ** argv);

int execve([in,string] char * path, 
           [in,null_terminated,string*] char ** argv,
           [in,null_terminated,string*] char ** env);

int fork(void);

union process_status {
  case WEXITED: int code;
  case WSIGNALED: int code;
  case WSTOPPED: int code;
};

int wait([out] int * kind,
         [out,switch_is(*kind)] union process_status * p)
  quote(call,
    " { int status;
        _res = wait(&status);
        if (_res != -1) decode_status(status, kind, p); }");

void system([in,string] char * cmd,
            [out] int * kind,
            [out,switch_is(*kind)] union process_status * p)
  quote(call,
    "  { int ret = system(cmd);
         decode_status(ret, kind, p); } ");

int getpid(void);
int getppid(void);
int nice(int pid);

enum open_flags {
  O_RDONLY, O_WRONLY, O_RDWR, O_CREAT,
  O_EXCL, O_TRUNC, O_APPEND, O_NONBLOCK
};

int openfile([in,string] char * name,
             [in,set] enum open_flags flags,
             [in] int perms)
  quote(call, " _res = open(name, flags, perms); ");

int close([in] int fd);

/* read in place */
int read([in] int fd, [in,string,size_is(len)] char * buf, [in] int len);

/* read with copy */
void read2([in] int fd, [in] int len, [out] int *rd,
          [out,string,size_is(len),length_is(*rd)] char * buf)
  quote(call,
    " *rd = read(fd, buf, len);
      if (*rd == -1) failwith(\"read2\"); ");

/* write */
int write([in] int fd, [in,string,size_is(len)] char * buf, [in] int len);

/* seeking */
enum seek_command { SEEK_SET, SEEK_CUR, SEEK_END };

int lseek(int fd, int ofs, enum seek_command cmd);

int truncate([string] char * filename, int size);

int ftruncate(int fd, int size);

/* stats */
/* Note: the types given are not the C representation types, */
/* but just the conversion types.  So it's OK to say st_dev is an int */
/* even if actually it's a short.  We can even claim that st_?time */
/* are doubles while actually they are integers! */
struct stat {
  int st_dev, st_ino;
  int st_mode;
  int st_nlink;
  int st_uid, st_gid;
  int st_rdev;
  int st_size;
  long st_blksize, st_blocks;
  double st_atime, st_mtime, st_ctime;
};

int stat([string] char * filename, [out] struct stat * st);
int lstat([string] char * filename, [out] struct stat * st);
int fstat(int fd, [out] struct stat * st);

/* Operations on file names */

int unlink([string] char * filename);
int rename([string] char * filename, [string] char * newname);
int link([string] char * filename, [string] char * newname);

/* Directories */

typedef [abstract,ptr] void * dir_handle;

dir_handle opendir([string] char * filename)
  quote(call,
    " _res = opendir(filename);
      if (_res == NULL) failwith(\"opendir\"); ");

typedef struct {
  [string] char d_name[256];   // NAME_MAX in fact
} dirent;

[unique] dirent * readdir(dir_handle d);

void rewinddir(dir_handle d);
void closedir(dir_handle d);

/* pipes */

int pipe([out] int fds[2]);

/* select */

typedef [abstract] void * file_descr_set;

void FD_ZERO(file_descr_set s);
void FD_SET(int fd, file_descr_set s);
void FD_CLR(int fd, file_descr_set s);
boolean FD_ISSET(int fd, file_descr_set s);

struct timeval {
  int tv_sec;
  int tv_usec;
};

int select(int n,
           file_descr_set read,
           file_descr_set write,
           file_descr_set except,
           [unique] struct timeval * timeout);