[Libsysio-commit] HEAD: libsysio/src init.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2004-08-30 19:06:44
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1143 Modified Files: init.c Log Message: Kevin Pedretti says x86-64 build complained about int/long assignments and compares. This should fix it. Index: init.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/init.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -w -b -B -p -r1.13 -r1.14 --- init.c 27 Jul 2004 15:00:43 -0000 1.13 +++ init.c 30 Aug 2004 19:06:34 -0000 1.14 @@ -557,27 +557,39 @@ do_open(char *args) { NULL, NULL } }; char *cp; + long l; int fd; + unsigned long ul; mode_t m; struct pnode *dir, *pno; struct intent intent; int err; struct file *fil; +/* + * Check if long overflows integer range. + */ +#if LONG_MAX <= INT_MAX +#define _irecheck(_l, _e) \ + ((_l) == LONG_MAX && (_e) == ERANGE) +#else +#define _irecheck(_l, _e) \ + ((_l) > INT_MAX) +#endif + len = strlen(args); if (get_args(args, v) - args != (ssize_t )len || !(v[0].value && v[1].value && v[2].value)) return -EINVAL; - fd = strtol(v[1].value, (char **)&cp, 0); - if (*cp || - (((fd == LONG_MIN || fd == LONG_MAX) && errno == ERANGE)) || - fd < 0) + l = strtol(v[1].value, (char **)&cp, 0); + if (*cp || l < 0 || _irecheck(l, errno)) return -EINVAL; - m = strtoul(v[1].value, (char **)&cp, 0); + fd = (int )l; + ul = strtoul(v[1].value, (char **)&cp, 0); if (*cp || - (m == LONG_MAX && errno == ERANGE)) + (ul == ULONG_MAX && errno == ERANGE)) return -EINVAL; - m &= O_RDONLY|O_WRONLY|O_RDWR; + m = (mode_t )ul & (O_RDONLY|O_WRONLY|O_RDWR); if (!(dir = _sysio_cwd) && !(dir = _sysio_root)) return -ENOENT; @@ -607,6 +619,8 @@ do_open(char *args) if (pno) P_RELE(pno); return err; + +#undef _irecheck } /* |