The attached test case creates a socket file /tmp/mysocket and tries to rename 
it to /tmp/newsocket.  But the new name is actually /tmp/newsocket.lnk:

$ gcc -o rename_socket rename_socket.c

$ ./rename_socket.exe

$ ls -F /tmp/newsocket*
/tmp/newsocket.lnk=

I think I have a simple fix, which I'll send to cygwin-patches shortly.

Ken
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/un.h>
#include <sys/socket.h>

int
main ()
{
  const char *old = "/tmp/mysocket";
  const char *new = "/tmp/newsocket";
  const char *bad = "/tmp/newsocket.lnk";
  struct sockaddr_un addr;
  int fd;

  if (unlink (old) == -1 && errno != ENOENT)
    {
      perror ("unlink");
      exit (1);
    }

  if (unlink (new) == -1 && errno != ENOENT)
    {
      perror ("unlink");
      exit (1);
    }

  if (unlink (bad) == -1 && errno != ENOENT)
    {
      perror ("unlink");
      exit (1);
    }

  memset (&addr, 0, sizeof (struct sockaddr_un));
  addr.sun_family = AF_UNIX;
  strncpy (addr.sun_path, old, sizeof (addr.sun_path) - 1);

  fd = socket (AF_UNIX, SOCK_STREAM, 0);
  if (fd == -1)
    {
      perror ("socket");
      exit (1);
    }

  if (bind (fd, (struct sockaddr *) &addr, sizeof (struct sockaddr_un)) == -1)
    {
      perror ("bind");
      exit (1);
    }

  if (rename (old, new) == -1)
    {
      perror ("rename");
      exit (1);
    }
  exit (0);
}
--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

Reply via email to