diff --git a/headers/os/storage/Query.h b/headers/os/storage/Query.h index fff4c7522d..5201acb4a0 100644 --- a/headers/os/storage/Query.h +++ b/headers/os/storage/Query.h @@ -63,6 +63,7 @@ public: status_t SetVolume(const BVolume* volume); status_t SetPredicate(const char* expression); status_t SetTarget(BMessenger messenger); + void SetFlags(uint32 flags); bool IsLive() const; @@ -102,7 +103,7 @@ private: BPrivate::Storage::QueryStack* fStack; char* fPredicate; dev_t fDevice; - bool fLive; + uint32 fFlags; port_id fPort; long fToken; int fQueryFd; diff --git a/src/kits/storage/Query.cpp b/src/kits/storage/Query.cpp index 9a93487105..84b9b3bf99 100644 --- a/src/kits/storage/Query.cpp +++ b/src/kits/storage/Query.cpp @@ -39,7 +39,7 @@ BQuery::BQuery() fStack(NULL), fPredicate(NULL), fDevice((dev_t)B_ERROR), - fLive(false), + fFlags(0), fPort(B_ERROR), fToken(0), fQueryFd(-1) @@ -71,7 +71,7 @@ BQuery::Clear() fPredicate = NULL; // reset the other parameters fDevice = (dev_t)B_ERROR; - fLive = false; + fFlags = 0; fPort = B_ERROR; fToken = 0; return error; @@ -226,17 +226,23 @@ BQuery::SetTarget(BMessenger messenger) fPort = messengerPrivate.Port(); fToken = (messengerPrivate.IsPreferredTarget() ? -1 : messengerPrivate.Token()); - fLive = true; } return error; } +void +BQuery::SetFlags(uint32 flags) +{ + fFlags = flags; +} + + // Gets whether the query associated with this object is live. bool BQuery::IsLive() const { - return fLive; + return fPort >= 0; } @@ -310,14 +316,14 @@ BQuery::Fetch() BString parsedPredicate; _ParseDates(parsedPredicate); - fQueryFd = _kern_open_query(fDevice, parsedPredicate.String(), - parsedPredicate.Length(), fLive ? B_LIVE_QUERY : 0, fPort, fToken); + fQueryFd = _kern_open_query(fDevice, + parsedPredicate.String(), parsedPredicate.Length(), + fFlags | ((fPort >= 0) ? B_LIVE_QUERY : 0), + fPort, fToken); if (fQueryFd < 0) return fQueryFd; - // set close on exec flag fcntl(fQueryFd, F_SETFD, FD_CLOEXEC); - return B_OK; }