1/* 2 * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24#include <stdlib.h> 25#include <sys/ioctl.h> 26#include <sys/stat.h> 27#include <fcntl.h> 28#include <errno.h> 29 30/* 31 * posix_openpt call for cloning pty implementation. 32 * 33 * Just open /dev/ptmx 34 */ 35int 36posix_openpt(int flags) 37{ 38 int fd = open("/dev/ptmx", flags); 39 if (fd >= 0) 40 return fd; 41 return -1; 42} 43 44/* 45 * grantpt call for cloning pty implementation. 46 * 47 * Change UID and GID of slave pty associated with master pty whose 48 * fd is provided, to the real UID and real GID of the calling thread. 49 */ 50int 51grantpt(int fd) 52{ 53 return ioctl(fd, TIOCPTYGRANT); 54} 55 56/* 57 * ptsname call for cloning pty implementation. 58 * 59 * NOTE: Returns a pointer to a static buffer, which will be overwritten on 60 * subsequent calls. 61 */ 62char * 63ptsname(int fd) 64{ 65 static char *ptsnamebuf = NULL; 66 int error; 67 char *retval = NULL; 68 struct stat sbuf; 69 70 if (ptsnamebuf == NULL) { 71 ptsnamebuf = malloc(128); // defined by TIOCPTYGNAME 72 } 73 74 error = ioctl(fd, TIOCPTYGNAME, ptsnamebuf); 75 if (!error) { 76 /* 77 * XXX TSD 78 * 79 * POSIX: Handle device rename test case, which is expected 80 * to fail if the pty has been renamed. 81 */ 82 if (stat(ptsnamebuf, &sbuf) == 0) { 83 retval = ptsnamebuf; 84 } 85 } 86 87 return (retval); 88} 89 90/* 91 * unlockpt call for cloning pty implementation. 92 * 93 * Unlock the slave pty associated with the master to which fd refers. 94 */ 95int 96unlockpt(int fd) 97{ 98 return ioctl(fd, TIOCPTYUNLK); 99} 100