19 messages in net.java.dev.jna.usersRe: Identifying symbolic links on Mac...
FromSent OnAttachments
Timothy WallDec 11, 2007 5:34 am 
Normen MüllerDec 11, 2007 6:35 am 
Normen MüllerDec 11, 2007 6:52 am 
Timothy WallDec 11, 2007 7:20 am 
Timothy WallDec 11, 2007 7:53 am 
Timothy WallDec 11, 2007 7:55 am 
Nikolas LotzDec 11, 2007 8:05 am 
Normen MüllerDec 11, 2007 8:27 am 
Normen MüllerDec 11, 2007 8:37 am 
Timothy WallDec 11, 2007 10:25 am 
Duncan McGregorDec 11, 2007 3:05 pm 
Normen MüllerDec 12, 2007 12:04 am 
Peter ReillyDec 12, 2007 1:34 am 
Normen MüllerDec 12, 2007 1:39 am 
Timothy WallDec 12, 2007 4:34 am 
Timothy WallDec 12, 2007 4:38 am 
Normen MüllerDec 12, 2007 4:57 am 
Normen MüllerDec 12, 2007 5:04 am 
Timothy WallDec 12, 2007 5:36 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: Identifying symbolic links on Mac OSX 10.5.1Actions...
From:Normen Müller (n.mu@jacobs-university.de)
Date:Dec 11, 2007 8:37:33 am
List:net.java.dev.jna.users

Ok, first I looked at /Developer/SDKs/MacOSX10.5.sdk/usr/include/ sys/ , but, although they are not linked, it seems like the files are equal to /usr/include/sys/

I will add some snippets out of /usr/include/sys/stat.h, maybe you could help me on how to clean up the code:

[...] /* * This structure is used as the second parameter to the fstat64(), * lstat64(), and stat64() functions, and for struct stat when * __DARWIN_64_BIT_INO_T is set. __DARWIN_STRUCT_STAT64 is defined * above, depending on whether we use struct timespec or the direct * components. * * This is simillar to stat except for 64bit inode number * number instead of 32bit ino_t and the addition of create(birth) time. */ #define __DARWIN_STRUCT_STAT64 { \ dev_t st_dev; /* [XSI] ID of device containing file */ \ mode_t st_mode; /* [XSI] Mode of file (see below) */ \ nlink_t st_nlink; /* [XSI] Number of hard links */ \ __darwin_ino64_t st_ino; /* [XSI] File serial number */ \ uid_t st_uid; /* [XSI] User ID of the file */ \ gid_t st_gid; /* [XSI] Group ID of the file */ \ dev_t st_rdev; /* [XSI] Device ID */ \ __DARWIN_STRUCT_STAT64_TIMES \ off_t st_size; /* [XSI] file size, in bytes */ \ blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ \ blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ \ __uint32_t st_flags; /* user defined flags for file */ \ __uint32_t st_gen; /* file generation number */ \ __int32_t st_lspare; /* RESERVED: DO NOT USE! */ \ __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ \ }

/* * [XSI] This structure is used as the second parameter to the fstat(), * lstat(), and stat() functions. */ #if __DARWIN_64_BIT_INO_T

struct stat __DARWIN_STRUCT_STAT64;

#else /* !__DARWIN_64_BIT_INO_T */

struct stat { dev_t st_dev; /* [XSI] ID of device containing file */ ino_t st_ino; /* [XSI] File serial number */ mode_t st_mode; /* [XSI] Mode of file (see below) */ nlink_t st_nlink; /* [XSI] Number of hard links */ uid_t st_uid; /* [XSI] User ID of the file */ gid_t st_gid; /* [XSI] Group ID of the file */ dev_t st_rdev; /* [XSI] Device ID */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) struct timespec st_atimespec; /* time of last access */ struct timespec st_mtimespec; /* time of last data modification */ struct timespec st_ctimespec; /* time of last status change */ #else time_t st_atime; /* [XSI] Time of last access */ long st_atimensec; /* nsec of last access */ time_t st_mtime; /* [XSI] Last data modification time */ long st_mtimensec; /* last data modification nsec */ time_t st_ctime; /* [XSI] Time of last status change */ long st_ctimensec; /* nsec of last status change */ #endif off_t st_size; /* [XSI] file size, in bytes */ blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ __uint32_t st_flags; /* user defined flags for file */ __uint32_t st_gen; /* file generation number */ __int32_t st_lspare; /* RESERVED: DO NOT USE! */ __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ };

#endif /* __DARWIN_64_BIT_INO_T */

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)

struct stat64 __DARWIN_STRUCT_STAT64;

#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */

[...]

#ifndef S_IFMT /* File type */ #define S_IFMT 0170000 /* [XSI] type of file mask */ #define S_IFIFO 0010000 /* [XSI] named pipe (fifo) */ #define S_IFCHR 0020000 /* [XSI] character special */ #define S_IFDIR 0040000 /* [XSI] directory */ #define S_IFBLK 0060000 /* [XSI] block special */ #define S_IFREG 0100000 /* [XSI] regular */ #define S_IFLNK 0120000 /* [XSI] symbolic link */ #define S_IFSOCK 0140000 /* [XSI] socket */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) #define S_IFWHT 0160000 /* whiteout */ #define S_IFXATTR 0200000 /* extended attribute */ #endif

So as far as I can see the used constant in SVNKit are alright and the used offset as well, but there must be something else, cause it still doesn't work.

But, as I don't want to get on your nerves, do you have any further suggestions on how I can fix this code? Maybe you can teach me how to define the stat structure in Java, cause I guess than I don't need this offset-thing, right?

Cheers, /nm

On Dec 11, 2007, at 4:20 PM, Timothy Wall wrote:

try "cat /usr/include/sys/stat.h", which is where the function is declared.

On Dec 11, 2007, at 9:52 AM, Normen Müller wrote:

On Dec 11, 2007, at 2:34 PM, Timothy Wall wrote:

Several things to look at: 1) how is the C library loaded? is it loaded properly on OSX (i.e. do you get an instance of ISVNCLibrary)? 2) how is lstat defined on OSX 10.5.1? in glibc, it is a macro that points to _xstat

All I could find is:
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/lstat.2.html

/nm

I would recommend writing a small unit test program that reproduces the SVNKit code, then you can instrument it as needed to figure out where it is failing.

On Dec 11, 2007, at 7:12 AM, Normen Müller wrote:

Dear JNA developers,

could you point me to an example on how to identifying symbolic links on Mac OS 10.5.1?

Currently I am using SVNKit@HEAD which pointed my to your library. In SVNKit there is a function for identifying file types, but on my Mac OS X 10.5.1 it always returns null, no matter if I commit a symbolic link to a directory or to a file.

Do you have any ideas how to fix this?

In the following is a copy of getFileType function out of the SVNKit library:

public static SVNFileType getFileType(File file) { if (file == null || ourSharedMemory == null) { return null; } String path = file.getAbsolutePath(); if (path.endsWith("/") && path.length() > 1) { path = path.substring(0, path.length() - 1); } try { ISVNCLibrary cLibrary = JNALibraryLoader.getCLibrary(); if (cLibrary == null) { return null; } synchronized (ourSharedMemory) { ourSharedMemory.clear(); int rc; synchronized (cLibrary) { rc = SVNFileUtil.isOSX || SVNFileUtil.isBSD ? cLibrary.lstat(path, ourSharedMemory) : cLibrary.__lxstat64(0, path, ourSharedMemory); } if (rc < 0) { if (file.exists() || file.isDirectory() || file.isFile()) { return null; } return SVNFileType.NONE; } int mode = SVNFileUtil.isOSX || SVNFileUtil.isBSD ? ourSharedMemory.getInt(8) : ourSharedMemory.getInt(16); int type = mode & 0170000; if (type == 0120000) { return SVNFileType.SYMLINK; } else if (type == 0040000) { return SVNFileType.DIRECTORY; } else if (type == 0100000) { return SVNFileType.FILE; } else { if (file.exists() || file.isDirectory() || file.isFile()) { return null; } return SVNFileType.NONE; } } } catch (Throwable th) { // } return null; }

I would appreciate your help, /nm