Rev 5198 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4921 | Serge | 1 | /* open.c -- open a file. |
2 | * |
||
3 | * Copyright (c) 1995 Cygnus Support |
||
4 | * |
||
5 | * The authors hereby grant permission to use, copy, modify, distribute, |
||
6 | * and license this software and its documentation for any purpose, provided |
||
7 | * that existing copyright notices are retained in all copies and that this |
||
8 | * notice is included verbatim in any distributions. No written agreement, |
||
9 | * license, or royalty fee is required for any of the authorized uses. |
||
10 | * Modifications to this software may be copyrighted by their authors |
||
11 | * and need not follow the licensing terms described here, provided that |
||
12 | * the new terms are clearly indicated on the first page of each file where |
||
13 | * they apply. |
||
14 | */ |
||
15 | #include |
||
16 | #include |
||
17 | #include |
||
18 | #include |
||
19 | #include "glue.h" |
||
20 | #include "io.h" |
||
21 | |||
22 | #undef erro |
||
23 | extern int errno; |
||
24 | |||
25 | int open (const char * filename, int flags, ...) |
||
26 | { |
||
27 | __io_handle *ioh; |
||
28 | fileinfo_t info; |
||
29 | int iomode, rwmode, offset; |
||
30 | int hid; |
||
31 | int err; |
||
32 | |||
33 | hid = __io_alloc(); |
||
34 | if(hid < 0) |
||
35 | { |
||
36 | errno = EMFILE; |
||
37 | return (-1); |
||
38 | }; |
||
39 | |||
40 | // path = getfullpath(name); |
||
41 | |||
42 | err = get_fileinfo(filename, &info); |
||
43 | |||
44 | if( flags & O_EXCL && |
||
45 | flags & O_CREAT ) |
||
46 | { |
||
47 | if( !err ) |
||
48 | { |
||
49 | errno = EEXIST; |
||
50 | return (-1); |
||
51 | }; |
||
52 | } |
||
53 | |||
54 | if( err ) |
||
55 | { |
||
56 | if(flags & O_CREAT) |
||
57 | err=create_file(filename); |
||
58 | if( err ) |
||
59 | { |
||
60 | errno = EACCES; |
||
61 | return -1; |
||
62 | }; |
||
63 | }; |
||
64 | |||
65 | if( flags & O_TRUNC ) |
||
66 | set_file_size(filename, 0); |
||
67 | |||
68 | ioh = &__io_tab[hid]; |
||
69 | |||
70 | rwmode = flags & ( O_RDONLY | O_WRONLY | O_RDWR ); |
||
71 | |||
72 | iomode = 0; |
||
73 | offset = 0; |
||
74 | |||
75 | if( rwmode == O_RDWR ) |
||
76 | iomode |= _READ | _WRITE; |
||
77 | else if( rwmode == O_RDONLY) |
||
78 | iomode |= _READ; |
||
79 | else if( rwmode == O_WRONLY) |
||
80 | iomode |= _WRITE; |
||
81 | |||
82 | if( flags & O_APPEND ) |
||
83 | { |
||
84 | iomode |= _APPEND; |
||
85 | offset = info.size; |
||
86 | }; |
||
87 | |||
88 | if( flags & (O_BINARY|O_TEXT) ) |
||
89 | { |
||
90 | if( flags & O_BINARY ) |
||
91 | iomode |= _BINARY; |
||
92 | } else |
||
93 | iomode |= _BINARY; |
||
94 | |||
95 | ioh->name = strdup(filename); |
||
96 | ioh->offset = offset; |
||
97 | ioh->mode = iomode; |
||
98 | ioh->read = read_file; |
||
99 | ioh->write = write_file; |
||
100 | |||
101 | return hid; |
||
102 | };> |
||
103 |