kategoria: ANSI C
[#1] libevent
Otóż zrobiłem sobie porcik libevent pod ixemul na MorphOS-a. Mam teraz tak, że cokolwiek wykorzystuje tę bibliotekę wypisuje:

[err] evsig_init: socketpair: Protocol family not supported


Na razie wyczaiłem że wypisywany komunikat błędu "Protocol family not supported" zaszyty jest w libc.a.

Co to za czaaaryyy ?
[wyróżniony] [#2] Re: libevent

@ede, post #1

Coś co jest potrzebne do działania libevent pewnie nie jest zaimplementowane w ixemul. Np. nie wiem jak ixemul radzi sobie z socketami AF_UNIX, które są potrzebne do działania libeventa.
[#3] Re: libevent

@strim_, post #2

W każdym razie jak ślęczałem nad tym to wynikło mi że socketpair() wywoływany jest z AF_UNIX.

Mam jakiś pomysł, ale to "strzał" jest, będę sprawdzał. Jak to nie pomoże to nie wiem... mam tu pod ręką "Linux gniazda w programowaniu", dla fanu polecę z przykładami może wylezie, bo jakoś nic mi sensownie nie wskazuje, czego konkretnie brak jest.

THX.
[#4] Re: libevent

@strim_, post #2

Np. nie wiem jak ixemul radzi sobie z socketami AF_UNIX


A no nie radzi sobie w cale. Na przykład z kodem jak poniżej - co potwierdza ten trop. :)

#include <stdio.h>
 	#include <stdlib.h>
 	#include <unistd.h>
 	#include <errno.h>
 	#include <string.h>
 	#include <sys/types.h>
 	#include <sys/socket.h>
 	
 	
 	
 int
 main(int argc,char **argv) {
 	 int z;						/* Zwracany kod stanu */
 	 int s[2];                                          /* Para gniazd */
 	 
 	 /* 
 	  * Tworzymy pare lokalnych gniazd
 	  */
	  z = socketpair(PF_LOCAL,SOCK_STREAM,0,s);
	  
	  if ( z == -1 ) {
	  	 fprintf(stderr,
	  	 "%s: socketpair(PF_LOCAL,SOCK_STREAM,0)\n",
	  	 strerror(errno));
	  return 1;			 		/* Niepowodzenie */
	  }
	  
	  /*
	   * Wyswietlamy deskryptor pliku:
	   */								 	
	   printf("s[0] = %d;\n,s[0]");
	   printf("s[1] = %d;\n,s[1]");
	   
	   /*system(netstat --unix -p);*/
	   
	   return 0;
	   
 }


Aczkolwiek z tym ixemul już sobie poradzi. :) Co więcej jak na razie wygląda na to , że eksperyment się udał.

#include <stdio.h>
 	#include <unistd.h>
 	#include <stdlib.h>
 	#include <errno.h>
 	#include <string.h>
 	#include <sys/types.h>
 	#include <sys/stat.h>
 	#include <sys/socket.h>
 	#include <netinet/in.h>
	
	#define evutil_socket_t int


	int
	evutil_closesocket(evutil_socket_t sock)
	{
	
	return close(sock);
	}
	

	int
	main(int family, int type, int protocol, evutil_socket_t fd[2])
	{
		
	return evutil_ersatz_socketpair(family, type, protocol, fd);
	}



	int
	evutil_ersatz_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
	{


	int listener;					/* Gniazdo */
	struct sockaddr_in listen_addr;	/* AF_INET */
	int len_inet;					/* dlugosc */
 	
 	
 	
 	listener = socket(PF_INET, SOCK_STREAM, 0);
	if (listener < 0)
		return -1;
		
		
	memset(&listen_addr,0,sizeof listen_addr);
	
	listen_addr.sin_family = AF_INET;
	listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
	listen_addr.sin_port = 0;	/* kernel chooses port.	 */
	len_inet = sizeof listen_addr;
	
	if (bind(listener, (struct sockaddr *) &listen_addr, sizeof (listen_addr))== -1)
	
		goto tidy_up_and_fail;		
		if (listen(listener, 1) == -1)
		goto tidy_up_and_fail;
	
	
	int connector;							/* Gniazdo */
	int size;								/* dlugosc */
	struct sockaddr_in connect_addr;		/* AF_INET */
	int acceptor;							
	
	connector = socket(PF_INET,SOCK_STREAM,0);
		if (connector < 0)
		goto tidy_up_and_fail;
	
	
	/* We want to find out the port number to connect to.  */
	
	size = sizeof(connect_addr);
	if (getsockname(listener, (struct sockaddr *) &connect_addr, &size) == -1)
		goto tidy_up_and_fail;	
						
		
	if (size != sizeof (connect_addr))
		goto tidy_up_and_fail;
			
		
	if (connect(connector, (struct sockaddr *) &connect_addr, sizeof(connect_addr)) == -1)
		goto tidy_up_and_fail;
		
	
	size = sizeof(listen_addr);
	acceptor = accept(listener, (struct sockaddr *) &listen_addr, &size);
	if (acceptor < 0)
		goto tidy_up_and_fail;
	if (size != sizeof(listen_addr))	
	goto tidy_up_and_fail;
	
	evutil_closesocket(listener);
	/* Now check we are talking to ourself by matching port and host on the
	   two sockets.	 */
	if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1)
		goto tidy_up_and_fail;
		
	if (size != sizeof (connect_addr)
		|| listen_addr.sin_family != connect_addr.sin_family
		|| listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
		|| listen_addr.sin_port != connect_addr.sin_port)
		goto tidy_up_and_fail;
		
		
	fd[0] = connector;
	fd[1] = acceptor;
	
	
	system("less evutil-ede-1.c");
	
	

	return 0;
	
	
	
	tidy_up_and_fail:
 	
 	
	if (listener != -1) 	
 		evutil_closesocket(listener);
 	if (connector != -1)
		evutil_closesocket(connector);
	if (acceptor != -1)
		evutil_closesocket(acceptor);
				
	return -1; 	
}


Ps. Chyba, że jeszcze coś się ujawni. PPA nie bierze pod uwagę tab-ów :}
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem