I'm writing the linux daemon and I want to implement ability to configure its params via telnet. I have a cli interface code, written using gnu readline library with history and completers and I'd like to using that interface code for daemon.
I tried to redirect stdin/stdout to socket, redirected rl_instream/rl_outstream to socket, read/write to master/slave pty, but without success.
similar question asked here without any answers.
Also read this question, but I do not have child process.
My questions are:
- How can I use pty functionality inside the single process?
- Do I need to use master and slave pty if I have single process only?
Code example (with no operations on pty devices), expected result - readline works properly
char* readline_buff;
int main(void){
int mSock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
int socketfd, n, flag = 1;
int addrlen;
daemon(1,1);
setsockopt(mSock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(5000);
addr.sin_addr.s_addr = INADDR_ANY;
bind(mSock, (const sockaddr*)&addr, sizeof(addr));
listen(mSock,SOMAXCONN);
addrlen = sizeof(addrlen);
bzero(&addr, sizeof(addr));
int m_pty = posix_openpt(O_RDWR);
grantpt(m_pty);
unlockpt(m_pty);
string m_ptsname = ptsname(m_pty);
int slave = open(m_ptsname.c_str(), O_RDWR);
//
socketfd = accept(mSock, (struct sockaddr *) &addr, (socklen_t*)&addrlen);
//
close(STDOUT_FILENO);
dup2(socketfd, STDOUT_FILENO);
close(STDIN_FILENO);
dup2(socketfd, STDIN_FILENO);
close(STDERR_FILENO);
dup2(socketfd, STDERR_FILENO);
//
while(true){
readline_buff = readline("ME: ");
add_history(readline_buff);
free(readline_buff);
}
return 0;
}
Many thanks.