diff options
Diffstat (limited to 'libbb/device_open.c')
-rw-r--r-- | libbb/device_open.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/libbb/device_open.c b/libbb/device_open.c new file mode 100644 index 0000000..cf8bcf6 --- /dev/null +++ b/libbb/device_open.c @@ -0,0 +1,32 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include "libbb.h" + +/* try to open up the specified device */ +int FAST_FUNC device_open(const char *device, int mode) +{ + int m, f, fd; + + m = mode | O_NONBLOCK; + + /* Retry up to 5 times */ + /* TODO: explain why it can't be considered insane */ + for (f = 0; f < 5; f++) { + fd = open(device, m, 0600); + if (fd >= 0) + break; + } + if (fd < 0) + return fd; + /* Reset original flags. */ + if (m != mode) + fcntl(fd, F_SETFL, mode); + return fd; +} |