コード例 #1
0
ファイル: fork.c プロジェクト: 4179e1/misc
int main(int argc, char **argv) 
{
	int connfd, port;
	socklen_t clientlen;
	struct sockaddr_in clientaddr;
	struct hostent *hp;
	char haddrp[INET_ADDRSTRLEN];
	if (argc != 2)
	{
		wp_critical("usage: %s <port>\n", argv[0]);
	}
	port = atoi(argv[1]);

	listenfd = wp_open_listenfd(port);
	if (listenfd < 0)
	{
		wp_critical ("open listenfd error");
	}

	wp_signal (SIGCHLD, sigchld_handler);
	wp_signal (SIGTERM, sigterm_handler);

	wp_debug_full (stdout, "My pid is %d", getpid());
	while (1) {
		clientlen = sizeof(clientaddr);
		errno = 0;
		connfd = wp_accept(listenfd, (struct sockaddr *)&clientaddr, &clientlen);
		wp_debug("connfd: %d errno: %d", connfd, errno);
		if (keep_on_running == false)
		{
			break;
		}

		if (wp_fork () == 0)
		{
			wp_close (listenfd);
			/* determine the domain name and IP address of the client */
			hp = wp_gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, 
					sizeof(clientaddr.sin_addr.s_addr), AF_INET);
			wp_inet_ntop(AF_INET, &clientaddr.sin_addr, haddrp, sizeof (haddrp));
			printf("server connected to %s (%s)\n", hp->h_name, haddrp);

			echo(connfd);
			
			wp_close (connfd);
			exit (0);
		}
		wp_close(connfd);
	}
	exit(0);
}
コード例 #2
0
ファイル: epoll.c プロジェクト: 4179e1/misc
void echo(int connfd) 
{
	ssize_t n;

	wp_debug ("echo begin %d\n", __LINE__);
	while (1)
	{
		n = wp_read (connfd, buf, sizeof (buf));
		if (n == -1)
		{
			if (errno == EAGAIN)
			{
				wp_debug ("read later");
				break;
			}
			wp_critical ("read error");
		}
		else if (n == 0)
		{
			wp_debug ("nothing to read, close");
			wp_close (connfd);
			break;
		}

		wp_debug ("read %d bytes\n", n);
		wp_write (connfd, buf, n);
	}
	wp_debug ("echo end %d\n", __LINE__);
}
コード例 #3
0
ファイル: echoserver.c プロジェクト: 4179e1/misc
int main(int argc, char **argv) 
{
	int listenfd, connfd, port;
	socklen_t clientlen;
	struct sockaddr_in clientaddr;
	struct hostent *hp;
	char haddrp[INET_ADDRSTRLEN];
	if (argc != 2)
	{
		wp_critical("usage: %s <port>\n", argv[0]);
	}
	port = atoi(argv[1]);

	listenfd = wp_open_listenfd(port);
	if (listenfd < 0)
	{
		wp_critical ("open listenfd error");
	}

	while (1) {
		clientlen = sizeof(clientaddr);
		connfd = wp_accept(listenfd, (struct sockaddr *)&clientaddr, &clientlen);

		/* determine the domain name and IP address of the client */
		hp = wp_gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, 
				sizeof(clientaddr.sin_addr.s_addr), AF_INET);
		wp_inet_ntop(AF_INET, &clientaddr.sin_addr, haddrp, sizeof (haddrp));
		printf("server connected to %s (%s)\n", hp->h_name, haddrp);

		echo(connfd);
		wp_close(connfd);
	}
	exit(0);
}
コード例 #4
0
ファイル: prethread.c プロジェクト: 4179e1/misc
void *thread (void *vargp)
{
	wp_pthread_detach (pthread_self());
	while (1)
	{
		int connfd = sbuf_remove (&sbuf);
		echo_cnt (connfd);
		wp_close (connfd);
	}
}
コード例 #5
0
ファイル: thread.c プロジェクト: 4179e1/misc
void *thread (void *vargp)
{
	int connfd = *(int *)vargp;

	wp_pthread_detach (pthread_self ());
	free (vargp);
	echo (connfd);
	wp_close (connfd);

	return NULL;
}
コード例 #6
0
ファイル: libwp.c プロジェクト: ve7fet/fpac
int wp_get(ax25_address *call, wp_t *wp)
{
	wp_pdu pdu;
	int rc;
	char *callsign;

	if (wp_socket == -1)
		return -1;
		
	call_clean(call);
	memset(&pdu, 0, sizeof(wp_pdu));
	pdu.type = wp_type_get;
	pdu.data.call = *call;
	rc = wp_send_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		/* Disconnected */
		syslog(LOG_INFO, "wp_get() error disconnected - closing wp socket\n");
		wp_close();
		return -1;
	}

	wp_flush_pdu();
	
	rc = wp_receive_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		syslog(LOG_INFO, "wp_get() error - wp_receive_pdu() - closing wp socket\n");
		wp_close();
		return -1;
	}
	if (pdu.type == wp_type_get_response) {
		*wp = pdu.data.wp;
		wp->address.srose_family = AF_ROSE;
		return 0;
	}
	else {
		syslog(LOG_INFO, "wp_get() error pdu.type %d - closing wp socket\n", pdu.type);
	}
	return -1;
}
コード例 #7
0
ファイル: libwp.c プロジェクト: ve7fet/fpac
int wp_nb_records(void)
{
	wp_pdu pdu;
	int rc;
	
	if (wp_socket == -1)
		return -1;
		
	memset(&pdu, 0, sizeof(wp_pdu));
	pdu.type = wp_type_info;
	pdu.data.info.mask = WP_INFO_ALL;
	
	rc = wp_send_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		/* Disconnected */
		syslog(LOG_INFO, "wp_nb_records() send wp error - closing wp socket\n"); 
		wp_close();
		return -1;
	}
	
	wp_flush_pdu();
	
	rc = wp_receive_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		/* Disconnected */
		syslog(LOG_INFO, "wp_nb_records() receive wp error - closing wp socket\n"); 
		wp_close();
		return -1;
	}
	
	if (pdu.type != wp_type_info_response) {
		syslog(LOG_INFO, "wp_nb_records() wrong wp type info response\n"); 
		return -1;
	}
		
	return pdu.data.info_rsp.nbrec;
}
コード例 #8
0
ファイル: libwp.c プロジェクト: ve7fet/fpac
int wp_set(wp_t *wp)
{
	int n;
	int rc;
	time_t temps;
	wp_pdu pdu;
	
	if (wp_socket == -1) {
		syslog(LOG_ERR, "wp_set() no wp socket\n");
		return -1;
	}	
        
  	temps = time(NULL);
	wp->date = temps;
	call_clean(&wp->address.srose_call);
	for (n = 0 ; n < wp->address.srose_ndigis ; n++)
		call_clean(&wp->address.srose_digis[n]);
		
	memset(&pdu, 0, sizeof(wp_pdu));
	pdu.type = wp_type_set;
	pdu.data.wp = *wp;		
	rc = wp_send_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		/* Disconnected */
		syslog(LOG_INFO, "wp_set() wp_send_pdu() error - closing wp socket\n");
		wp_close();
		return -1;
	}
	
	wp_flush_pdu();
	
	rc = wp_receive_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		syslog(LOG_INFO, "wp_set() wp_receive_pdu() error\n");
		return -1;
	}
	if ((pdu.type == wp_type_response) && (pdu.data.status == WP_OK)) {
		return 0;
	}
				
	syslog(LOG_INFO, "wp_set() error - type %d response %d status %d\n", pdu.type, wp_type_response, pdu.data.status);
	return -1;
}
コード例 #9
0
ファイル: tiny.c プロジェクト: 4179e1/misc
void serve_static (int fd, char *filename, int filesize)
{
	int srcfd;
	char *srcp, filetype[MAXLINE], buf[MAXLINE];

	get_filetype (filename, filetype);
	sprintf (buf, "HTTP/1.0 200 OK\r\n");
	sprintf (buf, "%sServer: Tiny Web Server\r\n", buf);
	sprintf (buf, "%sContent-length: %d\r\n", buf, filesize);
	sprintf (buf, "%sContent-type: %s\r\n\r\n", buf, filetype);
	wp_writen (fd, buf, strlen (buf));

	srcfd = wp_open (filename, O_RDONLY, 0);
	srcp = wp_mmap (0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
	wp_close (srcfd);
	wp_writen (fd, srcp, filesize);
	wp_munmap (srcp, filesize);
}
コード例 #10
0
ファイル: tiny.c プロジェクト: 4179e1/misc
int main (int argc, char *argv[])
{
	int listenfd, connfd, port;
	struct sockaddr_in clientaddr;
	socklen_t clientlen;

	if (argc != 2)
	{
		wp_critical ("usage: %s <port>\n", argv[0]);
	}

	port = atoi (argv[1]);

	listenfd = wp_open_listenfd (port);
	while (1)
	{
		clientlen = sizeof (clientaddr);
		connfd = wp_accept (listenfd, (struct sockaddr *)&clientaddr, &clientlen);
		doit (connfd);
		wp_close (connfd);
	}
}
コード例 #11
0
ファイル: wpconvert.c プロジェクト: ve7fet/fpac
int main(int ac, char **av)
{
	FILE *fptr;
	old_wp_t old_wp;
	wp_t new_wp;
	wp_header wph;
	char dnic[5];
	char *add, *call;
	char buf[20];

	if (ac < 2)
	{
		fprintf(stderr, "format : wpconv database\n");
		return 1;
	}
	
	fptr = fopen(av[1], "r");
	if (fptr == NULL)
	{
		fprintf(stderr, "Cannot open %s\n", av[1]);
		return 2;
	}

	if (fread(&wph, sizeof(wph), 1, fptr) == 0)
	{
		fclose(fptr);
		fprintf(stderr, "database %s is empty\n", av[1]);
		return 3;
	}

	/* Check the first record for compatibility */
	if (strcmp(wph.signature,OLD_FILE_SIGNATURE) != 0)
	{
		fprintf(stderr, "database %s is not compatible\n", av[1]);
		fclose(fptr);
		return 4;
	}

	printf("%u callsigns in database\n", wph.nb_record);

	if (wp_open("WPCNVT")) {
		perror("Cannot open WP service");
		exit(1);
	}
	
	while (fread(&old_wp, sizeof(old_wp_t), 1, fptr))
	{
			
		if (old_wp.date == 0)
			continue;
			
		add = rose_ntoa(&old_wp.address.srose_addr);
		call = ax25_ntoa(&old_wp.address.srose_call);

		if (wp_check_call(call) != 0)
			continue;

		strncpy(dnic, add, 4); dnic[4] = '\0';

		my_date(buf, old_wp.date),
		
		printf("%-9s %s => %s %-7s ", 
				call,
				buf,
				dnic, 
				add+4);
			
		if (old_wp.address.srose_ndigis)
			printf("%s ", ax25_ntoa(&old_wp.address.srose_digi));
						
		printf("%s %s\n", old_wp.name, old_wp.city);
		
		/* Add to the running database */
		
		memset(&new_wp, 0, sizeof(wp_t));
		
		new_wp.date = old_wp.date;
		new_wp.address.srose_addr     = old_wp.address.srose_addr;
		new_wp.address.srose_call     = old_wp.address.srose_call;
		new_wp.address.srose_digis[0] = old_wp.address.srose_digi;
		new_wp.address.srose_ndigis   = old_wp.address.srose_ndigis;

		wp_set(&new_wp);
	}

	wp_close();

	return(0);
}
コード例 #12
0
ファイル: libwp.c プロジェクト: ve7fet/fpac
int wp_get_list(wp_t **wp, int *nb, int flags, char *mask)
{
	wp_pdu pdu;
	wp_t *wptab = NULL;
	int rc;
	int max = *nb;
	int i = 0;;
	
	if (wp_socket == -1) {
		syslog(LOG_INFO, "wp_get_list() no wp socket\n");
		return -1;
	}

	*wp = NULL;
	*nb = 0;
	
	memset(&pdu, 0, sizeof(wp_pdu));
	pdu.type = wp_type_get_list;
	pdu.data.list_req.mask[9] = '\0';
	pdu.data.list_req.flags = flags;
	pdu.data.list_req.max = max;
	
	memcpy(pdu.data.list_req.mask, mask, 9);
	rc = wp_send_pdu(wp_socket, &pdu);
	if (rc < 0)
	{
		/* Disconnected */
		syslog(LOG_INFO, "wp_get_list() error disconnected - closing wp socket\n");
		wp_close();
		return -1;
	}
	
	wp_flush_pdu();
	
	for (i = 0 ; i < max ; i++) {
		rc = wp_receive_pdu(wp_socket, &pdu);
		if (rc < 0)
		{
			syslog(LOG_INFO, "wp_get_list() error - closing wp socket\n");
			wp_close();
			return -1;
		}
		if (pdu.type == wp_type_get_list_response) {
			if (wptab == NULL) {
				wptab = calloc(max, sizeof(wp_t));
				*wp = wptab;
			}
			wptab[i] = pdu.data.list_rsp.wp;
			wptab[i].address.srose_family = AF_ROSE;
		}
		else if ((pdu.type == wp_type_response) && (pdu.data.status == WP_OK))
			return 0;
		else 
			return -1;

		if (pdu.data.list_rsp.next == 0)
		{
			*nb = i+1;
			return 0;
		}
	}
	
	/* End of list */
	return -1;
}
コード例 #13
0
ファイル: fork.c プロジェクト: 4179e1/misc
void sigterm_handler (int sig)
{
	keep_on_running = false;
	wp_close (listenfd);
}