Overview
Comment: | Add utils/ofsock
ofsock is a command line util to use the various socket classes in ObjFW |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
97cad6d5f2cf9bd05d72405471408517 |
User & Date: | js on 2020-05-03 20:29:26 |
Other Links: | manifest | tags |
Context
2020-05-04
| ||
21:34 | README.md: Add a note about broken Xcode versions check-in: 4fe73fb326 user: js tags: trunk | |
2020-05-03
| ||
20:29 | Add utils/ofsock check-in: 97cad6d5f2 user: js tags: trunk | |
19:36 | Add OFSPXStreamSocket check-in: 0ded796f1a user: js tags: trunk | |
Changes
Modified .gitignore from [dbd7d8e2dc] to [6c15580176].
︙ | ︙ | |||
52 53 54 55 56 57 58 | utils/ofarc/ofarc.exe utils/ofdns/ofdns utils/ofdns/ofdns.exe utils/ofhash/ofhash utils/ofhash/ofhash.exe utils/ofhttp/ofhttp utils/ofhttp/ofhttp.exe | > > | 52 53 54 55 56 57 58 59 60 | utils/ofarc/ofarc.exe utils/ofdns/ofdns utils/ofdns/ofdns.exe utils/ofhash/ofhash utils/ofhash/ofhash.exe utils/ofhttp/ofhttp utils/ofhttp/ofhttp.exe utils/ofsock/ofsock utils/ofsock/ofsock.exe |
Modified configure.ac from [5cd1330273] to [cec15c8863].
︙ | ︙ | |||
1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 | AC_SUBST(OF_HTTP_CLIENT_TESTS_M, "OFHTTPClientTests.m") ]) AC_SUBST(OFDNS, "ofdns") AS_IF([test x"$enable_files" != x"no"], [ AC_SUBST(OFHTTP, "ofhttp") ]) ]) AC_DEFUN([CHECK_BUILTIN_BSWAP], [ AC_MSG_CHECKING(for __builtin_bswap$1) AC_TRY_LINK([ #include <stdint.h> #include <stdio.h> | > | 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 | AC_SUBST(OF_HTTP_CLIENT_TESTS_M, "OFHTTPClientTests.m") ]) AC_SUBST(OFDNS, "ofdns") AS_IF([test x"$enable_files" != x"no"], [ AC_SUBST(OFHTTP, "ofhttp") ]) AC_SUBST(OFSOCK, "ofsock") ]) AC_DEFUN([CHECK_BUILTIN_BSWAP], [ AC_MSG_CHECKING(for __builtin_bswap$1) AC_TRY_LINK([ #include <stdint.h> #include <stdio.h> |
︙ | ︙ |
Modified extra.mk.in from [4cbbd54fec] to [406c010036].
︙ | ︙ | |||
53 54 55 56 57 58 59 60 61 62 63 64 65 66 | LOOKUP_ASM_LOOKUP_ASM_A = @LOOKUP_ASM_LOOKUP_ASM_A@ LOOKUP_ASM_LOOKUP_ASM_LIB_A = @LOOKUP_ASM_LOOKUP_ASM_LIB_A@ MAP_LDFLAGS = @MAP_LDFLAGS@ OFARC = @OFARC@ OFDNS = @OFDNS@ OFHASH = @OFHASH@ OFHTTP = @OFHTTP@ OF_BLOCK_TESTS_M = @OF_BLOCK_TESTS_M@ OF_EPOLL_KERNEL_EVENT_OBSERVER_M = @OF_EPOLL_KERNEL_EVENT_OBSERVER_M@ OF_HTTP_CLIENT_TESTS_M = @OF_HTTP_CLIENT_TESTS_M@ OF_KQUEUE_KERNEL_EVENT_OBSERVER_M = @OF_KQUEUE_KERNEL_EVENT_OBSERVER_M@ OF_POLL_KERNEL_EVENT_OBSERVER_M = @OF_POLL_KERNEL_EVENT_OBSERVER_M@ OF_PROCESS_M = @OF_PROCESS_M@ OF_SELECT_KERNEL_EVENT_OBSERVER_M = @OF_SELECT_KERNEL_EVENT_OBSERVER_M@ | > | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | LOOKUP_ASM_LOOKUP_ASM_A = @LOOKUP_ASM_LOOKUP_ASM_A@ LOOKUP_ASM_LOOKUP_ASM_LIB_A = @LOOKUP_ASM_LOOKUP_ASM_LIB_A@ MAP_LDFLAGS = @MAP_LDFLAGS@ OFARC = @OFARC@ OFDNS = @OFDNS@ OFHASH = @OFHASH@ OFHTTP = @OFHTTP@ OFSOCK = @OFSOCK@ OF_BLOCK_TESTS_M = @OF_BLOCK_TESTS_M@ OF_EPOLL_KERNEL_EVENT_OBSERVER_M = @OF_EPOLL_KERNEL_EVENT_OBSERVER_M@ OF_HTTP_CLIENT_TESTS_M = @OF_HTTP_CLIENT_TESTS_M@ OF_KQUEUE_KERNEL_EVENT_OBSERVER_M = @OF_KQUEUE_KERNEL_EVENT_OBSERVER_M@ OF_POLL_KERNEL_EVENT_OBSERVER_M = @OF_POLL_KERNEL_EVENT_OBSERVER_M@ OF_PROCESS_M = @OF_PROCESS_M@ OF_SELECT_KERNEL_EVENT_OBSERVER_M = @OF_SELECT_KERNEL_EVENT_OBSERVER_M@ |
︙ | ︙ |
Modified utils/Makefile from [521b7f89ce] to [82be3d0820].
1 2 3 4 5 6 7 8 9 10 11 12 13 | include ../extra.mk SUBDIRS += ${OFARC} \ ${OFDNS} \ ${OFHASH} \ ${OFHTTP} \ completions include ../buildsys.mk DISTCLEAN = objfw-config install-extra: objfw-config objfw-compile objfw-new | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | include ../extra.mk SUBDIRS += ${OFARC} \ ${OFDNS} \ ${OFHASH} \ ${OFHTTP} \ ${OFSOCK} \ completions include ../buildsys.mk DISTCLEAN = objfw-config install-extra: objfw-config objfw-compile objfw-new |
︙ | ︙ |
Added utils/ofsock/Makefile version [0438ba0691].
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | include ../../extra.mk PROG = ofsock${PROG_SUFFIX} SRCS = OFSock.m include ../../buildsys.mk PACKAGE_NAME = ofsock ${PROG}: ${LIBOBJFW_DEP_LVL2} ${LIBOBJFWRT_DEP_LVL2} CPPFLAGS += -I../../src \ -I../../src/runtime \ -I../../src/exceptions \ -I../.. LIBS := -L../../src -lobjfw \ -L../../src/runtime -L../../src/runtime/linklib ${RUNTIME_LIBS} \ ${LIBS} LD = ${OBJC} LDFLAGS += ${LDFLAGS_RPATH} |
Added utils/ofsock/OFSock.m version [0c75e9be8d].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019, 2020 * Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "OFApplication.h" #import "OFArray.h" #import "OFNumber.h" #import "OFPair.h" #import "OFStdIOStream.h" #import "OFStream.h" #import "OFString.h" #import "OFTCPSocket.h" #import "OFURL.h" #define BUFFER_LEN 4096 @interface OFSock: OFObject <OFApplicationDelegate, OFStreamDelegate> { char _buffer[BUFFER_LEN]; OFMutableArray OF_GENERIC(OFPair OF_GENERIC(OFStream *, OFStream *) *) *_streams; int _errors; } @end OF_APPLICATION_DELEGATE(OFSock) static OFPair OF_GENERIC(OFStream *, OFStream *) * streamFromString(OFString *string) { OFURL *URL; OFString *scheme; if ([string isEqual: @"-"]) return [OFPair pairWithFirstObject: of_stdin secondObject: of_stdout]; URL = [OFURL URLWithString: string]; scheme = URL.scheme; if ([scheme isEqual: @"tcp"]) { OFTCPSocket *sock = [OFTCPSocket socket]; if (URL.port == nil) { [of_stderr writeLine: @"Need a port!"]; [OFApplication terminateWithStatus: 1]; } [sock connectToHost: URL.host port: URL.port.uInt16Value]; return [OFPair pairWithFirstObject: sock secondObject: sock]; } [of_stderr writeFormat: @"Invalid protocol: %@\n", scheme]; [OFApplication terminateWithStatus: 1]; abort(); } @implementation OFSock - (void)applicationDidFinishLaunching { OFArray OF_GENERIC(OFString *) *arguments = [OFApplication arguments]; if (arguments.count < 1) { [of_stderr writeLine: @"Need at least one argument!"]; [OFApplication terminateWithStatus: 1]; } _streams = [[OFMutableArray alloc] init]; for (OFString *argument in arguments) { OFPair *pair = streamFromString(argument); [pair.firstObject setDelegate: self]; [_streams addObject: pair]; } if (arguments.count == 1) { of_stdin.delegate = self; [_streams addObject: [OFPair pairWithFirstObject: of_stdin secondObject: of_stdout]]; } for (OFPair *pair in _streams) [pair.firstObject asyncReadIntoBuffer: _buffer length: BUFFER_LEN]; } - (void)removeDeadStream: (OFStream *)stream { size_t count = _streams.count; for (size_t i = 0; i < count; i++) { if ([[_streams objectAtIndex: i] firstObject] == stream) { [_streams removeObjectAtIndex: i]; break; } } if (_streams.count < 2) [OFApplication terminateWithStatus: _errors]; } - (bool)stream: (OFStream *)stream didReadIntoBuffer: (void *)buffer length: (size_t)length exception: (id)exception { if (exception != nil) { [of_stderr writeFormat: @"Exception on stream %@: %@\n", stream, exception]; _errors++; [self removeDeadStream: stream]; return false; } if (stream.atEndOfStream) { [self removeDeadStream: stream]; return false; } for (OFPair *pair in _streams) { if (pair.firstObject == stream) continue; [pair.secondObject writeBuffer: buffer length: length]; } return true; } @end |