diff options
Diffstat (limited to 'libnetfs/io-seek.c')
-rw-r--r-- | libnetfs/io-seek.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/libnetfs/io-seek.c b/libnetfs/io-seek.c index 55d924c8..85408a4d 100644 --- a/libnetfs/io-seek.c +++ b/libnetfs/io-seek.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 2000, 2006 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. This file is part of the GNU Hurd. @@ -28,36 +28,41 @@ netfs_S_io_seek (struct protid *user, int whence, off_t *newoffset) { - error_t err; + error_t err = 0; if (!user) return EOPNOTSUPP; - mutex_lock (&user->po->np->lock); switch (whence) { - case SEEK_SET: - err = 0; - user->po->filepointer = offset; - break; - case SEEK_CUR: - err = 0; - user->po->filepointer += offset; - break; - + offset += user->po->filepointer; + goto check; case SEEK_END: - err = netfs_validate_stat (user->po->np, user->credential); - if (!err) - user->po->filepointer = user->po->np->nn_stat.st_size + offset; - break; - + { + struct node *np; + + np = user->po->np; + mutex_lock (&np->lock); + + err = netfs_validate_stat (np, user->user); + if (!err) + offset += np->nn_stat.st_size; + + mutex_unlock (&np->lock); + } + case SEEK_SET: + check: + if (offset >= 0) + { + *newoffset = user->po->filepointer = offset; + break; + } default: err = EINVAL; break; } - *newoffset = user->po->filepointer; - mutex_unlock (&user->po->np->lock); + return err; } |