Start 1.33.0 development cycle
[oweals/busybox.git] / libbb / device_open.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8  */
9 #include "libbb.h"
10
11 /* try to open up the specified device */
12 int FAST_FUNC device_open(const char *device, int mode)
13 {
14         int m, f, fd;
15
16         m = mode | O_NONBLOCK;
17
18         /* Retry up to 5 times */
19         /* TODO: explain why it can't be considered insane */
20         for (f = 0; f < 5; f++) {
21                 fd = open(device, m, 0600);
22                 if (fd >= 0)
23                         break;
24         }
25         if (fd < 0)
26                 return fd;
27         /* Reset original flags. */
28         if (m != mode)
29                 fcntl(fd, F_SETFL, mode);
30         return fd;
31 }