1 /* source: xio-file.c */
2 /* Copyright Gerhard Rieger and contributors (see file CHANGES) */
3 /* Published under the GNU General Public License V.2, see file COPYING */
5 /* this file contains the source for opening addresses of open type */
7 #include "xiosysincludes.h"
10 #include "xio-named.h"
14 static int xioopen_open(int argc
, const char *argv
[], struct opt
*opts
, int xioflags
, xiofile_t
*fd
, unsigned groups
, int dummy1
, int dummy2
, int dummy3
);
19 /****** OPEN addresses ******/
20 const struct optdesc opt_o_rdonly
= { "o-rdonly", "rdonly", OPT_O_RDONLY
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG_PATTERN
, O_RDONLY
, O_ACCMODE
};
21 const struct optdesc opt_o_wronly
= { "o-wronly", "wronly", OPT_O_WRONLY
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG_PATTERN
, O_WRONLY
, O_ACCMODE
};
22 const struct optdesc opt_o_rdwr
= { "o-rdwr", "rdwr", OPT_O_RDWR
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG_PATTERN
, O_RDWR
, O_ACCMODE
};
23 const struct optdesc opt_o_create
= { "o-create", "creat", OPT_O_CREATE
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_CREAT
};
24 const struct optdesc opt_o_excl
= { "o-excl", "excl", OPT_O_EXCL
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_EXCL
};
25 const struct optdesc opt_o_noctty
= { "o-noctty", "noctty", OPT_O_NOCTTY
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_NOCTTY
};
27 const struct optdesc opt_o_sync
= { "o-sync", "sync", OPT_O_SYNC
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_SYNC
};
30 const struct optdesc opt_o_nofollow
= { "o-nofollow", "nofollow",OPT_O_NOFOLLOW
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_NOFOLLOW
};
33 const struct optdesc opt_o_directory
= { "o-directory", "directory",OPT_O_DIRECTORY
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_DIRECTORY
};
36 const struct optdesc opt_o_largefile
= { "o-largefile", "largefile",OPT_O_LARGEFILE
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_LARGEFILE
};
39 const struct optdesc opt_o_nshare
= { "o-nshare", "nshare", OPT_O_NSHARE
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_NSHARE
};
42 const struct optdesc opt_o_rshare
= { "o-rshare", "rshare", OPT_O_RSHARE
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_RSHARE
};
45 const struct optdesc opt_o_defer
= { "o-defer", "defer", OPT_O_DEFER
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_DEFER
};
48 const struct optdesc opt_o_direct
= { "o-direct", "direct", OPT_O_DIRECT
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_DIRECT
};
51 const struct optdesc opt_o_dsync
= { "o-dsync", "dsync", OPT_O_DSYNC
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_DSYNC
};
54 const struct optdesc opt_o_rsync
= { "o-rsync", "rsync", OPT_O_RSYNC
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_RSYNC
};
57 const struct optdesc opt_o_delay
= { "o-delay", "delay", OPT_O_DELAY
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_DELAY
};
60 const struct optdesc opt_o_priv
= { "o-priv", "priv", OPT_O_PRIV
, GROUP_OPEN
, PH_OPEN
, TYPE_BOOL
, OFUNC_FLAG
, O_PRIV
};
62 const struct optdesc opt_o_trunc
= { "o-trunc", "trunc", OPT_O_TRUNC
, GROUP_OPEN
, PH_LATE
, TYPE_BOOL
, OFUNC_FLAG
, O_TRUNC
};
64 #endif /* WITH_OPEN */
67 #if _WITH_FILE /*! inconsistent name FILE vs. OPEN */
69 const struct addrdesc addr_open
= { "open", 3, xioopen_open
, GROUP_FD
|GROUP_FIFO
|GROUP_CHR
|GROUP_BLK
|GROUP_REG
|GROUP_NAMED
|GROUP_OPEN
|GROUP_FILE
|GROUP_TERMIOS
, 0, 0, 0 HELP(":<filename>") };
72 if the filesystem entry already exists, the data is appended
73 if it does not exist, a file is created and the data is appended
75 static int xioopen_open(int argc
, const char *argv
[], struct opt
*opts
, int xioflags
, xiofile_t
*fd
, unsigned groups
, int dummy1
, int dummy2
, int dummy3
) {
76 const char *filename
= argv
[1];
77 int rw
= (xioflags
& XIO_ACCMODE
);
79 bool opt_unlink_close
= false;
82 /* remove old file, or set user/permissions on old file; parse options */
83 if ((result
= _xioopen_named_early(argc
, argv
, fd
, groups
, &exists
, opts
)) < 0) {
87 retropt_bool(opts
, OPT_UNLINK_CLOSE
, &opt_unlink_close
);
88 if (opt_unlink_close
) {
89 if ((fd
->stream
.unlink_close
= strdup(filename
)) == NULL
) {
90 Error1("strdup(\"%s\"): out of memory", filename
);
92 fd
->stream
.opt_unlink_close
= true;
95 Notice3("opening %s \"%s\" for %s",
96 filetypenames
[(result
&S_IFMT
)>>12], filename
, ddirection
[rw
]);
97 if ((result
= _xioopen_open(filename
, rw
, opts
)) < 0)
99 fd
->stream
.fd
= result
;
102 if (Isatty(fd
->stream
.fd
)) {
103 if (Tcgetattr(fd
->stream
.fd
, &fd
->stream
.savetty
) < 0) {
104 Warn2("cannot query current terminal settings on fd %d: %s",
105 fd
->stream
.fd
, strerror(errno
));
107 fd
->stream
.ttyvalid
= true;
110 #endif /* WITH_TERMIOS */
112 applyopts_named(filename
, opts
, PH_FD
);
113 applyopts(fd
->stream
.fd
, opts
, PH_FD
);
114 applyopts_cloexec(fd
->stream
.fd
, opts
);
116 applyopts_fchown(fd
->stream
.fd
, opts
);
118 if ((result
= _xio_openlate(&fd
->stream
, opts
)) < 0)
124 #endif /* _WITH_FILE */