Overview
Comment: | OFDDPSocket: Add support for configuring AppleTalk |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
ccb53db0d88e0010c83c85abd8941d26 |
User & Date: | js on 2023-04-15 17:30:59 |
Other Links: | manifest | tags |
Context
2023-04-16
| ||
06:21 | OFDDPSocket: Fix removing configuration on NetBSD check-in: 22fab9e495 user: js tags: trunk | |
2023-04-15
| ||
17:30 | OFDDPSocket: Add support for configuring AppleTalk check-in: ccb53db0d8 user: js tags: trunk | |
2023-04-13
| ||
18:42 | utils/ofatalkcfg: Ensure ifr_name 0 termination check-in: b20446bb3a user: js tags: trunk | |
Changes
Modified configure.ac from [671a67f9d4] to [f0175abcd7].
︙ | |||
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 | 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 | + + + + + | #endif ], [ AC_DEFINE(OF_HAVE_APPLETALK, 1, [Whether we have AppleTalk]) AC_SUBST(USE_SRCS_APPLETALK, '${SRCS_APPLETALK}') AC_CHECK_MEMBERS([struct ifreq.ifr_name], [ AC_DEFINE(OF_HAVE_APPLETALK_IFCONFIG, 1, m4_normalize([ Whether AppleTalk interfaces can be configured ])) AC_SUBST(OFATALKCFG, ofatalkcfg) ], [], [ #ifdef OF_HAVE_SYS_SOCKET_H # include <sys/socket.h> #endif #include <net/if.h> ]) |
︙ |
Modified src/OFDDPSocket.h from [8b18782fee] to [6a455c4113].
︙ | |||
14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | */ #import "OFDatagramSocket.h" OF_ASSUME_NONNULL_BEGIN @class OFString; @class OFDictionary OF_GENERIC(KeyType, ObjectType); #ifdef OF_HAVE_APPLETALK_IFCONFIG /** * @brief A dictionary mapping keys of type @ref * OFAppleTalkInterfaceConfigurationKey. */ typedef OFConstantString *OFAppleTalkInterfaceConfigurationKey; /** * @brief A key for OFAppleTalkInterfaceConfiguration. * * Possible keys are: * * @ref OFAppleTalkInterfaceConfigurationNetwork * * @ref OFAppleTalkInterfaceConfigurationNode * * @ref OFAppleTalkInterfaceConfigurationPhase * * @ref OFAppleTalkInterfaceConfigurationNetworkRange */ typedef OFDictionary OF_GENERIC(OFAppleTalkInterfaceConfigurationKey, id) *OFAppleTalkInterfaceConfiguration; /** * @brief The AppleTalk network of an interface. * * The corresponding value is of type @ref OFNumber in the range 0 to 65535. */ extern const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationNetwork; /** * @brief The AppleTalk node of an interface. * * The corresponding value is of type @ref OFNumber in the range 0 to 255. */ extern const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationNode; /** * @brief The AppleTalk phase of an interface. * * The corresponding value is of type @ref OFNumber in the range 1 to 2. */ extern const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationPhase; /** * @brief The AppleTalk network range of an interface. * * The corresponding value is of type @ref OFPair with two @ref OFNumber, both * in the range 0 to 65535. */ extern const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationNetworkRange; #endif /** * @protocol OFDDPSocketDelegate OFDDPSocket.h ObjFW/OFDDPSocket.h * * @brief A delegate for OFDDPSocket. */ @protocol OFDDPSocketDelegate <OFDatagramSocketDelegate> |
︙ | |||
64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | * @brief The delegate for asynchronous operations on the socket. * * @note The delegate is retained for as long as asynchronous operations are * still ongoing. */ @property OF_NULLABLE_PROPERTY (assign, nonatomic) id <OFDDPSocketDelegate> delegate; #ifdef OF_HAVE_APPLETALK_IFCONFIG /** * @brief Configures the specified interface with the specified AppleTalk * configuration. * * @param configuration The AppleTalk configuration for the interface. See * @ref OFAppleTalkInterfaceConfiguration for more * details. * @param interfaceName The name of the interface to configure for AppleTalk * @throw OFSetOptionFailedException Setting the configuration failed. Consult * errNo for details. */ + (void)setConfiguration: (OFAppleTalkInterfaceConfiguration)configuration forInterface: (OFString *)interfaceName; /** * @brief Returns the AppleTalk configuration for the specified interface. * * @param interfaceName The name of the interface for which to return the * AppleTalk configuration * @return The AppleTalk configuration for the specified interface, or `nil` if * the specified interface is not configured for AppleTalk. See * @ref OFAppleTalkInterfaceConfiguration for more details. * @throw OFGetOptionFailedException Getting the configuration failed. Consult * errNo for details. */ + (nullable OFAppleTalkInterfaceConfiguration) configurationForInterface: (OFString *)interfaceName; /** * @brief Removes the AppleTalk configuration for the specified interface. * * @param interfaceName The name of the interface for which to remove the * AppleTalk configuration * @throw OFSetOptionFailedException Removing the configuration failed. Consult * errNo for details. */ + (void)removeConfigurationForInterface: (OFString *)interfaceName; #endif /** * @brief Bind the socket to the specified network, node and port. * * @param network The network to bind to. 0 means any. * @param node The node to bind to. 0 means "this node". * @param port The port to bind to. 0 means to pick one and return it via the |
︙ |
Modified src/OFDDPSocket.m from [00da26e5f2] to [ac9c1835dc].
︙ | |||
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 | 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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | #include <errno.h> #ifdef HAVE_FCNTL_H # include <fcntl.h> #endif #import "OFDDPSocket.h" #import "OFDictionary.h" #import "OFNumber.h" #import "OFPair.h" #import "OFSocket.h" #import "OFSocket+Private.h" #import "OFAlreadyOpenException.h" #import "OFBindDDPSocketFailedException.h" #import "OFGetOptionFailedException.h" #import "OFInvalidArgumentException.h" #import "OFNotOpenException.h" #import "OFOutOfRangeException.h" #import "OFReadFailedException.h" #import "OFSetOptionFailedException.h" #import "OFWriteFailedException.h" #ifdef HAVE_NET_IF_H # include <net/if.h> #endif #ifdef HAVE_SYS_IOCTL_H # include <sys/ioctl.h> #endif #ifdef OF_HAVE_NETAT_APPLETALK_H # include <netat/ddp.h> # include <sys/ioctl.h> /* Unfortulately, there is no struct for the following in userland headers */ struct ATInterfaceConfig { char interfaceName[16]; unsigned int flags; struct at_addr address, router; unsigned short netStart, netEnd; at_nvestr_t zoneName; }; #endif #ifdef OF_HAVE_APPLETALK_IFCONFIG const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationNode = @"OFAppleTalkInterfaceConfigurationNode"; const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationNetwork = @"OFAppleTalkInterfaceConfigurationNetwork"; const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationPhase = @"OFAppleTalkInterfaceConfigurationPhase"; const OFAppleTalkInterfaceConfigurationKey OFAppleTalkInterfaceConfigurationNetworkRange = @"OFAppleTalkInterfaceConfigurationNetworkRange"; #endif @implementation OFDDPSocket @dynamic delegate; #ifdef OF_HAVE_APPLETALK_IFCONFIG + (void)setConfiguration: (OFAppleTalkInterfaceConfiguration)config forInterface: (OFString *)interfaceName { OFNumber *network, *node, *phase; OFPair OF_GENERIC(OFNumber *, OFNumber *) *range; int sock; struct ifreq request; struct sockaddr_at *sat; uint16_t rangeStart, rangeEnd; if (interfaceName.UTF8StringLength > IFNAMSIZ - 1) @throw [OFOutOfRangeException exception]; network = [config objectForKey: OFAppleTalkInterfaceConfigurationNetwork]; node = [config objectForKey: OFAppleTalkInterfaceConfigurationNode]; phase = [config objectForKey: OFAppleTalkInterfaceConfigurationPhase]; range = [config objectForKey: OFAppleTalkInterfaceConfigurationNetworkRange]; if (network == nil || node == nil) @throw [OFInvalidArgumentException exception]; if (phase != nil && phase.unsignedCharValue != 1 && phase.unsignedCharValue != 2) @throw [OFInvalidArgumentException exception]; # ifdef OF_MACOS if ((sock = socket(AF_APPLETALK, SOCK_RAW, 0)) < 0) # else if ((sock = socket(AF_APPLETALK, SOCK_DGRAM, 0)) < 0) # endif @throw [OFSetOptionFailedException exceptionWithObject: nil errNo: OFSocketErrNo()]; memset(&request, 0, sizeof(request)); strncpy(request.ifr_name, interfaceName.UTF8String, IFNAMSIZ - 1); sat = (struct sockaddr_at *)&request.ifr_addr; sat->sat_family = AF_APPLETALK; sat->sat_net = OFToBigEndian16(network.unsignedShortValue); sat->sat_node = node.unsignedCharValue; /* * The netrange is hidden in sat_zero and different OSes use different * struct names for it, so the portable way is setting sat_zero * directly. */ sat->sat_zero[0] = (phase != nil ? phase.unsignedCharValue : 2); if (range != nil) { rangeStart = [range.firstObject unsignedShortValue]; rangeEnd = [range.secondObject unsignedShortValue]; } else { rangeStart = rangeEnd = network.unsignedShortValue; } sat->sat_zero[2] = rangeStart >> 8; sat->sat_zero[3] = rangeStart & 0xFF; sat->sat_zero[4] = rangeEnd >> 8; sat->sat_zero[5] = rangeEnd & 0xFF; if (ioctl(sock, SIOCSIFADDR, &request) != 0) @throw [OFSetOptionFailedException exceptionWithObject: nil errNo: OFSocketErrNo()]; close(sock); } + (OFAppleTalkInterfaceConfiguration) configurationForInterface: (OFString *)interfaceName { int sock; struct ifreq request; struct sockaddr_at *sat; # ifndef OF_LINUX uint16_t rangeStart, rangeEnd; OFPair *range; # endif if (interfaceName.UTF8StringLength > IFNAMSIZ - 1) @throw [OFOutOfRangeException exception]; # ifdef OF_MACOS if ((sock = socket(AF_APPLETALK, SOCK_RAW, 0)) < 0) # else if ((sock = socket(AF_APPLETALK, SOCK_DGRAM, 0)) < 0) # endif @throw [OFGetOptionFailedException exceptionWithObject: nil errNo: OFSocketErrNo()]; memset(&request, 0, sizeof(request)); strncpy(request.ifr_name, interfaceName.UTF8String, IFNAMSIZ - 1); if (ioctl(sock, SIOCGIFADDR, &request) < 0) { int errNo = OFSocketErrNo(); /* No AppleTalk configured on this interface. */ if (errNo == EADDRNOTAVAIL) { close(sock); return nil; } @throw [OFGetOptionFailedException exceptionWithObject: nil errNo: errNo]; } sat = (struct sockaddr_at *)&request.ifr_addr; close(sock); # ifndef OF_LINUX /* * Linux currently doesn't fill out the phase or netrange. * * The netrange is hidden in sat_zero and different OSes use different * struct names for it, so the portable way is setting sat_zero * directly. */ rangeStart = sat->sat_zero[2] << 8 | sat->sat_zero[3]; rangeEnd = sat->sat_zero[4] << 8 | sat->sat_zero[5]; range = [OFPair pairWithFirstObject: [OFNumber numberWithUnsignedShort: rangeStart] secondObject: [OFNumber numberWithUnsignedShort: rangeEnd]]; # endif return [OFDictionary dictionaryWithKeysAndObjects: OFAppleTalkInterfaceConfigurationNode, [OFNumber numberWithUnsignedChar: sat->sat_node], OFAppleTalkInterfaceConfigurationNetwork, [OFNumber numberWithUnsignedShort: OFFromBigEndian16(sat->sat_net)], # ifndef OF_LINUX OFAppleTalkInterfaceConfigurationPhase, [OFNumber numberWithUnsignedChar: sat->sat_zero[0]], OFAppleTalkInterfaceConfigurationNetworkRange, range, # endif nil]; } + (void)removeConfigurationForInterface: (OFString *)interfaceName { int sock; struct ifreq request; if (interfaceName.UTF8StringLength > IFNAMSIZ - 1) @throw [OFOutOfRangeException exception]; # ifdef OF_MACOS if ((sock = socket(AF_APPLETALK, SOCK_RAW, 0)) < 0) # else if ((sock = socket(AF_APPLETALK, SOCK_DGRAM, 0)) < 0) # endif @throw [OFSetOptionFailedException exceptionWithObject: nil errNo: OFSocketErrNo()]; memset(&request, 0, sizeof(request)); strncpy(request.ifr_name, interfaceName.UTF8String, IFNAMSIZ - 1); request.ifr_addr.sa_family = AF_APPLETALK; if (ioctl(sock, SIOCDIFADDR, &request) != 0) @throw [OFSetOptionFailedException exceptionWithObject: nil errNo: OFSocketErrNo()]; } #endif - (OFSocketAddress)bindToNetwork: (uint16_t)network node: (uint8_t)node port: (uint8_t)port protocolType: (uint8_t)protocolType { #ifdef OF_MACOS |
︙ |
Modified src/OFSocket.h from [5d7e2b8fd9] to [755345bacd].
︙ | |||
57 58 59 60 61 62 63 | 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 | - - + + | # include <wsipx.h> # endif # ifdef OF_HAVE_APPLETALK # include <atalkwsh.h> # endif #endif |
︙ |
Modified src/exceptions/OFGetOptionFailedException.h from [bce179e7f5] to [6b97dd37ec].
︙ | |||
21 22 23 24 25 26 27 | 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 | - + - + - + - + | * @class OFGetOptionFailedException \ * OFGetOptionFailedException.h ObjFW/OFGetOptionFailedException.h * * @brief An exception indicating that getting an option for an object failed. */ @interface OFGetOptionFailedException: OFException { |
Modified src/exceptions/OFGetOptionFailedException.m from [64945ede99] to [baf044fe92].
︙ | |||
51 52 53 54 55 56 57 | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | + - - - + + + + + + | [_object release]; [super dealloc]; } - (OFString *)description { if (_object != nil) |
Modified src/exceptions/OFSetOptionFailedException.h from [73cb16f242] to [daab9b6b5c].
︙ | |||
21 22 23 24 25 26 27 | 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 | - + - + - + - + | * @class OFSetOptionFailedException \ * OFSetOptionFailedException.h ObjFW/OFSetOptionFailedException.h * * @brief An exception indicating that setting an option for an object failed. */ @interface OFSetOptionFailedException: OFException { |
Modified src/exceptions/OFSetOptionFailedException.m from [e29393f4c6] to [7495460b21].
︙ | |||
51 52 53 54 55 56 57 | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | + - - - + + + + + + | [_object release]; [super dealloc]; } - (OFString *)description { if (_object != nil) |
Modified src/objfw-defs.h.in from [13ff8f3bcc] to [376d21383b].
1 2 3 4 5 6 7 8 9 10 11 12 13 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | + | #undef OF_APPLE_RUNTIME #undef OF_BIG_ENDIAN #undef OF_CLASSIC_MACOS #undef OF_FLOAT_BIG_ENDIAN #undef OF_HAVE_AFUNIX_H #undef OF_HAVE_APPLETALK #undef OF_HAVE_APPLETALK_IFCONFIG #undef OF_HAVE_ATOMIC_BUILTINS #undef OF_HAVE_ATOMIC_OPS #undef OF_HAVE_BUILTIN_BSWAP16 #undef OF_HAVE_BUILTIN_BSWAP32 #undef OF_HAVE_BUILTIN_BSWAP64 #undef OF_HAVE_CHMOD #undef OF_HAVE_CHOWN |
︙ |
Modified utils/ofatalkcfg/OFATalkCfg.m from [8054bd9b01] to [c079b4e165].
︙ | |||
12 13 14 15 16 17 18 | 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 | - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <errno.h> |
︙ | |||
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | 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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | + + + + - - - + + + + + + + + + + | return; } if (network > UINT16_MAX) { [OFStdErr writeFormat: @"%@: --network out of range!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; } [config setObject: [OFNumber numberWithUnsignedShort: (uint16_t)network] forKey: OFAppleTalkInterfaceConfigurationNetwork]; if (nodeString == nil) { [OFStdErr writeFormat: @"%@: --node not specified!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; } @try { node = [nodeString unsignedLongLongValueWithBase: 0]; } @catch (OFInvalidFormatException *e) { [OFStdErr writeFormat: @"%@: Invalid format for --node!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; return; } if (node > UINT8_MAX) { [OFStdErr writeFormat: @"%@: --node out of range!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; } [config setObject: [OFNumber numberWithUnsignedChar: (uint8_t)node] forKey: OFAppleTalkInterfaceConfigurationNode]; if (phaseString != nil) { @try { phase = [phaseString unsignedLongLongValueWithBase: 0]; } @catch (OFInvalidFormatException *e) { [OFStdErr writeFormat: @"%@: Invalid format for "@"--phase!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; return; } if (phase > 2) { [OFStdErr writeFormat: @"%@: --phase out of range!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; } |
︙ | |||
242 243 244 245 246 247 248 | 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | - - - + + + + + + + + - + - - + | } if (rangeStart > UINT16_MAX || rangeEnd > UINT16_MAX) { [OFStdErr writeFormat: @"%@: --range out of range!\n", [OFApplication programName]]; [OFApplication terminateWithStatus: 1]; } |