#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>    
    
    
#define FIFO_NAME "/tmp/myfifo"
extern int errno;

int myReader(int fd, char* buffer, size_t size){

    int dataSize = 0;
    int ret = 0;
    while (dataSize < size){
        ret  = read(fd, buffer+dataSize, size - dataSize);
        if (ret > 0){
            printf("read something...\n");
            dataSize += ret; 
            if (buffer[dataSize-1] == '\n'){
                break;
            }
        }else{
            if (ret <= 0 && errno == EAGAIN){
                printf("reader EAGAIN: sleep for 2 seconds...\n");
                sleep(2);
            }else{                
                perror("read error");
                break;                          
            }
        }
    }
    return dataSize;
}

int myWriter(int fd, char* buffer, size_t size){
    int dataSize = 0;
    int ret = 0;
    while (dataSize < size){
        ret  = write(fd, buffer+dataSize, size - dataSize);
        if (ret > 0){
            dataSize += ret; 
        }else{
            if (ret <= 0 && errno == EAGAIN){
                printf("write EAGAIN: sleep for 2 seconds...\n");
                sleep(2);
            }else{                
                perror("write with error");
                break;                
            }
        }
    }
    return dataSize;
}

int myOpen(){

    if (access(FIFO_NAME, F_OK) == -1){
        if (mkfifo(FIFO_NAME, 0x777) == -1){
            perror("cannot create fifo\n");            
            return -1;
        }
    }
    
    int fd = -1;
    while (fd == -1){
        fd = open(FIFO_NAME, O_RDWR); //|O_NDELAY);
        if (fd == -1){
            perror("cannot open fifo because no one running at the other end...\n");
            sleep(2);
        }else{
            printf("myOpen fifo fd=%d and ready...\n", fd);
        }
    }
    return fd;
}

int myScanf(char* buffer){
    
    scanf("%s", buffer);
    int size = strlen(buffer);
    buffer[size++]='\n';
    buffer[size]='\0';
    return size;
}


