#include <modules.h>
#include <rwlock.h>
#include <mutex.h>
+#include <signal.h>
// === CONSTANTS ===
#define OUTPUT_RINGBUFFER_LEN 1024 // Number of bytes in output queue before client blocks
tVFS_Node *ServerNode;
tVFS_Node ClientNode;
tVFS_ACL OwnerRW;
-
+
+ tPGID ControllingProcGroup;
// TODO: Maintain list of client PIDs
};
size_t _rb_write(void *buf, size_t buflen, int *rd, int *wr, const void *data, size_t len)
{
size_t space = (*rd - *wr + buflen - 1) % buflen;
- ENTER("pbuf ibuflen prd pwr pdata ilen", buf, buflen, rd, wr, data, len);
len = MIN(space, len);
- LOG("space = %i, *rd = %i, *wr = %i", space, *rd, *wr);
if(*wr + len >= buflen) {
size_t prelen = buflen - *wr;
memcpy((char*)buf + *wr, data, prelen);
memcpy((char*)buf + *wr, data, len);
*wr += len;
}
- LEAVE('i', len);
return len;
}
size_t _rb_read(void *buf, size_t buflen, int *rd, int *wr, void *data, size_t len)
}
if( !pty ) {
- LOG("%i out of range", Pos);
return -1;
}
- strncpy(Name, pty->Name, FILENAME_MAX)
- LOG("Return '%s'", Name);
+ strncpy(Name, pty->Name, FILENAME_MAX);
return 0;
}
// If the server has terminated, send SIGPIPE
if( pty->ServerNode && pty->ServerNode->ReferenceCount == 0 )
{
- //Threads_PostSignal(SIGPIPE);
+ Threads_PostSignal(SIGPIPE);
errno = EIO;
return -1;
}
int rv;
rv = VFS_SelectNode(Node, VFS_SELECT_WRITE, timeout, "PTY_WriteClient");
- if(!rv ) {
+ if(!rv) {
errno = (timeout ? EWOULDBLOCK : EINTR);
return -1;
}
giPTY_NumCount --;
}
- // TODO: Send SIGHUP to controly PGID?
+ // Send SIGHUP to controling PGID
+ if( pty->ControllingProcGroup > 0 ) {
+ Threads_SignalGroup(pty->ControllingProcGroup, SIGHUP);
+ }
// If there are no open children, we can safely free this PTY
if( pty->ClientNode.ReferenceCount == 0 ) {
Node->ImplPtr = pty;
pty->ServerNode = Node;
return 0;
+ case PTY_IOCTL_SETPGRP:
+ // TODO: Should this only be done by client?
+ if( Data )
+ {
+ if( !CheckMem(Data, sizeof(tPGID)) ) { errno = EINVAL; return -1; }
+ pty->ControllingProcGroup = *(tPGID*)Data;
+ Log_Debug("PTY", "Set controlling PGID to %i", pty->ControllingProcGroup);
+ }
+ return pty->ControllingProcGroup;
}
errno = ENOSYS;
return -1;