Annotation of src/usr.bin/sndiod/file.h, Revision 1.3
1.3 ! ratchov 1: /* $OpenBSD: file.h,v 1.2 2015/07/17 09:51:18 ratchov Exp $ */
1.1 ratchov 2: /*
3: * Copyright (c) 2008-2012 Alexandre Ratchov <alex@caoua.org>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17: #ifndef FILE_H
18: #define FILE_H
19:
20: #include <sys/types.h>
21:
22: struct file;
23: struct pollfd;
24:
25: struct timo {
26: struct timo *next;
27: unsigned int val; /* time to wait before the callback */
28: unsigned int set; /* true if the timeout is set */
29: void (*cb)(void *arg); /* routine to call on expiration */
30: void *arg; /* argument to give to 'cb' */
31: };
32:
33: struct fileops {
34: char *name;
35: int (*pollfd)(void *, struct pollfd *);
36: int (*revents)(void *, struct pollfd *);
37: /*
38: * we have to handle POLLIN and POLLOUT events
39: * in separate handles, since handling POLLIN can
40: * close the file, and continuing (to handle POLLOUT)
41: * would make use of the free()'ed file structure
42: */
43: void (*in)(void *);
44: void (*out)(void *);
45: void (*hup)(void *);
46: };
47:
48: struct file {
49: struct file *next; /* next in file_list */
50: struct fileops *ops; /* event handlers */
51: void *arg; /* argument to event handlers */
52: #define FILE_INIT 0 /* ready */
53: #define FILE_ZOMB 1 /* closed, but not free()d yet */
54: unsigned int state; /* one of above */
1.2 ratchov 55: unsigned int max_nfds; /* max number of descriptors */
1.3 ! ratchov 56: int nfds; /* number of descriptors polled */
1.1 ratchov 57: char *name; /* for debug purposes */
58: };
59:
60: extern struct file *file_list;
61: extern int file_slowaccept;
62:
63: #ifdef DEBUG
64: extern long long file_wtime, file_utime;
65: #endif
66:
67: void timo_set(struct timo *, void (*)(void *), void *);
68: void timo_add(struct timo *, unsigned int);
69: void timo_del(struct timo *);
70:
71: void filelist_init(void);
72: void filelist_done(void);
73: void filelist_unlisten(void);
74:
75: struct file *file_new(struct fileops *, void *, char *, unsigned int);
76: void file_del(struct file *);
77: void file_log(struct file *);
78:
79: int file_poll(void);
80:
81: #endif /* !defined(FILE_H) */