[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Porting issues...



Marcus Brinkmann <Marcus.Brinkmann@ruhr-uni-bochum.de> writes:

> It would be good if people who solved a common problem they encountered in 
> porting an application would send me a small html text I can include on this
> page.

Here are two examples of fixing MAXHOSTNAME problems:

<p>
If the code you want to port, uses a static buffer of size <em>MAXHOSTNAME</em>
<pre>
char hostname[MAXHOSTNAME];
...
if (gethostname(hostname, MAXHOSTNAME) &lt; 0) {
  /* error handling */
  ...
}
</pre>
you should replace that with a dynamic buffer that is expanded until
the hostname fits.
<pre>
char *hostname;
size_t hostname_size = 100;
...
if ((hostname = (char *)malloc(hostname_size)) == NULL) {
  /* handle out of memory */
  ...
}
while (gethostname(hostname, hostname_size) &lt; 0) {
  if (errno != ENAMETOOLONG) {
    /* error handling */
    ...
    break;
  }
  /* else: try again with bigger buffer */
  hostname_size &lt;&lt;= 1;
  if ((hostname = (char *)realloc(hostname, hostname_size)) == NULL) {
    /* handle out of memory */
    ...
    break;
  }
}
...
/* don't forget to free hostname on all return paths! */
free(hostname);
</pre>
</p>
<p>
Another usage of <em>MAXHOSTNAME</em> is for buffers filled with info
from <em>gethostby...()</em>:
<pre>
struct hostent *ent;
char peer[MAXHOSTNAME];
...
/* gethostbyaddr or similar is used to fill ent */
...
strcpy(peer, ent-&gt;h_name);
</pre>
this should be also changed to dynamic allocation:
<pre>
struct hostent *ent;
char *peer;
...
/* gethostbyaddr or similar is used to fill ent */
...
if ((peer = strdup(ent-&gt;h_name)) == NULL) {
  /* handle out of memory */
  ...
}
...
/* again, don't forget to free peer in any case */
free(peer);
</pre>
</p>

-- 
Robbe

Attachment: signature.ng
Description: PGP signature


Reply to: