81 lines
1.7 KiB
C
81 lines
1.7 KiB
C
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <sys/stat.h>
|
|
#include <errno.h>
|
|
#include <ctype.h>
|
|
#include <fcntl.h>
|
|
|
|
#include "common.h"
|
|
|
|
int client(int fd_read, int fd_write);
|
|
|
|
int main()
|
|
{
|
|
int read_fd, write_fd;
|
|
FAIL_ON((write_fd=open(FIFO_SERVER_PATH, O_WRONLY)) < 0);
|
|
FAIL_ON((read_fd=open(FIFO_CLIENT_PATH, O_RDONLY)) < 0);
|
|
|
|
FAIL_ON(client(read_fd, write_fd));
|
|
|
|
FAIL_ON(unlink(FIFO_SERVER_PATH) < 0);
|
|
printf("unlinked %s\n", FIFO_SERVER_PATH);
|
|
FAIL_ON(unlink(FIFO_CLIENT_PATH) < 0);
|
|
printf("unlinked %s\n", FIFO_CLIENT_PATH);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
#define BUF_SIZE 256
|
|
|
|
char *ltrim(char *s)
|
|
{
|
|
while(isspace(*s)) s++;
|
|
return s;
|
|
}
|
|
|
|
char *rtrim(char *s)
|
|
{
|
|
char* back = s + strlen(s);
|
|
while(isspace(*--back));
|
|
*(back+1) = '\0';
|
|
return s;
|
|
}
|
|
|
|
char *trim(char *s)
|
|
{
|
|
return rtrim(ltrim(s));
|
|
}
|
|
|
|
/**
|
|
* Performs client actions
|
|
*
|
|
* @fd_read - pipe to read from
|
|
* @fd_write - pipe to write t\no
|
|
*
|
|
* returns 0 on success or -errno on fail
|
|
*/
|
|
int client(int fd_read, int fd_write)
|
|
{
|
|
char buf[BUF_SIZE] = {0};
|
|
if (!fgets(buf, BUF_SIZE, stdin)) return -EFAULT;
|
|
const char *s = trim(buf);
|
|
size_t len = strlen(s);
|
|
ssize_t n_written = write(fd_write, s, len);
|
|
if (n_written < 0 || n_written < len) {
|
|
return -EFAULT;
|
|
}
|
|
memset(buf, 0, BUF_SIZE);
|
|
size_t n;
|
|
struct custom_ds ds;
|
|
while ((n = recv_msg(fd_read, &ds)) > 0) {
|
|
len = ds.hdr.len;
|
|
n_written = fwrite(ds.msg, sizeof(ds.msg[0]), len, stdout);
|
|
if (n_written < 0 || n_written < len) {
|
|
return -EFAULT;
|
|
}
|
|
memset(buf, 0, sizeof(buf));
|
|
}
|
|
return 0;
|
|
}
|