Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KTOR-6960 Add UnixDomainSocket support for iOS/tvOS/watchOS #4024

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

05nelsonm
Copy link

Subsystem
Module ktor-network

Motivation
https://youtrack.jetbrains.com/issue/KTOR-6960/Unix-Domain-Socket-Support-for-iOS-tvOS-watchOS

Solution
Adds cinterop definition to include sys/un.h headers for iOS/tvOS/watchOS giving access to sockaddr_un struct for given SDKs, and implements pack/unpack sockaddr_un functions

@e5l e5l self-requested a review May 14, 2024 08:23
@e5l
Copy link
Member

e5l commented May 14, 2024

Hey @05nelsonm, thanks for the PR. Let me run a CI check

@Thomas-Vos
Copy link
Contributor

I think unix sockets do not work on watchOS. Did you actually try this on a real watch instead of a simulator? See: https://developer.apple.com/documentation/technotes/tn3135-low-level-networking-on-watchos

So I guess it is better to revert the changes for watchOS to avoid confusion for other users thinking Ktor supports it.

@e5l
Copy link
Member

e5l commented May 28, 2024

@Thomas-Vos, it looks so, thank you for noticing!

@05nelsonm, could you tell me if you have a chance to check?

@05nelsonm
Copy link
Author

05nelsonm commented May 29, 2024

I tend not to believe apple's documentation over their header files which are all identical for each platform (device or simulator).

admin@Mac_Mini /Applications % xcodebuild -version

Xcode 15.0.1
Build version 15A507
{PLATFORM}.sdk/usr/include/sys/un.h
/*
 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 *
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */
/*
 * Copyright (c) 1982, 1986, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)un.h	8.3 (Berkeley) 2/19/95
 */

#ifndef _SYS_UN_H_
#define _SYS_UN_H_

#include <sys/appleapiopts.h>
#include <sys/cdefs.h>
#include <sys/_types.h>

/* [XSI] The sa_family_t type shall be defined as described in <sys/socket.h> */
#include <sys/_types/_sa_family_t.h>

/*
 * [XSI] Definitions for UNIX IPC domain.
 */
struct  sockaddr_un {
	unsigned char   sun_len;        /* sockaddr len including null */
	sa_family_t     sun_family;     /* [XSI] AF_UNIX */
	char            sun_path[104];  /* [XSI] path name (gag) */
};

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)

/* Level number of get/setsockopt for local domain sockets */
#define SOL_LOCAL               0

/* Socket options. */
#define LOCAL_PEERCRED          0x001           /* retrieve peer credentials */
#define LOCAL_PEERPID           0x002           /* retrieve peer pid */
#define LOCAL_PEEREPID          0x003           /* retrieve eff. peer pid */
#define LOCAL_PEERUUID          0x004           /* retrieve peer UUID */
#define LOCAL_PEEREUUID         0x005           /* retrieve eff. peer UUID */
#define LOCAL_PEERTOKEN         0x006           /* retrieve peer audit token */

#endif  /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */



#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
/* actual length of an initialized sockaddr_un */
#define SUN_LEN(su) \
	(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
#endif  /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */


#endif /* !_SYS_UN_H_ */

I believe the failures are attributed to an error in the build.gradle.kts file which should check HostManager.hostIsMac before adding the definition.

Will rebase and fix!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants