summaryrefslogtreecommitdiff
path: root/emu/MacOSX/deveia.c
blob: bb7a01c6131e37ef91f4392396ca057fec3bb655 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
 * Darwin serial port definitions, uses IOKit to build sysdev
 * Loosely based on FreeBSD/deveia.c
 * Copyright © 1998, 1999 Lucent Technologies Inc.  All rights reserved.
 * Revisions Copyright © 1999, 2000 Vita Nuova Limited.  All rights reserved.
 * Revisions Copyright © 2003 Corpus Callosum Corporation.  All rights reserved.
*/

#include <termios.h>
#include <sys/param.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#include <mach/mach.h>

#include <CoreFoundation/CFNumber.h>

#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/usb/IOUSBLib.h>
#include <IOKit/serial/IOSerialKeys.h>
#include <IOKit/IOBSD.h>

#define B14400	14400
#define B28800	28800
#define B57600	57600
#define B76800	76800
#define B115200	115200
#define B230400	230400

extern int vflag;

#define MAXDEV 8
static char *sysdev[MAXDEV];

#include <sys/ioctl.h>
#include <sys/ttycom.h>

static void _buildsysdev(void);
#define	buildsysdev()	_buildsysdev()	/* for devfs-posix.c */

static void
_buildsysdev(void)
{
    kern_return_t           kernResult;
    mach_port_t             masterPort;
    CFMutableDictionaryRef  classesToMatch;
    io_iterator_t           serialPortIterator;
    io_object_t             serialDevice;
    CFMutableArrayRef       array;
    CFIndex                 idx;

    kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
    if (KERN_SUCCESS != kernResult)
    {
        printf("IOMasterPort returned %d\n", kernResult);
    } else {
        classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
        if (classesToMatch == NULL)
        {
            printf("IOServiceMatching returned a NULL dictionary.\n");
        } else {
            CFDictionarySetValue(classesToMatch,
                                 CFSTR(kIOSerialBSDTypeKey),
                                 CFSTR(kIOSerialBSDAllTypes));
        }
        
        kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, &serialPortIterator);
        if (KERN_SUCCESS != kernResult)
        {
            printf("IOServiceGetMatchingServices returned %d\n", kernResult);
        } else {
            array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
            
            while ((serialDevice = IOIteratorNext(serialPortIterator))) {
                CFTypeRef	bsdPathAsCFString;
                bsdPathAsCFString = IORegistryEntryCreateCFProperty(serialDevice,
                                                                    CFSTR(kIOCalloutDeviceKey),
                                                                    kCFAllocatorDefault,
                                                                    0);
                if (bsdPathAsCFString) {
                    CFArrayAppendValue(array, bsdPathAsCFString);
                }
                
                (void) IOObjectRelease(serialDevice);
            }
            
            idx = CFArrayGetCount(array);
            if (idx > 0) {
                Boolean result;
                char 	bsdPath[MAXPATHLEN];
                char 	*tmpsysdev[idx+1];
                CFIndex i;
                
                for (i=0; i<idx; i++) {
                    result = CFStringGetCString(CFArrayGetValueAtIndex(array, i),
                                                bsdPath,
                                                sizeof(bsdPath),
                                                kCFStringEncodingASCII);
                    if (result) {
                        int len = strlen(bsdPath);
                        tmpsysdev[i] = (char *)malloc((len+1)*sizeof(char));
                        strcpy(tmpsysdev[i], bsdPath);
                    }
                }
                tmpsysdev[idx] = NULL;
                for (i=0; i < idx; i++) {
                    sysdev[i] = tmpsysdev[i];
                    if (vflag)
                        printf("BSD path: '%s'\n", sysdev[i]);
                }
            }
            
            CFRelease(array);
        }
    }
	
    if (serialPortIterator)
        IOObjectRelease(serialPortIterator);
    if (masterPort)
        mach_port_deallocate(mach_task_self(), masterPort);

    return;
}

#undef nil

#include "deveia-posix.c"
#include "deveia-bsd.c"

static struct tcdef_t bps[] = {
    {0,             B0},
    {50,            B50},
    {75,            B75},
    {110,           B110},
    {134,           B134},
    {150,           B150},
    {200,           B200},
    {300,           B300},
    {600,           B600},
    {1200,	B1200},
    {1800,	B1800},
    {2400,	B2400},
    {4800,	B4800},
    {9600,	B9600},
    {19200,	B19200},
    {38400,	B38400},
    {57600,	B57600},
    {76800,	B76800},
    {115200,	B115200},
    {230400,	B230400},
    {0,		-1}
};