Browse Source

fpgautils: serial_close: Explicitly release advisory lock before closing, in case fd has been inherited by a process forked by system()

Luke Dashjr 12 years ago
parent
commit
2e20d069a3
2 changed files with 9 additions and 1 deletions
  1. 8 0
      fpgautils.c
  2. 1 1
      fpgautils.h

+ 8 - 0
fpgautils.c

@@ -898,6 +898,14 @@ int serial_open(const char *devpath, unsigned long baud, uint8_t timeout, bool p
 #endif
 #endif
 }
 }
 
 
+int serial_close(const int fd)
+{
+#if defined(LOCK_EX) && defined(LOCK_NB) && defined(LOCK_UN)
+	flock(fd, LOCK_UN);
+#endif
+	return close(fd);
+}
+
 ssize_t _serial_read(int fd, char *buf, size_t bufsiz, char *eol)
 ssize_t _serial_read(int fd, char *buf, size_t bufsiz, char *eol)
 {
 {
 	ssize_t len, tlen = 0;
 	ssize_t len, tlen = 0;

+ 1 - 1
fpgautils.h

@@ -44,7 +44,7 @@ extern ssize_t _serial_read(int fd, char *buf, size_t buflen, char *eol);
 	_serial_read(fd, (char*)(buf), count, NULL)
 	_serial_read(fd, (char*)(buf), count, NULL)
 #define serial_read_line(fd, buf, bufsiz, eol)  \
 #define serial_read_line(fd, buf, bufsiz, eol)  \
 	_serial_read(fd, buf, bufsiz, &eol)
 	_serial_read(fd, buf, bufsiz, &eol)
-#define serial_close(fd)  close(fd)
+extern int serial_close(int fd);
 
 
 extern FILE *open_xilinx_bitstream(const char *dname, const char *repr, const char *fwfile, unsigned long *out_len);
 extern FILE *open_xilinx_bitstream(const char *dname, const char *repr, const char *fwfile, unsigned long *out_len);