On Thu, Jan  6, 2011 at 17:28:59 -0500, Adam Jackson wrote:

> diff --git a/os/connection.c b/os/connection.c
> index 5580fab..8fb8c36 100644
> --- a/os/connection.c
> +++ b/os/connection.c
> @@ -145,6 +145,7 @@ Bool AnyClientsWriteBlocked;      /* true if some client 
> blocked on write */
>  static Bool RunFromSmartParent;      /* send SIGUSR1 to parent process */
>  Bool RunFromSigStopParent;   /* send SIGSTOP to our own process; Upstart (or
>                                  equivalent) will send SIGCONT back. */
> +static char dynamic_display[7];
>  Bool PartialNetwork; /* continue even if unable to bind all addrs */
>  static Pid_t ParentProcess;
>  
> @@ -356,11 +357,25 @@ NotifyParentProcess(void)
>           kill (ParentProcess, SIGUSR1);
>       }
>      }
> +    if (dynamic_display[0])
> +     write(displayfd, dynamic_display, strlen(dynamic_display));
>      if (RunFromSigStopParent)
>       raise (SIGSTOP);
>  #endif
>  }
>  
> +static Bool
> +TryCreateSocket(int num, int *partial)
> +{
> +    char port[20];
> +
> +    sprintf(port, "%d", num);
> +
> +    return _XSERVTransMakeAllCOTSServerListeners(port, partial,
> +                                              &ListenTransCount,
> +                                              &ListenTransConns);

Cast from int to Bool, _XSERVTransMakeAllCOTSServerListeners seems to
return 0 on success, I guess this should return
_XSERVTransMakeAllCOTSServerListeners() >= 0?

> +}
> +
>  /*****************
>   * CreateWellKnownSockets
>   *    At initialization, create the sockets to listen on for new clients.
> @@ -371,7 +386,6 @@ CreateWellKnownSockets(void)
>  {
>      int              i;
>      int              partial;
> -    char     port[20];
>  
>      FD_ZERO(&AllSockets);
>      FD_ZERO(&AllClients);
> @@ -386,32 +400,44 @@ CreateWellKnownSockets(void)
>  
>      FD_ZERO (&WellKnownConnections);
>  
> -    sprintf (port, "%d", atoi (display));
> -
> -    if ((_XSERVTransMakeAllCOTSServerListeners (port, &partial,
> -     &ListenTransCount, &ListenTransConns) >= 0) &&
> -     (ListenTransCount >= 1))
> +    if (display)
>      {
> -     if (!PartialNetwork && partial)
> -     {
> -         FatalError ("Failed to establish all listening sockets");
> -     }
> -     else
> +     if (TryCreateSocket(atoi(display), &partial) &&
> +         (ListenTransCount >= 1))
> +         if (!PartialNetwork && partial)
> +             FatalError ("Failed to establish all listening sockets");
> +    }
> +    else /* -displayfd */
> +    {
> +     Bool found = 0;
> +     for (i = 0; i < 65535 - 1024; i++)

Should this be 65535 - 6000?

>       {
> -         ListenTransFds = malloc(ListenTransCount * sizeof (int));
> -
> -         for (i = 0; i < ListenTransCount; i++)
> +         if (!TryCreateSocket(i, &partial) && !partial)
>           {
> -             int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
> -             
> -             ListenTransFds[i] = fd;
> -             FD_SET (fd, &WellKnownConnections);
> -
> -             if (!_XSERVTransIsLocal (ListenTransConns[i]))
> -             {
> -                 DefineSelf (fd);
> -             }
> +             found = 1;
> +             break;
>           }
> +         else
> +             CloseWellKnownConnections();
> +     }
> +     if (!found)
> +         FatalError("Failed to find a socket to listen on");
> +     sprintf(dynamic_display, "%d\n", i);
> +     display = dynamic_display;
> +    }
> +
> +    ListenTransFds = malloc (ListenTransCount * sizeof (int));
> +
> +    for (i = 0; i < ListenTransCount; i++)
> +    {
> +     int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
> +
> +     ListenTransFds[i] = fd;
> +     FD_SET (fd, &WellKnownConnections);
> +
> +     if (!_XSERVTransIsLocal (ListenTransConns[i]))
> +     {
> +         DefineSelf (fd);
>       }
>      }
>  
Cheers,
Julien
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to