[Mono-bugs] [Bug 38219][Nor] Changed - Issues with returning a pointer to a structure from P/Invoke

bugzilla-daemon@rocky.ximian.com bugzilla-daemon@rocky.ximian.com
Tue, 25 Feb 2003 07:30:08 -0500 (EST)

Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by lupus@ximian.com.


--- shadow/38219	Mon Feb 17 23:07:36 2003
+++ shadow/38219.tmp.24112	Tue Feb 25 07:30:08 2003
@@ -1,23 +1,23 @@
 Bug#: 38219
 Product: Mono/Runtime
 Version: unspecified
+OS: unknown
 OS Details: 
 Status: NEW   
+Severity: Unknown
 Priority: Normal
 Component: misc
 AssignedTo: mono-bugs@ximian.com                            
 ReportedBy: alp@atoker.com               
 QAContact: mono-bugs@ximian.com
 TargetMilestone: ---
-Summary: Marshalling a struct of char* fails
+Summary: Issues with returning a pointer to a structure from P/Invoke
 This attempt to marshal a struct containing char* pointers runs but returns
 garbage instead of the expected text fields from /etc/passwd. The struct is
 defined in pwd.h as:
 /* The passwd structure.  */
@@ -69,6 +69,32 @@
 		p = getpwuid (getuid ());
 		Console.WriteLine (p.pw_name);
 		Console.WriteLine (p.pw_uid);
 		Console.WriteLine (p.pw_gecos);
+------- Additional Comments From lupus@ximian.com  2003-02-25 07:30 -------
+The code cannot work, because getpwuid() returns a pointer to a
+structure, while the method signature makes it return the structure.
+The simple way to implement this is:
+	[DllImport("libc.so.6")]
+	static extern IntPtr getpwuid (uint uid);
+	passwd p;
+	IntPtr v;
+	v = getpwuid (getuid ());
+	p = (passwd)Marshal.PtrToStructure (v, typeof (passwd));
+The variant that uses:
+	[DllImport("libc.so.6")]
+	static extern passwd* getpwuid (uint uid);
+	passwd p;
+	p = *getpwuid (getuid ());
+doesn't work in mono and this is the reason I'm leaving the bug open.
+Note I'm not sure this variant is supposed to work, anyway.
+We'd need to write tests and see what the MS runtime does in this case.