#include <stdio.h>
#include <malloc.h>
#include <sys/socket.h>
#include <sys/un.h>

#define PATH "./getsockname_bug.socket"

main()
{
	unlink(PATH);

	int saddr_len = sizeof(struct sockaddr_un);
	struct sockaddr_un *saddr = (struct sockaddr_un *) malloc(saddr_len);
	if (!saddr) exit(1);

	memset(saddr, 0, saddr_len);
	saddr->sun_family = AF_UNIX;
	strcpy(saddr->sun_path, PATH);
	int pathlen = strlen(PATH) + 1;
	saddr_len = sizeof(struct sockaddr_un) - sizeof(saddr->sun_path) + pathlen;

	int fd = socket(PF_UNIX, SOCK_STREAM, 0);
	if (fd < 0) exit(1);

	if (bind(fd, (struct sockaddr *) saddr, saddr_len)) exit(1);

	printf("before: path = \"%s\", saddr_len = %d\n", saddr->sun_path, saddr_len);

	if (getsockname(fd, (struct sockaddr *) saddr, &saddr_len)) exit(1);

	printf("after: path = \"%s\", saddr_len = %d\n", saddr->sun_path, saddr_len);

	close(fd);

	unlink(PATH);
}
