All pastes #1476817 Raw Edit

Anonymous

public c v1 · immutable
#1476817 ·published 2009-06-27 21:17 UTC
rendered paste body
// author OBLiQUE// copyleft 2009// client skeleton// p0wnbox.com// compile it with: gcc client.c -lpthread -o client#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/un.h>#include <signal.h>#include <pthread.h>#define MAX_STRING 0xfff#define DAEMON_SOCKET_PATH "/tmp/daemon_stream_socket"#define CLIENT_SOCKET_PATH "/tmp/client_socket_"int connect_daemon(const char *daemon_socket_path);void *thread_write(void *args);void *thread_read(void *args);int fd; // socket fdpthread_t twrite, tread; // thread for write function and for read functionint main(int argc,char *argv[]){	fd = connect_daemon(DAEMON_SOCKET_PATH); // connection to daemon	pthread_create(&twrite,NULL,thread_write,NULL); // start write thread	pthread_create(&tread,NULL,thread_read,NULL); // start read thread	pthread_join(tread,NULL); // wait read thread to finish	return EXIT_SUCCESS;}int connect_daemon(const char *daemon_socket_path){	int sockfd;	struct sockaddr_un un;	char socket_path[strlen(CLIENT_SOCKET_PATH)+10];	// create new socket to connect to the daemon	if ((sockfd=socket(AF_UNIX,SOCK_STREAM,0))<0) // open domain stream socket		return -1;	sprintf(socket_path,"%s%d",CLIENT_SOCKET_PATH,getpid()); // create the filename	unlink(socket_path); // delete the file	memset(&un,0,sizeof(un)); // initialize un to 0	un.sun_family=AF_UNIX; // set the socket family	// copy client socket path to un	strncpy(un.sun_path,socket_path,sizeof(un.sun_path)-1);	if (bind(sockfd,(struct sockaddr*)&un,sizeof(un))<0) // assing address to scoket		return -1;	// connect to daemon	memset(&un,0,sizeof(un));	un.sun_family=AF_UNIX;	// copy daemon socket path to un	strncpy(un.sun_path,daemon_socket_path,sizeof(un.sun_path)-1);	if (connect(sockfd,(struct sockaddr*)&un,sizeof(un))<0) // connect to daemon		return -1;	return sockfd; // return the fd}void *thread_write(void *args){	char buf[MAX_STRING];	int readlen;	printf("send anything to the daemon\n\n");	while(1) {		readlen=read(STDIN_FILENO,buf,MAX_STRING); // read from stdin		buf[readlen-1]='\0'; // remove the \n		send(fd,buf,readlen,0); // send to daemon	}}void *thread_read(void *args){	int recvlen;	char buf[MAX_STRING];	do {		recvlen=recv(fd,buf,MAX_STRING,0); // receive from daemon		if (recvlen<=0) break;		printf("%s\n",buf);	} while (recvlen>0);	if (recvlen<0) printf("recv() error\n");	close(fd); // close the socket	pthread_kill(twrite,SIGTERM); // kill write thread}