I have seen this in other platforms, typically this f(x) returns an address 
in a static chunk of memory allocated
by the called f(x) [NOT the calling f(x)].  So the calling app should not 
free() it.  Look into the memory mgmt and how this f(x) and app is 
implemented.




----- Original Message ----- 
From: "bobstay" <[email protected]>
To: "Android Discuss" <[email protected]>
Sent: Thursday, October 08, 2009 10:01 AM
Subject: [android-discuss] Re: Resolving remote hostname .. !



For reference, I am also seeing this problem and have reproduced it
with the two very simple programs below (a.c, and b.c correspond to A
and B as mentioned in CodePupil's post):

/* a.c */
#include <unistd.h>
#include <stdio.h>

int main(int argc, char** argv)
{
        printf("a running\n");
        execve("b", argv, NULL);
}


/* b.c */
#include <stdio.h>
#include <netdb.h>
#include <errno.h>
#include <netinet/in.h>

int main()
{
        struct hostent* h;
        struct in_addr* address;
        extern int h_errno;

        printf("b running\n");

        h = gethostbyname("www.google.com");

        printf("_errno = %d\n", errno);
        printf("h_errno = %d\n", h_errno);
        if(h == NULL) {
                printf("gethostbyname returned NULL\n");
        }
        else {
                address = (struct in_addr*)h->h_addr;
                printf("IP address: %s\n", inet_ntoa(* address));
        }
}

The output is as follows:

# ./b
b running
_errno = 0
h_errno = 0
IP address: 209.85.229.106

# ./a
a running
b running
_errno = 111
h_errno = 2
gethostbyname returned NULL


On 25 Sep, 20:27, CodePupil <[email protected]> wrote:
> Hi All,
>
> Could anybody throw some light on the issue ?
>
> Thanks!
>
> On Sep 20, 11:05 pm, CodePupil <[email protected]> wrote:
>
> > Could someone please look into the issue and let me know if it's a
> > limitation ofAndroidplatform(It shouldn't be though) .. ?
>
> > Thanks!
>
> > On Sep 16, 6:56 pm, CodePupil <[email protected]> wrote:
>
> > > Here is the discussion between me and David but still solution is out
> > > of reach !! :(
>
> > > ###########################################################################
> > >  
> > > #
>
> > > Hi,
>
> > > h_errno has the value "TRY_AGAIN" aftergethostbyname() returns NULL.
>
> > > h_errno suggets "
> > > A temporary error occurred on an authoritative name server. Try again
> > > later !!
> > > "
>
> > > Thanks!
>
> > > => On Tue, Sep 15, 2009 at 5:24 AM, David Turner <[email protected]>
> > > wrote:
>
> > > Try readinf the value of the h_errno variable aftergethostbyname()
> > > returns NULL.
> > > You might also want to try getaddrinfo() which also allows you to
> > > perform DNS resolution (though with a difference interface)
> > > and see if it changes anything.
>
> > > There is a chance that you're encoutering a subtle bug in the DNS
> > > resolver implementation. Can you provide two short
> > > source files that reproduce the problem?
>
> > > => On Mon, Sep 14, 2009 at 11:29 AM, murlivala <[email protected]>
> > > wrote:
>
> > > But A itself is launched from shell and both A and B are native code !
> > > Since A and B are both written in Native code, B alone is able to
> > > work.
> > > I'm quite curious that What difference execve() can make which is used
> > > in the app A ?
> > > I'm not getting any exception, but NULL which is returned by
> > > gethostname() in B after being executed from A using execve() .. !
>
> > > Thanks!
>
> > > =>On Mon, Sep 14, 2009 at 10:25 PM, David Turner <[email protected]>
> > > wrote:
>
> > > My understanding is that B is not a realAndroidapplication, just a
> > > native executable that happens to be installed.
>
> > > When you launch B from an adb shell, you're doing it from the "shell"
> > > user/group ID I believe.
> > > When you launch it from application A, you launch it from A's own
> > > userId/groupId which has less permission that the shell one.
>
> > > the kernel controls permissions based on the UID/GID of processes.
>
> > > =>On Mon, Sep 14, 2009 at 8:03 AM, CodePupil <[email protected]>
> > > wrote:
>
> > > Hi,
>
> > > Thanks for the reply but still there is a room for appropriate
> > > explanation(s).
> > > First let me clarify the problem:
>
> > > Suppose I have test app A which triggers the application B which needs
> > > to resolve the remote hostname.
> > > Now when I execute B directly from the shell, it works fine.
> > > When B is triggered by A using execve(), It fails.
>
> > > If this fails due to less permissions(may be), I don't be able to
> > > understand How could it be?
> > > If I execute both the apps(A and B)from shell(from # prompt), both
> > > should have same permissions.
> > > Either both should work or should simply fail.
>
> > > DoesAndroidsystem itself decide to execute the app giving it less
> > > permissions if that app is triggerred using execve() call ?
>
> > > One more thing, If I triggerred my app using system() call, it works
> > > FINE !
> > > So now, scene is like this:
>
> > > If B is executed itself
> > > # ./B
> > > Result -> Works
>
> > > If B is executed by A using system() call
> > > # ./A
> > > Result -> Works
>
> > > If B is executed by A using execve() call
> > > # ./A
> > > Result -> Doesn't work -> ??
>
> > > Looking for better explanation(s) !
>
> > > Thanks!
>
> > > ###########################################################################
> > >  
> > > #
>
> > > On Sep 14, 6:10 pm, David Turner <[email protected]> wrote:
>
> > > > On Mon, Sep 14, 2009 at 6:06 AM, lbcoder <[email protected]> wrote:
>
> > > > > There are two DNS sets on anandroiddevice.
> > > > > The "linux" set and the "android" set.
> > > > > You can find the DNS servers used by linux by checking the 
> > > > > contents
> > > > > of /etc/resolv.conf
> > > > > Theandroiddns servers can be found by "getprop".
> > > > > They do not match.
> > > > > Theandroiddns servers are set by dhcp.
> > > > > The linux dns servers are more like fallbacks and are set 
> > > > > statically.
>
> > > > This is correct, but it's only an implementation detail that should 
> > > > not
> > > > affect typical application developers (even the C library DNS 
> > > > resolver uses
> > > > the
> > > > system properties to know which DNS servers to talk to), so there 
> > > > should be
> > > > no difference between native and VM code when it comes to DNS 
> > > > resolution.
>
> > > > > On Sep 14, 2:56 am, CodePupil <[email protected]> wrote:
> > > > > > Hi All,
>
> > > > > > I'm facing strange problem in resolving remote hostname.
> > > > > > I have an application which needs to resolve some remote 
> > > > > > hostname in
> > > > > > order to connect to it, and If I start this application using 
> > > > > > execve()
> > > > > > call, the application doesn't resolve hostname,gethostbyname()
> > > > > > returns NULL. If I execute the application directly, it's able 
> > > > > > to
> > > > > > resolve the host name but if it's executed using execve() call, 
> > > > > > it
> > > > > > doesn't.
> > > > > > Same approach is working fine on Linux machine but 
> > > > > > onAndroidplatform
> > > > > > it's not able to work.
>
> > > > > > On Linux:
> > > > > > execve() -----> application() ------> Works
> > > > > > app() -----> Works
>
> > > > > > OnAndroid:
> > > > > > execve() -----> application() ------> Doesn't works -------> ???
> > > > > > app() -----> Works
>
> > > > > ___________________________________________________________________________
> > > > >  
> > > > >  ­____
>
> > > > > > Could anybody please throw some light on the matter ?
>
> > > > > > Thanks!- Hide quoted text -
>
> > > > - Show quoted text -



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Android Discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/android-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to