/* open the character device */
switch (source->type) {
case VIR_DOMAIN_CHR_TYPE_PTY:
- if (virFDStreamOpenFile(st, path, 0, 0, O_RDWR) < 0)
+ if (virFDStreamOpenPTY(st, path, 0, 0, O_RDWR) < 0)
goto error;
break;
case VIR_DOMAIN_CHR_TYPE_UNIX:
# include <sys/un.h>
#endif
#include <netinet/in.h>
+#include <termios.h>
#include "fdstream.h"
#include "virerror.h"
oflags | O_CREAT, mode);
}
+#ifdef HAVE_CFMAKERAW
+int virFDStreamOpenPTY(virStreamPtr st,
+ const char *path,
+ unsigned long long offset,
+ unsigned long long length,
+ int oflags)
+{
+ struct virFDStreamData *fdst = NULL;
+ struct termios rawattr;
+
+ if (virFDStreamOpenFileInternal(st, path,
+ offset, length,
+ oflags | O_CREAT, 0) < 0)
+ return -1;
+
+ fdst = st->privateData;
+
+ if (tcgetattr(fdst->fd, &rawattr) < 0) {
+ virReportSystemError(errno,
+ _("unable to get tty attributes: %s"),
+ path);
+ goto cleanup;
+ }
+
+ cfmakeraw(&rawattr);
+
+ if (tcsetattr(fdst->fd, TCSANOW, &rawattr) < 0) {
+ virReportSystemError(errno,
+ _("unable to set tty attributes: %s"),
+ path);
+ goto cleanup;
+ }
+
+ return 0;
+
+cleanup:
+ virFDStreamClose(st);
+ return -1;
+}
+#else /* !HAVE_CFMAKERAW */
+int virFDStreamOpenPTY(virStreamPtr st,
+ const char *path,
+ unsigned long long offset,
+ unsigned long long length,
+ int oflags)
+{
+ return virFDStreamOpenFileInternal(st, path,
+ offset, length,
+ oflags | O_CREAT, 0);
+}
+#endif /* !HAVE_CFMAKERAW */
+
int virFDStreamSetInternalCloseCb(virStreamPtr st,
virFDStreamInternalCloseCb cb,
void *opaque,
unsigned long long length,
int oflags,
mode_t mode);
+int virFDStreamOpenPTY(virStreamPtr st,
+ const char *path,
+ unsigned long long offset,
+ unsigned long long length,
+ int oflags);
int virFDStreamSetInternalCloseCb(virStreamPtr st,
virFDStreamInternalCloseCb cb,