2014-05-05 21:30:43 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
1999-12-04 04:13:44 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Implementation of nsIFile for ``Unixy'' systems.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _nsLocalFileUNIX_H_
|
|
|
|
#define _nsLocalFileUNIX_H_
|
|
|
|
|
|
|
|
#include <sys/stat.h>
|
2004-04-16 23:46:05 +04:00
|
|
|
#include <sys/types.h>
|
2002-01-27 20:31:24 +03:00
|
|
|
#include <unistd.h>
|
|
|
|
|
1999-12-04 04:13:44 +03:00
|
|
|
#include "nscore.h"
|
2002-04-27 09:33:09 +04:00
|
|
|
#include "nsString.h"
|
|
|
|
#include "nsReadableUtils.h"
|
2005-11-18 17:18:49 +03:00
|
|
|
#include "nsIHashable.h"
|
2007-07-25 20:53:37 +04:00
|
|
|
#include "nsIClassInfoImpl.h"
|
2012-06-06 03:51:58 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2011-10-14 19:43:35 +04:00
|
|
|
#ifdef MOZ_WIDGET_COCOA
|
2010-07-22 07:25:24 +04:00
|
|
|
#include "nsILocalFileMac.h"
|
|
|
|
#endif
|
1999-12-04 04:13:44 +03:00
|
|
|
|
2014-05-05 21:30:43 +04:00
|
|
|
/**
|
2002-01-27 20:46:14 +03:00
|
|
|
* we need these for statfs()
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_SYS_STATVFS_H
|
2014-05-05 21:30:43 +04:00
|
|
|
#if defined(__osf__) && defined(__DECCXX)
|
|
|
|
extern "C" int statvfs(const char *, struct statvfs *);
|
|
|
|
#endif
|
|
|
|
#include <sys/statvfs.h>
|
2002-01-27 20:46:14 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_STATFS_H
|
2014-05-05 21:30:43 +04:00
|
|
|
#include <sys/statfs.h>
|
2002-01-27 20:46:14 +03:00
|
|
|
#endif
|
|
|
|
|
2012-08-30 01:00:10 +04:00
|
|
|
#ifdef HAVE_SYS_VFS_H
|
2014-05-05 21:30:43 +04:00
|
|
|
#include <sys/vfs.h>
|
2012-08-30 01:00:10 +04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_MOUNT_H
|
2014-05-05 21:30:43 +04:00
|
|
|
#include <sys/param.h>
|
|
|
|
#include <sys/mount.h>
|
2012-08-30 01:00:10 +04:00
|
|
|
#endif
|
|
|
|
|
2012-08-30 01:00:10 +04:00
|
|
|
#if defined(HAVE_STATVFS64) && (!defined(LINUX) && !defined(__osf__))
|
2014-05-05 21:30:43 +04:00
|
|
|
#define STATFS statvfs64
|
|
|
|
#define F_BSIZE f_frsize
|
2012-08-30 01:00:10 +04:00
|
|
|
#elif defined(HAVE_STATVFS) && (!defined(LINUX) && !defined(__osf__))
|
2014-05-05 21:30:43 +04:00
|
|
|
#define STATFS statvfs
|
|
|
|
#define F_BSIZE f_frsize
|
2012-08-30 01:00:10 +04:00
|
|
|
#elif defined(HAVE_STATFS64)
|
2014-05-05 21:30:43 +04:00
|
|
|
#define STATFS statfs64
|
|
|
|
#define F_BSIZE f_bsize
|
2012-08-30 01:00:10 +04:00
|
|
|
#elif defined(HAVE_STATFS)
|
2014-05-05 21:30:43 +04:00
|
|
|
#define STATFS statfs
|
|
|
|
#define F_BSIZE f_bsize
|
2002-01-27 20:46:14 +03:00
|
|
|
#endif
|
|
|
|
|
2013-10-09 10:01:27 +04:00
|
|
|
// stat64 and lstat64 are deprecated on OS X. Normal stat and lstat are
|
|
|
|
// 64-bit by default on OS X 10.6+.
|
2015-02-04 18:49:45 +03:00
|
|
|
#if defined(HAVE_STAT64) && defined(HAVE_LSTAT64) && !defined(XP_DARWIN)
|
2014-05-05 21:30:43 +04:00
|
|
|
#if defined (AIX)
|
|
|
|
#if defined STAT
|
|
|
|
#undef STAT
|
2010-03-15 04:43:16 +03:00
|
|
|
#endif
|
2014-05-05 21:30:43 +04:00
|
|
|
#endif
|
|
|
|
#define STAT stat64
|
|
|
|
#define LSTAT lstat64
|
|
|
|
#define HAVE_STATS64 1
|
2009-04-16 16:09:21 +04:00
|
|
|
#else
|
2014-05-05 21:30:43 +04:00
|
|
|
#define STAT stat
|
|
|
|
#define LSTAT lstat
|
2009-04-16 16:09:21 +04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
class nsLocalFile final
|
2011-10-14 19:43:35 +04:00
|
|
|
#ifdef MOZ_WIDGET_COCOA
|
2014-05-15 00:15:46 +04:00
|
|
|
: public nsILocalFileMac
|
2010-07-22 07:25:24 +04:00
|
|
|
#else
|
2014-05-15 00:15:46 +04:00
|
|
|
: public nsILocalFile
|
2010-07-22 07:25:24 +04:00
|
|
|
#endif
|
2014-05-15 00:15:46 +04:00
|
|
|
, public nsIHashable
|
1999-12-04 04:13:44 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-05-05 21:30:43 +04:00
|
|
|
NS_DEFINE_STATIC_CID_ACCESSOR(NS_LOCAL_FILE_CID)
|
|
|
|
|
|
|
|
nsLocalFile();
|
1999-12-04 04:13:44 +03:00
|
|
|
|
2014-05-15 00:15:46 +04:00
|
|
|
static nsresult nsLocalFileConstructor(nsISupports* aOuter,
|
|
|
|
const nsIID& aIID,
|
|
|
|
void** aInstancePtr);
|
1999-12-04 04:13:44 +03:00
|
|
|
|
2014-05-05 21:30:43 +04:00
|
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
|
|
NS_DECL_NSIFILE
|
|
|
|
NS_DECL_NSILOCALFILE
|
2011-10-14 19:43:35 +04:00
|
|
|
#ifdef MOZ_WIDGET_COCOA
|
2014-05-05 21:30:43 +04:00
|
|
|
NS_DECL_NSILOCALFILEMAC
|
2010-07-22 07:25:24 +04:00
|
|
|
#endif
|
2014-05-05 21:30:43 +04:00
|
|
|
NS_DECL_NSIHASHABLE
|
2005-11-18 17:18:49 +03:00
|
|
|
|
2002-04-27 09:33:09 +04:00
|
|
|
public:
|
2014-05-05 21:30:43 +04:00
|
|
|
static void GlobalInit();
|
|
|
|
static void GlobalShutdown();
|
2002-04-27 09:33:09 +04:00
|
|
|
|
2003-07-19 02:14:16 +04:00
|
|
|
private:
|
2014-05-15 00:15:46 +04:00
|
|
|
nsLocalFile(const nsLocalFile& aOther);
|
|
|
|
~nsLocalFile()
|
|
|
|
{
|
|
|
|
}
|
2003-07-19 02:14:16 +04:00
|
|
|
|
1999-12-04 04:13:44 +03:00
|
|
|
protected:
|
2014-05-05 21:30:43 +04:00
|
|
|
// This stat cache holds the *last stat* - it does not invalidate.
|
|
|
|
// Call "FillStatCache" whenever you want to stat our file.
|
|
|
|
struct STAT mCachedStat;
|
|
|
|
nsCString mPath;
|
2002-04-27 09:33:09 +04:00
|
|
|
|
2014-05-15 00:15:46 +04:00
|
|
|
void LocateNativeLeafName(nsACString::const_iterator&,
|
|
|
|
nsACString::const_iterator&);
|
2002-04-27 09:33:09 +04:00
|
|
|
|
2014-05-15 00:15:46 +04:00
|
|
|
nsresult CopyDirectoryTo(nsIFile* aNewParent);
|
|
|
|
nsresult CreateAllAncestors(uint32_t aPermissions);
|
|
|
|
nsresult GetNativeTargetPathName(nsIFile* aNewParent,
|
|
|
|
const nsACString& aNewName,
|
|
|
|
nsACString& aResult);
|
2002-04-27 09:33:09 +04:00
|
|
|
|
2014-05-05 21:30:43 +04:00
|
|
|
bool FillStatCache();
|
2002-04-30 03:35:18 +04:00
|
|
|
|
2014-05-15 00:15:46 +04:00
|
|
|
nsresult CreateAndKeepOpen(uint32_t aType, int aFlags,
|
|
|
|
uint32_t aPermissions, PRFileDesc** aResult);
|
1999-12-04 04:13:44 +03:00
|
|
|
};
|
Fixes to use atomic rename(2) if possible in nsLocalFile::MoveTo (33098, r=?),
plus a bunch of other fixes and cleanups:
- Fix comment misstatements of fact in nsIFile.idl, improve style slightly.
- Fix typo in comment in nsILocalFile.idl.
- Avoid gratuitous nsCString and nsXPIDLCString copy-constructions, which
entail malloc'ing, in nsLocalFileUnix.cpp's CopyTo and GetParent methods.
But do use nsXPIDLCString instead of raw nsMemory::Alloc/Free.
- Get rid of unnecessary mLL_II2L and mLL_L2II macros, use "prlong.h" API only.
Also use the LL_* macros consistently in case a Unix lacking long long type
support wants to use this code.
* BTW, the "Date" methods should be renamed to use "Time" instead -- after all
PRTime is the type, and traditionally "time" refers to the time-number, a
scalar independent of one's position on the surface of the earth, while
"date" refers to a struct full of locale-specific information derived from
time and some "environment" variables such as DST. Can we rename these
nsIFile methods before Mozilla 0.9 / Netscape 6?
- Use CHECK_mPath consistently and first, before any assertions relating to
arguments (which logically come after the 'this' parameter CHECK_mPath is
making assertions about).
- Use nsCOMPtr for singly-inheriting implementations of XPCOM interfaces, to
avoid scary-when-scaled 0-refcnt instances from being handled (these all
got a ref via QI or equivalent soon enough, but you never know). This also
removed some naked deletes.
- Canonize all paths copied into mPath to lack trailing slashes, so we don't
need to strip trailing slashes elsewhere, in higher-frequency methods (you
set path less often than you get it or a substring of it).
- ssize_t for strlen return values.
- Since shaver used a function pointer to consolidate creat/mkdir logic, but
didn't fold the necessary close of the new fd returned by non-failing creat
into the pointed-at function, I did that.
- AppendRelativePath forbids .. as a component (bounded by / or beginning or
end of string on either side), not just in the middle of fragment (so that
foo..bar is not an illegal relative pathname -- it should not be). BTW,
what the heck is the difference between NS_ERROR_FILE_UNRECOGNIZED_PATH and
...INVALID_PATH?
- SetLeafName was overallocating the new pathname buffer by failing to subtract
the old leafname's length.
- CopyTo was failing to return an NSRESULT_FOR_ERRNO(), it just called that
macro on a line by itself -- eek! It also contained redundant if (newFD
== nsnull) {...} cleanup code, it did a useless PR_GetFileInfo call, and it
leaked FDs on read or write error.
- Implemented CopyToFollowingLinks as a forwarded call to CopyTo, Unix does
not support "copying" a symlink via normal file i/o. Should we instead
lstat in CopyTo and if a link is the source of the copy, do readlink and
then symlink?
- Fixed the readlink method (GetTarget) to null-terminate the link string in
the out parameter (readlink does not do that for you).
- Lots of little nsnull vs. NULL vs. 0, == and != applied to boolean or null
literals, white-space, indentation, bracing, comment, and sloppy code order
(e.g., declaring an initialized variable that's not used till after early
returns) fixes. Also invert some return logic so that NS_OK is the normal,
least indented, final return.
2000-09-19 04:22:41 +04:00
|
|
|
|
1999-12-04 04:13:44 +03:00
|
|
|
#endif /* _nsLocalFileUNIX_H_ */
|