stdio/FreeBSD/open_memstream.3 freebsd lib/libc/stdio/open_memstream.3 89c1fcc0d088065021703b658ef547f46b5481f0
stdio/FreeBSD/open_memstream.c freebsd lib/libc/stdio/open_memstream.c 89c1fcc0d088065021703b658ef547f46b5481f0
stdio/FreeBSD/open_wmemstream.c freebsd lib/libc/stdio/open_wmemstream.c 89c1fcc0d088065021703b658ef547f46b5481f0
+stdio/FreeBSD/makebuf.c freebsd lib/libc/stdio/makebuf.c c956a7530cd8282a920a11e1088adbb250169c06
+stdio/FreeBSD/makebuf.c netbsd lib/libc/stdio/makebuf.c 72b46443582ea9efbf25ede3b8f56c6646478d71
stdio/FreeBSD/mktemp.3 freebsd lib/libc/stdio/mktemp.3 2895e1352cf3788606924d800c3a5c589520ea00
stdio/FreeBSD/mktemp.c freebsd lib/libc/stdio/mktemp.c 2895e1352cf3788606924d800c3a5c589520ea00
stdio/FreeBSD/printf.3 freebsd lib/libc/stdio/printf.3 cfc3df2b8f708ce8494d9d556e3472a5c8c21b8a
3FD14575171D42B300B7BAF5 /* bcopy.c in Sources */ = {isa = PBXBuildFile; fileRef = 3FD14572171D42B300B7BAF5 /* bcopy.c */; settings = {COMPILER_FLAGS = "-momit-leaf-frame-pointer"; }; };
3FD14576171D42B300B7BAF5 /* bcopy.c in Sources */ = {isa = PBXBuildFile; fileRef = 3FD14572171D42B300B7BAF5 /* bcopy.c */; settings = {COMPILER_FLAGS = "-momit-leaf-frame-pointer"; }; };
3FD4D48E1472F4B200075CCE /* dirfd.c in Sources */ = {isa = PBXBuildFile; fileRef = 3FB7E1B4146EF2E000843438 /* dirfd.c */; };
+ 4B075C8E208BE9F200FD4F23 /* variant_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 926F73991E03E8D6001E049D /* variant_private.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B0899BC2046258F001360A4 /* cleanup.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B0899B920460FAC001360A4 /* cleanup.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B20DB4D202B81A4005C2327 /* bsd.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA6E56A202ACF7A00F38D3A /* bsd.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B20DB50202B81A4005C2327 /* err.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA6E563202AC0C200F38D3A /* err.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B20DB51202B81A4005C2327 /* errno.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA6E55B202AB1F100F38D3A /* errno.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B20DB52202B81A4005C2327 /* stdio.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA6E567202ACAFA00F38D3A /* stdio.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B20DB53202B81A4005C2327 /* stdlib.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA6E564202AC43700F38D3A /* stdlib.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B20DB54202B81A4005C2327 /* string.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BA6E55D202AB31100F38D3A /* string.h */; settings = {ATTRIBUTES = (Private, ); }; };
4B2C64A315519BC300342BFA /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
4B2C64A415519BC400342BFA /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
4B2C64A515519BC600342BFA /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
4B2C64A915519BC800342BFA /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
4B2C64AA15519BCB00342BFA /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
4B2C64BA1551B03700342BFA /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
- 6310518713D4D966004F7BA8 /* strcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518613D4D966004F7BA8 /* strcpy.c */; };
- 6310518A13D4D9E9004F7BA8 /* strcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518613D4D966004F7BA8 /* strcpy.c */; };
- 6310518C13D4DABD004F7BA8 /* strlcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518B13D4DABD004F7BA8 /* strlcpy.c */; };
- 6310518D13D4DABD004F7BA8 /* strlcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518B13D4DABD004F7BA8 /* strlcpy.c */; };
- 6310518F13D4DAEA004F7BA8 /* strncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518E13D4DAEA004F7BA8 /* strncpy.c */; };
- 6310519013D4DAEA004F7BA8 /* strncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518E13D4DAEA004F7BA8 /* strncpy.c */; };
- 63505E3B1548525D00B637D7 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = 63505E3A1548525D00B637D7 /* strnlen.s */; };
- 63505E3C1548525D00B637D7 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = 63505E3A1548525D00B637D7 /* strnlen.s */; };
- 63505E3D1548525D00B637D7 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = 63505E3A1548525D00B637D7 /* strnlen.s */; };
- 639D126A15595DDE00D0403A /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = 639D126615595DDE00D0403A /* strnlen.s */; };
- 639D126C15595DDE00D0403A /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = 639D126615595DDE00D0403A /* strnlen.s */; };
+ 4B4E643F2069E94A00C4D8D5 /* internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B2C50E41F8453FA005DA2B6 /* internal.h */; };
+ 4B69E81320800D47008D13D2 /* libdarwin_init.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B69E81220800BE9008D13D2 /* libdarwin_init.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B6CFC042065B9FF0022DBAD /* mach.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B6CFC032065B9FF0022DBAD /* mach.c */; };
+ 4B6D181D206DEFBD00C00E37 /* mach_exception.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6D181C206DEFBD00C00E37 /* mach_exception.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4B6D181F206DF1E200C00E37 /* exception.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D181E206DF1E200C00E37 /* exception.c */; };
+ 4B782979208926A80070E1FF /* api.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B782978208926A70070E1FF /* api.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4BA6E55F202AB35900F38D3A /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA6E55E202AB35900F38D3A /* string.c */; };
+ 4BA6E562202AC06300F38D3A /* err.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA6E561202AC06300F38D3A /* err.c */; };
+ 4BA6E566202AC94800F38D3A /* stdlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA6E565202AC94800F38D3A /* stdlib.c */; };
+ 4BA6E569202ACDAA00F38D3A /* stdio.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA6E568202ACDAA00F38D3A /* stdio.c */; };
+ 4BA6E56C202AD02900F38D3A /* bsd.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA6E56B202AD02900F38D3A /* bsd.c */; };
+ 4BCC350F20659AD500A4CBAA /* mach_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BCC350E20659AD500A4CBAA /* mach_utils.h */; settings = {ATTRIBUTES = (Private, ); }; };
63D4060613DDEDF10094DD56 /* stpcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060513DDEDF10094DD56 /* stpcpy.c */; };
63D4060813DDEDFF0094DD56 /* stpcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060513DDEDF10094DD56 /* stpcpy.c */; };
63D4060A13DDEEA20094DD56 /* stpncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060913DDEEA10094DD56 /* stpncpy.c */; };
63D4060E13DDF26A0094DD56 /* strcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060C13DDF26A0094DD56 /* strcat.c */; };
63D4061013DDF4340094DD56 /* strncat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060F13DDF4340094DD56 /* strncat.c */; };
63D4061113DDF4340094DD56 /* strncat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060F13DDF4340094DD56 /* strncat.c */; };
- 63D4061313DDF6A30094DD56 /* strlcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4061213DDF6A20094DD56 /* strlcat.c */; };
- 63D4061413DDF6A30094DD56 /* strlcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4061213DDF6A20094DD56 /* strlcat.c */; };
926F73981E03E8C4001E049D /* variant.c in Sources */ = {isa = PBXBuildFile; fileRef = 926F73971E03E8C4001E049D /* variant.c */; };
- 926F739A1E03E8D6001E049D /* variant_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 926F73991E03E8D6001E049D /* variant_private.h */; settings = {ATTRIBUTES = (Private, ); }; };
92767C841E0A7E2700AB9C76 /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 92767C821E0A7E2100AB9C76 /* init.c */; };
928841361EA75555001064D1 /* dirstat_collection.c in Sources */ = {isa = PBXBuildFile; fileRef = 928841341EA7554D001064D1 /* dirstat_collection.c */; };
92888B161EA5BE7400BA923E /* fmemopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 92888B0F1EA5BE6D00BA923E /* fmemopen.c */; };
B19C64621450F90200032373 /* sync_volume_np.c in Sources */ = {isa = PBXBuildFile; fileRef = B19C645B1450F90200032373 /* sync_volume_np.c */; };
B19C64631450F90200032373 /* sync_volume_np.c in Sources */ = {isa = PBXBuildFile; fileRef = B19C645B1450F90200032373 /* sync_volume_np.c */; };
C0E343921C582ECB00E749C2 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53819138D9E990028D27C /* mcount.s */; };
- C0E343931C582ECB00E749C2 /* strcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383D138D9E990028D27C /* strcpy.s */; };
- C0E343941C582ECB00E749C2 /* strlcat.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383E138D9E990028D27C /* strlcat.s */; };
- C0E343951C582ECB00E749C2 /* strlcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383F138D9E990028D27C /* strlcpy.s */; };
- C0E343961C582ECB00E749C2 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53840138D9E990028D27C /* strlen.s */; };
- C0E343971C582ECB00E749C2 /* strncpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53842138D9E990028D27C /* strncpy.s */; };
- C0E343981C582ECB00E749C2 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535CF138D9E980028D27C /* strlen.s */; };
- C0E343991C582ECB00E749C2 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D2138D9E980028D27C /* strnlen.s */; };
- C0E3439A1C582ECB00E749C2 /* strstr.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D3138D9E980028D27C /* strstr.s */; };
C0E3439B1C582ECB00E749C2 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DF9138D9E9A0028D27C /* mcount.s */; };
- C0E3439C1C582ECB00E749C2 /* (null) in Sources */ = {isa = PBXBuildFile; };
- C0E3439D1C582ECB00E749C2 /* (null) in Sources */ = {isa = PBXBuildFile; };
- C0E3439E1C582ECB00E749C2 /* (null) in Sources */ = {isa = PBXBuildFile; };
- C0E3439F1C582ECB00E749C2 /* (null) in Sources */ = {isa = PBXBuildFile; };
- C0E343A01C582ECB00E749C2 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C0E343A11C582ECB00E749C2 /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C0E343A21C582ECB00E749C2 /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C0E343A31C582ECB00E749C2 /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C0E345621C582ECB00E749C2 /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C0E345631C582ECB00E749C2 /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS"; }; };
C0E345641C582ECB00E749C2 /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C0E345651C582ECB00E749C2 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C0E345661C582ECB00E749C2 /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C0E345671C582ECB00E749C2 /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C0E345681C582ECB00E749C2 /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C0E3456B1C582ECB00E749C2 /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C0E3456C1C582ECB00E749C2 /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C0E3456D1C582ECB00E749C2 /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_STRERROR"; }; };
- C0E3456E1C582ECB00E749C2 /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C0E3456F1C582ECB00E749C2 /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C0E345701C582ECB00E749C2 /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C0E345711C582ECB00E749C2 /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C0E345721C582ECB00E749C2 /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C0E345731C582ECB00E749C2 /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C0E345741C582ECB00E749C2 /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C0E345751C582ECB00E749C2 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C0E345761C582ECB00E749C2 /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C0E345771C582ECB00E749C2 /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C0E345781C582ECB00E749C2 /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C0E345791C582ECB00E749C2 /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C0E3457A1C582ECB00E749C2 /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C0E3457B1C582ECB00E749C2 /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C0E345C11C582ECB00E749C2 /* (null) in Sources */ = {isa = PBXBuildFile; };
C0E345C21C582ECB00E749C2 /* (null) in Sources */ = {isa = PBXBuildFile; };
C0E345C31C582ECB00E749C2 /* scandir_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB350E138F769B0075BB52 /* scandir_b.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -include gen/__dirent.h"; }; };
- C0E345CA1C582ECB00E749C2 /* strcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518613D4D966004F7BA8 /* strcpy.c */; };
- C0E345CB1C582ECB00E749C2 /* strlcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518B13D4DABD004F7BA8 /* strlcpy.c */; };
- C0E345CC1C582ECB00E749C2 /* strncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518E13D4DAEA004F7BA8 /* strncpy.c */; };
C0E345CD1C582ECB00E749C2 /* stpcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060513DDEDF10094DD56 /* stpcpy.c */; };
C0E345CE1C582ECB00E749C2 /* stpncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060913DDEEA10094DD56 /* stpncpy.c */; };
C0E345CF1C582ECB00E749C2 /* strcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060C13DDF26A0094DD56 /* strcat.c */; };
C0E345D01C582ECB00E749C2 /* strncat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060F13DDF4340094DD56 /* strncat.c */; };
- C0E345D11C582ECB00E749C2 /* strlcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4061213DDF6A20094DD56 /* strlcat.c */; };
C0E345D21C582ECB00E749C2 /* sync_volume_np.c in Sources */ = {isa = PBXBuildFile; fileRef = B19C645B1450F90200032373 /* sync_volume_np.c */; };
C0E345D31C582ECB00E749C2 /* dirfd.c in Sources */ = {isa = PBXBuildFile; fileRef = 3FB7E1B4146EF2E000843438 /* dirfd.c */; };
C0E345D41C582ECB00E749C2 /* eos_stubs.c in Sources */ = {isa = PBXBuildFile; fileRef = C925D1FB151805C6003D315B /* eos_stubs.c */; };
- C0E345D51C582ECB00E749C2 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = 63505E3A1548525D00B637D7 /* strnlen.s */; };
C0E345D61C582ECB00E749C2 /* assumes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B2C64A215519BAF00342BFA /* assumes.c */; };
C0E345D71C582ECB00E749C2 /* inet_ntop.c in Sources */ = {isa = PBXBuildFile; fileRef = FC2ED60E157D4BE70098EC69 /* inet_ntop.c */; };
C0E345D81C582ECB00E749C2 /* inet_pton.c in Sources */ = {isa = PBXBuildFile; fileRef = FC2ED60F157D4BE70098EC69 /* inet_pton.c */; };
C9257F5C138E1C9700B3107C /* ascii.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53902138D9E990028D27C /* ascii.c */; };
C9257F5D138E1C9700B3107C /* big5.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53905138D9E990028D27C /* big5.c */; };
C9257F5E138E1C9700B3107C /* btowc.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53909138D9E990028D27C /* btowc.c */; };
- C9257F5F138E1C9700B3107C /* collate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B5390B138D9E990028D27C /* collate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS $(COLLATE_C_CFLAGS_$(PLATFORM_NAME)_$(CURRENT_ARCH))"; }; };
+ C9257F5F138E1C9700B3107C /* collate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B5390B138D9E990028D27C /* collate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS"; }; };
C9257F60138E1C9700B3107C /* collcmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B5390F138D9E990028D27C /* collcmp.c */; };
C9257F61138E1C9700B3107C /* euc.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53916138D9E990028D27C /* euc.c */; };
C9257F62138E1C9700B3107C /* fix_grouping.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53918138D9E990028D27C /* fix_grouping.c */; };
C925800A138E1CC000B3107C /* strptime.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD3138D9E9A0028D27C /* strptime.c */; };
C925800B138E1CC000B3107C /* time32.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD6138D9E9A0028D27C /* time32.c */; };
C925800C138E1CC000B3107C /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
- C9258010138E1CD200B3107C /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C9258015138E1CD200B3107C /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C9258018138E1CD200B3107C /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C925801B138E1CD200B3107C /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C9258022138E1CD200B3107C /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C9258023138E1CD200B3107C /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C9258024138E1CD200B3107C /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; };
- C9258027138E1CD200B3107C /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C9258028138E1CD200B3107C /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C925802C138E1CD200B3107C /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C925802D138E1CD200B3107C /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C925802E138E1CD200B3107C /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C925802F138E1CD200B3107C /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C9258030138E1CD200B3107C /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C9258031138E1CD200B3107C /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C9258032138E1CD200B3107C /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C9258033138E1CD200B3107C /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C9258034138E1CD200B3107C /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C9258035138E1CD200B3107C /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C9258036138E1CD200B3107C /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C9258037138E1CD200B3107C /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C9421023138F2661004BA536 /* machdep_ldisdd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B536B8138D9E980028D27C /* machdep_ldisdd.c */; };
C9421024138F2661004BA536 /* machdep_ldisQ.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B536BA138D9E980028D27C /* machdep_ldisQ.c */; };
C9421025138F2661004BA536 /* machdep_ldisx.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B536BB138D9E980028D27C /* machdep_ldisx.c */; };
- C942103213900C8A004BA536 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C942103913900C8A004BA536 /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C942103A13900C8A004BA536 /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C942103B13900C8A004BA536 /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C942124413900C8A004BA536 /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C942124513900C8A004BA536 /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS"; }; };
C942124613900C8A004BA536 /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C942124A13900C8A004BA536 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C942124F13900C8A004BA536 /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C942125213900C8A004BA536 /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C942125513900C8A004BA536 /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C942125C13900C8A004BA536 /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C942125D13900C8A004BA536 /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C942125E13900C8A004BA536 /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_STRERROR"; }; };
- C942126113900C8A004BA536 /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C942126213900C8A004BA536 /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C942126613900C8A004BA536 /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C942126713900C8A004BA536 /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C942126813900C8A004BA536 /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C942126913900C8A004BA536 /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C942126A13900C8A004BA536 /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C942126B13900C8A004BA536 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C942126C13900C8A004BA536 /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C942126D13900C8A004BA536 /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C942126E13900C8A004BA536 /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C942126F13900C8A004BA536 /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C942127013900C8A004BA536 /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C942127113900C8A004BA536 /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C94212BB13900C8A004BA536 /* unparse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE3138D9E9A0028D27C /* unparse.c */; };
C94212C613900C8A004BA536 /* scandir_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB350E138F769B0075BB52 /* scandir_b.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -include gen/__dirent.h"; }; };
C94212E413901595004BA536 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DF9138D9E9A0028D27C /* mcount.s */; };
- C94212FA13901595004BA536 /* strcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53E17138D9E9A0028D27C /* strcpy.s */; };
- C94212FD13901595004BA536 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53E1A138D9E9A0028D27C /* strlen.s */; };
- C94212FF13901595004BA536 /* strncpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53E1C138D9E9A0028D27C /* strncpy.s */; };
- C942131E13903959004BA536 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535CF138D9E980028D27C /* strlen.s */; };
- C942132113903959004BA536 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D2138D9E980028D27C /* strnlen.s */; };
- C942132213903959004BA536 /* strstr.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D3138D9E980028D27C /* strstr.s */; };
C94213361390396E004BA536 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53819138D9E990028D27C /* mcount.s */; };
- C942134C1390396E004BA536 /* strcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383D138D9E990028D27C /* strcpy.s */; };
- C942134D1390396E004BA536 /* strlcat.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383E138D9E990028D27C /* strlcat.s */; };
- C942134E1390396E004BA536 /* strlcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383F138D9E990028D27C /* strlcpy.s */; };
- C942134F1390396E004BA536 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53840138D9E990028D27C /* strlen.s */; };
- C94213511390396E004BA536 /* strncpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53842138D9E990028D27C /* strncpy.s */; };
C95B7ED7138F3BEA004311DA /* rune.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53989138D9E990028D27C /* rune.c */; };
- C95B7EDD138F3C55004311DA /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C95B7EE4138F3C55004311DA /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C95B7EE5138F3C55004311DA /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C95B7EE6138F3C55004311DA /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C95B80EF138F3C55004311DA /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C95B80F0138F3C55004311DA /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; };
C95B80F1138F3C55004311DA /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C95B80F5138F3C55004311DA /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C95B80FA138F3C55004311DA /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C95B80FD138F3C55004311DA /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C95B8100138F3C55004311DA /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C95B8107138F3C55004311DA /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C95B8108138F3C55004311DA /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C95B8109138F3C55004311DA /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; };
- C95B810C138F3C55004311DA /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C95B810D138F3C55004311DA /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C95B8111138F3C55004311DA /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C95B8112138F3C55004311DA /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C95B8113138F3C55004311DA /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C95B8114138F3C55004311DA /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C95B8115138F3C55004311DA /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C95B8116138F3C55004311DA /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C95B8117138F3C55004311DA /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C95B8118138F3C55004311DA /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C95B8119138F3C55004311DA /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C95B811A138F3C55004311DA /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C95B811B138F3C55004311DA /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C95B811C138F3C55004311DA /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C95B8164138F3C55004311DA /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE1138D9E9A0028D27C /* parse.c */; };
C95B8165138F3C55004311DA /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE2138D9E9A0028D27C /* unpack.c */; };
C95B8166138F3C55004311DA /* unparse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE3138D9E9A0028D27C /* unparse.c */; };
- C95B8188138F52B0004311DA /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C95B818F138F52B0004311DA /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C95B8190138F52B0004311DA /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C95B8191138F52B0004311DA /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C95B839A138F52B0004311DA /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C95B839B138F52B0004311DA /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; };
C95B839C138F52B0004311DA /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C95B83A0138F52B0004311DA /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C95B83A5138F52B0004311DA /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C95B83A8138F52B0004311DA /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C95B83AB138F52B0004311DA /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C95B83B2138F52B0004311DA /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C95B83B3138F52B0004311DA /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C95B83B4138F52B0004311DA /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; };
- C95B83B7138F52B0004311DA /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C95B83B8138F52B0004311DA /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C95B83BC138F52B0004311DA /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C95B83BD138F52B0004311DA /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C95B83BE138F52B0004311DA /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C95B83BF138F52B0004311DA /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C95B83C0138F52B0004311DA /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C95B83C1138F52B0004311DA /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C95B83C2138F52B0004311DA /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C95B83C3138F52B0004311DA /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C95B83C4138F52B0004311DA /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C95B83C5138F52B0004311DA /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C95B83C6138F52B0004311DA /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C95B83C7138F52B0004311DA /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C95B840F138F52B0004311DA /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE1138D9E9A0028D27C /* parse.c */; };
C95B8410138F52B0004311DA /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE2138D9E9A0028D27C /* unpack.c */; };
C95B8411138F52B0004311DA /* unparse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE3138D9E9A0028D27C /* unparse.c */; };
- C95B842E138F53DB004311DA /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C95B8435138F53DB004311DA /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C95B8436138F53DB004311DA /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C95B8437138F53DB004311DA /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C95B8640138F53DB004311DA /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C95B8641138F53DB004311DA /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; };
C95B8642138F53DB004311DA /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C95B8646138F53DB004311DA /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C95B864B138F53DB004311DA /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C95B864E138F53DB004311DA /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C95B8651138F53DB004311DA /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C95B8658138F53DB004311DA /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C95B8659138F53DB004311DA /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C95B865A138F53DB004311DA /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; };
- C95B865D138F53DB004311DA /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C95B865E138F53DB004311DA /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C95B8662138F53DB004311DA /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C95B8663138F53DB004311DA /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C95B8664138F53DB004311DA /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C95B8665138F53DB004311DA /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C95B8666138F53DB004311DA /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C95B8667138F53DB004311DA /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C95B8668138F53DB004311DA /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C95B8669138F53DB004311DA /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C95B866A138F53DB004311DA /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C95B866B138F53DB004311DA /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C95B866C138F53DB004311DA /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C95B866D138F53DB004311DA /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C95B86B5138F53DB004311DA /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE1138D9E9A0028D27C /* parse.c */; };
C95B86B6138F53DB004311DA /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE2138D9E9A0028D27C /* unpack.c */; };
C95B86B7138F53DB004311DA /* unparse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE3138D9E9A0028D27C /* unparse.c */; };
- C9765EB2138EC61900741512 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C9765EB9138EC61900741512 /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C9765EBA138EC61900741512 /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C9765EBB138EC61900741512 /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C97660C4138EC61A00741512 /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C97660C5138EC61A00741512 /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; };
C97660C6138EC61A00741512 /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C97660CA138EC61A00741512 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C97660CF138EC61A00741512 /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C97660D2138EC61A00741512 /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C97660D5138EC61A00741512 /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C97660DC138EC61A00741512 /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C97660DD138EC61A00741512 /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C97660DE138EC61A00741512 /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; };
- C97660E1138EC61A00741512 /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C97660E2138EC61A00741512 /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C97660E6138EC61A00741512 /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C97660E7138EC61A00741512 /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C97660E8138EC61A00741512 /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C97660E9138EC61A00741512 /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C97660EA138EC61A00741512 /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C97660EB138EC61A00741512 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C97660EC138EC61A00741512 /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C97660ED138EC61A00741512 /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C97660EE138EC61A00741512 /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C97660EF138EC61A00741512 /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C97660F0138EC61A00741512 /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C97660F1138EC61A00741512 /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C976613A138EC61A00741512 /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE2138D9E9A0028D27C /* unpack.c */; };
C976613B138EC61A00741512 /* unparse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE3138D9E9A0028D27C /* unparse.c */; };
C97A6F291517AF53005E1998 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53819138D9E990028D27C /* mcount.s */; };
- C97A6F3F1517AF53005E1998 /* strcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383D138D9E990028D27C /* strcpy.s */; };
- C97A6F401517AF53005E1998 /* strlcat.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383E138D9E990028D27C /* strlcat.s */; };
- C97A6F411517AF53005E1998 /* strlcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383F138D9E990028D27C /* strlcpy.s */; };
- C97A6F421517AF53005E1998 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53840138D9E990028D27C /* strlen.s */; };
- C97A6F441517AF53005E1998 /* strncpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53842138D9E990028D27C /* strncpy.s */; };
- C97A6F5A1517AF53005E1998 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535CF138D9E980028D27C /* strlen.s */; };
- C97A6F5C1517AF53005E1998 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D2138D9E980028D27C /* strnlen.s */; };
- C97A6F5D1517AF53005E1998 /* strstr.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D3138D9E980028D27C /* strstr.s */; };
C97A6F6D1517AF53005E1998 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DF9138D9E9A0028D27C /* mcount.s */; };
C97A6F761517AF53005E1998 /* (null) in Sources */ = {isa = PBXBuildFile; };
C97A6F791517AF53005E1998 /* (null) in Sources */ = {isa = PBXBuildFile; };
C97A6F7A1517AF53005E1998 /* (null) in Sources */ = {isa = PBXBuildFile; };
C97A6F7E1517AF53005E1998 /* (null) in Sources */ = {isa = PBXBuildFile; };
- C97A6F8F1517AF53005E1998 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C97A6F961517AF53005E1998 /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C97A6F971517AF53005E1998 /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C97A6F981517AF53005E1998 /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C97A71821517AF53005E1998 /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C97A71831517AF53005E1998 /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS"; }; };
C97A71841517AF53005E1998 /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C97A71881517AF53005E1998 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C97A718D1517AF53005E1998 /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C97A71901517AF53005E1998 /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C97A71911517AF53005E1998 /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C97A71961517AF53005E1998 /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C97A71971517AF53005E1998 /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C97A71981517AF53005E1998 /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_STRERROR"; }; };
- C97A71991517AF53005E1998 /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C97A719A1517AF53005E1998 /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C97A719C1517AF53005E1998 /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C97A719D1517AF53005E1998 /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C97A719E1517AF53005E1998 /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C97A719F1517AF53005E1998 /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C97A71A01517AF53005E1998 /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C97A71A11517AF53005E1998 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C97A71A21517AF53005E1998 /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C97A71A31517AF53005E1998 /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C97A71A41517AF53005E1998 /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS)"; }; };
C97A71A51517AF53005E1998 /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C97A71A61517AF53005E1998 /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C97A71A71517AF53005E1998 /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C97A71F91517AF53005E1998 /* (null) in Sources */ = {isa = PBXBuildFile; };
C97A71FA1517AF53005E1998 /* (null) in Sources */ = {isa = PBXBuildFile; };
C97A71FD1517AF53005E1998 /* scandir_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB350E138F769B0075BB52 /* scandir_b.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -include gen/__dirent.h"; }; };
- C97A720D1517AF53005E1998 /* strcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518613D4D966004F7BA8 /* strcpy.c */; };
- C97A720E1517AF53005E1998 /* strlcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518B13D4DABD004F7BA8 /* strlcpy.c */; };
- C97A720F1517AF53005E1998 /* strncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6310518E13D4DAEA004F7BA8 /* strncpy.c */; };
C97A72101517AF53005E1998 /* stpcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060513DDEDF10094DD56 /* stpcpy.c */; };
C97A72111517AF53005E1998 /* stpncpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060913DDEEA10094DD56 /* stpncpy.c */; };
C97A72121517AF53005E1998 /* strcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060C13DDF26A0094DD56 /* strcat.c */; };
C97A72131517AF53005E1998 /* strncat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4060F13DDF4340094DD56 /* strncat.c */; };
- C97A72141517AF53005E1998 /* strlcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 63D4061213DDF6A20094DD56 /* strlcat.c */; };
C97A72161517AF53005E1998 /* sync_volume_np.c in Sources */ = {isa = PBXBuildFile; fileRef = B19C645B1450F90200032373 /* sync_volume_np.c */; };
C97A72171517AF53005E1998 /* dirfd.c in Sources */ = {isa = PBXBuildFile; fileRef = 3FB7E1B4146EF2E000843438 /* dirfd.c */; };
C98373971395989E00E5C052 /* OSMemoryNotification.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DAC138D9E9A0028D27C /* OSMemoryNotification.c */; };
C9AE91B81517D32200A2626C /* libvCancelable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D94360138EC3E300FB7ACC /* libvCancelable.a */; };
C9AE91B91517D32900A2626C /* libTRE.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B122F2AD1432B8E600AF95D0 /* libTRE.a */; };
C9B53E5E138DA5910028D27C /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DF9138D9E9A0028D27C /* mcount.s */; };
- C9B53E77138DA59F0028D27C /* strcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53E17138D9E9A0028D27C /* strcpy.s */; };
- C9B53E7A138DA59F0028D27C /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53E1A138D9E9A0028D27C /* strlen.s */; };
- C9B53E7C138DA59F0028D27C /* strncpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53E1C138D9E9A0028D27C /* strncpy.s */; };
C9C2A959138E025700287F00 /* sigaltstk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B5360C138D9E980028D27C /* sigaltstk.c */; };
C9C2A95A138E025700287F00 /* sigcompat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B5360E138D9E980028D27C /* sigcompat.c */; };
C9C2A97D138E058200287F00 /* brk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B5366E138D9E980028D27C /* brk.c */; };
C9D94359138EC0C600FB7ACC /* heapsort_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9D94357138EC0C600FB7ACC /* heapsort_b.c */; };
C9D9435A138EC0C600FB7ACC /* heapsort_r.c in Sources */ = {isa = PBXBuildFile; fileRef = C9D94358138EC0C600FB7ACC /* heapsort_r.c */; };
C9EB2F53138F68A80075BB52 /* mcount.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53819138D9E990028D27C /* mcount.s */; };
- C9EB2F72138F68A80075BB52 /* strcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383D138D9E990028D27C /* strcpy.s */; };
- C9EB2F73138F68A80075BB52 /* strlcat.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383E138D9E990028D27C /* strlcat.s */; };
- C9EB2F74138F68A80075BB52 /* strlcpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B5383F138D9E990028D27C /* strlcpy.s */; };
- C9EB2F75138F68A80075BB52 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53840138D9E990028D27C /* strlen.s */; };
- C9EB2F77138F68A80075BB52 /* strncpy.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B53842138D9E990028D27C /* strncpy.s */; };
- C9EB2F84138F68CB0075BB52 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
- C9EB2F99138F68CB0075BB52 /* strlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535CF138D9E980028D27C /* strlen.s */; };
- C9EB2F9C138F68CB0075BB52 /* strnlen.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D2138D9E980028D27C /* strnlen.s */; };
- C9EB2F9D138F68CB0075BB52 /* strstr.s in Sources */ = {isa = PBXBuildFile; fileRef = C9B535D3138D9E980028D27C /* strstr.s */; };
C9EB2FC1138F6BB00075BB52 /* merge_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB2FC0138F6BB00075BB52 /* merge_b.c */; };
C9EB2FC4138F6C5C0075BB52 /* psort.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB2FC3138F6C5C0075BB52 /* psort.c */; };
C9EB2FC7138F6CE10075BB52 /* psort_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB2FC5138F6CE10075BB52 /* psort_b.c */; settings = {COMPILER_FLAGS = "-DI_AM_PSORT_B"; }; };
C9EB2FC8138F6CE10075BB52 /* psort_r.c in Sources */ = {isa = PBXBuildFile; fileRef = C9EB2FC6138F6CE10075BB52 /* psort_r.c */; settings = {COMPILER_FLAGS = "-DI_AM_PSORT_R"; }; };
- C9EB2FCD138F6D880075BB52 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C9EB2FD4138F6D880075BB52 /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C9EB2FD5138F6D880075BB52 /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C9EB2FD6138F6D880075BB52 /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C9EB31DF138F6D880075BB52 /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C9EB31E0138F6D880075BB52 /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS"; }; };
C9EB31E1138F6D880075BB52 /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C9EB31E5138F6D880075BB52 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C9EB31EA138F6D880075BB52 /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C9EB31ED138F6D880075BB52 /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C9EB31F0138F6D880075BB52 /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C9EB31F7138F6D880075BB52 /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C9EB31F8138F6D880075BB52 /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C9EB31F9138F6D880075BB52 /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_STRERROR"; }; };
- C9EB31FC138F6D880075BB52 /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C9EB31FD138F6D880075BB52 /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C9EB3201138F6D880075BB52 /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C9EB3202138F6D880075BB52 /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C9EB3203138F6D880075BB52 /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C9EB3204138F6D880075BB52 /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C9EB3205138F6D880075BB52 /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C9EB3206138F6D880075BB52 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C9EB3207138F6D880075BB52 /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C9EB3208138F6D880075BB52 /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C9EB3209138F6D880075BB52 /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C9EB320A138F6D880075BB52 /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C9EB320B138F6D880075BB52 /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C9EB320C138F6D880075BB52 /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C9EB3254138F6D880075BB52 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE1138D9E9A0028D27C /* parse.c */; };
C9EB3255138F6D880075BB52 /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE2138D9E9A0028D27C /* unpack.c */; };
C9EB3256138F6D880075BB52 /* unparse.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53DE3138D9E9A0028D27C /* unparse.c */; };
- C9EB3274138F75580075BB52 /* init_cpu_capabilities.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */; };
C9EB327B138F75580075BB52 /* creat.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535F8138D9E980028D27C /* creat.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_CREAT"; }; };
C9EB327C138F75580075BB52 /* gethostid.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FC138D9E980028D27C /* gethostid.c */; };
C9EB327D138F75580075BB52 /* getwd.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B535FE138D9E980028D27C /* getwd.c */; };
C9EB3486138F75580075BB52 /* timelocal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CD7138D9E9A0028D27C /* timelocal.c */; };
C9EB3487138F75580075BB52 /* getdate.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE0138D9E9A0028D27C /* getdate.c */; settings = {COMPILER_FLAGS = "-D_DARWIN_UNLIMITED_STREAMS"; }; };
C9EB3488138F75580075BB52 /* timezone_unix03.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CE3138D9E9A0028D27C /* timezone_unix03.c */; };
- C9EB348C138F75580075BB52 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CF7138D9E9A0028D27C /* index.c */; };
C9EB3491138F75580075BB52 /* memmem.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D06138D9E9A0028D27C /* memmem.c */; };
C9EB3494138F75580075BB52 /* rindex.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D10138D9E9A0028D27C /* rindex.c */; };
C9EB3497138F75580075BB52 /* strcasecmp.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D15138D9E9A0028D27C /* strcasecmp.c */; };
C9EB349E138F75580075BB52 /* strcspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D2D138D9E9A0028D27C /* strcspn.c */; };
C9EB349F138F75580075BB52 /* strdup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D30138D9E9A0028D27C /* strdup.c */; };
C9EB34A0138F75580075BB52 /* strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D33138D9E9A0028D27C /* strerror.c */; settings = {COMPILER_FLAGS = "$(FreeBSD_CFLAGS) -DLIBC_ALIAS_STRERROR"; }; };
- C9EB34A3138F75580075BB52 /* strlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D3C138D9E9A0028D27C /* strlen.c */; };
C9EB34A4138F75580075BB52 /* strmode.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D40138D9E9A0028D27C /* strmode.c */; };
C9EB34A8138F75580075BB52 /* strndup.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D44138D9E9A0028D27C /* strndup.c */; };
- C9EB34A9138F75580075BB52 /* strnlen.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D45138D9E9A0028D27C /* strnlen.c */; };
C9EB34AA138F75580075BB52 /* strnstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D46138D9E9A0028D27C /* strnstr.c */; };
C9EB34AB138F75580075BB52 /* strpbrk.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D49138D9E9A0028D27C /* strpbrk.c */; };
C9EB34AC138F75580075BB52 /* strrchr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4C138D9E9A0028D27C /* strrchr.c */; };
C9EB34AD138F75580075BB52 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D4F138D9E9A0028D27C /* strsep.c */; };
C9EB34AE138F75580075BB52 /* strsignal.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D50138D9E9A0028D27C /* strsignal.c */; };
C9EB34AF138F75580075BB52 /* strspn.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D54138D9E9A0028D27C /* strspn.c */; };
- C9EB34B0138F75580075BB52 /* strstr.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D57138D9E9A0028D27C /* strstr.c */; };
C9EB34B1138F75580075BB52 /* strtok.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5A138D9E9A0028D27C /* strtok.c */; };
C9EB34B2138F75580075BB52 /* strxfrm.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D5D138D9E9A0028D27C /* strxfrm.c */; };
C9EB34B3138F75580075BB52 /* swab.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53D61138D9E9A0028D27C /* swab.c */; };
C9FA334B138E4D040089A94B /* gcvt.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CB9138D9E9A0028D27C /* gcvt.c */; };
C9FA334C138E4D040089A94B /* qsort_b.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CBD138D9E9A0028D27C /* qsort_b.c */; };
C9FA334D138E4D0C0089A94B /* strfmon.c in Sources */ = {isa = PBXBuildFile; fileRef = C9B53CB2138D9E9A0028D27C /* strfmon.c */; };
+ E408425B20B585BF00CC87A7 /* forceLibcToBuild.c in Sources */ = {isa = PBXBuildFile; fileRef = C9D9432A138DB72000FB7ACC /* forceLibcToBuild.c */; };
FC2ED610157D4BE80098EC69 /* inet_ntop.c in Sources */ = {isa = PBXBuildFile; fileRef = FC2ED60E157D4BE70098EC69 /* inet_ntop.c */; };
FC2ED611157D4BE80098EC69 /* inet_ntop.c in Sources */ = {isa = PBXBuildFile; fileRef = FC2ED60E157D4BE70098EC69 /* inet_ntop.c */; };
FC2ED612157D4BE80098EC69 /* inet_ntop.c in Sources */ = {isa = PBXBuildFile; fileRef = FC2ED60E157D4BE70098EC69 /* inet_ntop.c */; };
/* Begin PBXFileReference section */
147CDFCF1B7C14FA00831EC6 /* clock_gettime.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = clock_gettime.3; sourceTree = "<group>"; };
147CDFD01B7C14FA00831EC6 /* clock_gettime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clock_gettime.c; sourceTree = "<group>"; };
+ 2B514AB3203E4D9500641A4B /* thread_stack_pcs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = thread_stack_pcs.h; sourceTree = "<group>"; };
2DF67CDD184F9CBE00B83A3D /* debug_private.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = debug_private.c; path = os/debug_private.c; sourceTree = "<group>"; };
2DF67CE7184F9CD000B83A3D /* debug_private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = debug_private.h; path = os/debug_private.h; sourceTree = "<group>"; };
+ 3006CB0E20BF7482003C5C79 /* _stdio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _stdio.h; sourceTree = "<group>"; };
3F169A3C1643B7BA0029E851 /* memccpy_chk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = memccpy_chk.c; sourceTree = "<group>"; };
3F18DE1F162A732C008B15AC /* memset_s.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = memset_s.3; sourceTree = "<group>"; };
3F18DE20162A732C008B15AC /* memset_s.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = memset_s.c; sourceTree = "<group>"; };
3FB7E1B4146EF2E000843438 /* dirfd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dirfd.c; sourceTree = "<group>"; };
3FD14572171D42B300B7BAF5 /* bcopy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bcopy.c; sourceTree = "<group>"; };
3FF283231A4764240098AD2C /* sim-compat-symlink.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "sim-compat-symlink.sh"; sourceTree = "<group>"; };
+ 4B0899B920460FAC001360A4 /* cleanup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cleanup.h; sourceTree = "<group>"; };
+ 4B151E0B1F8574B400F3F52F /* style.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = style.3; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.man; };
+ 4B2C50E41F8453FA005DA2B6 /* internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; };
4B2C64A215519BAF00342BFA /* assumes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = assumes.c; path = os/assumes.c; sourceTree = "<group>"; };
4B2C64AB15519C3400342BFA /* assumes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = assumes.h; path = os/assumes.h; sourceTree = "<group>"; };
- 6310518613D4D966004F7BA8 /* strcpy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strcpy.c; sourceTree = "<group>"; };
- 6310518B13D4DABD004F7BA8 /* strlcpy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strlcpy.c; sourceTree = "<group>"; };
- 6310518E13D4DAEA004F7BA8 /* strncpy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strncpy.c; sourceTree = "<group>"; };
- 63505E3A1548525D00B637D7 /* strnlen.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = strnlen.s; sourceTree = "<group>"; };
- 639D126615595DDE00D0403A /* strnlen.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = strnlen.s; sourceTree = "<group>"; };
+ 4B69E81220800BE9008D13D2 /* libdarwin_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libdarwin_init.h; sourceTree = "<group>"; };
+ 4B6CFC032065B9FF0022DBAD /* mach.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mach.c; sourceTree = "<group>"; };
+ 4B6D181C206DEFBD00C00E37 /* mach_exception.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mach_exception.h; sourceTree = "<group>"; };
+ 4B6D181E206DF1E200C00E37 /* exception.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = exception.c; sourceTree = "<group>"; };
+ 4B782978208926A70070E1FF /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api.h; path = os/api.h; sourceTree = "<group>"; };
+ 4BA6E55B202AB1F100F38D3A /* errno.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = errno.h; sourceTree = "<group>"; };
+ 4BA6E55D202AB31100F38D3A /* string.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = string.h; sourceTree = "<group>"; };
+ 4BA6E55E202AB35900F38D3A /* string.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = string.c; sourceTree = "<group>"; };
+ 4BA6E561202AC06300F38D3A /* err.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = err.c; sourceTree = "<group>"; };
+ 4BA6E563202AC0C200F38D3A /* err.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = "<group>"; };
+ 4BA6E564202AC43700F38D3A /* stdlib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdlib.h; sourceTree = "<group>"; };
+ 4BA6E565202AC94800F38D3A /* stdlib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = stdlib.c; sourceTree = "<group>"; };
+ 4BA6E567202ACAFA00F38D3A /* stdio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdio.h; sourceTree = "<group>"; };
+ 4BA6E568202ACDAA00F38D3A /* stdio.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = stdio.c; sourceTree = "<group>"; };
+ 4BA6E56A202ACF7A00F38D3A /* bsd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bsd.h; sourceTree = "<group>"; };
+ 4BA6E56B202AD02900F38D3A /* bsd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bsd.c; sourceTree = "<group>"; };
+ 4BCC350E20659AD500A4CBAA /* mach_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mach_utils.h; sourceTree = "<group>"; };
63D4060513DDEDF10094DD56 /* stpcpy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stpcpy.c; sourceTree = "<group>"; };
63D4060913DDEEA10094DD56 /* stpncpy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stpncpy.c; sourceTree = "<group>"; };
63D4060C13DDF26A0094DD56 /* strcat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strcat.c; sourceTree = "<group>"; };
63D4060F13DDF4340094DD56 /* strncat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strncat.c; sourceTree = "<group>"; };
- 63D4061213DDF6A20094DD56 /* strlcat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = strlcat.c; sourceTree = "<group>"; };
926F73921E03E2A3001E049D /* libsystem_darwin.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libsystem_darwin.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
926F73971E03E8C4001E049D /* variant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = variant.c; sourceTree = "<group>"; };
926F73991E03E8D6001E049D /* variant_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = variant_private.h; path = os/variant_private.h; sourceTree = "<group>"; };
B1795372158B0E35008990E8 /* xprintf_exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xprintf_exec.c; sourceTree = "<group>"; };
B19C64591450F8B900032373 /* sync_volume_np.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = sync_volume_np.3; sourceTree = "<group>"; };
B19C645B1450F90200032373 /* sync_volume_np.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sync_volume_np.c; sourceTree = "<group>"; };
- C00AC1181E04B7E000286B61 /* legacy_opendir_alias.list */ = {isa = PBXFileReference; lastKnownFileType = text; path = legacy_opendir_alias.list; sourceTree = "<group>"; };
C06E02D11CA0C9CA00B07322 /* tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = tests; sourceTree = "<group>"; };
C0E343811C58299D00E749C2 /* skip_installhdrs.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = skip_installhdrs.sh; sourceTree = "<group>"; };
C0E345E21C582ECB00E749C2 /* libc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libc.a; sourceTree = BUILT_PRODUCTS_DIR; };
C9A288A71ACDBA95004A33A7 /* Makefile.inc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.pascal; path = Makefile.inc; sourceTree = "<group>"; };
C9AE91AE1517CDAC00A2626C /* eos.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = eos.xcconfig; sourceTree = "<group>"; };
C9B535AE138D9E980028D27C /* APPLE_LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = APPLE_LICENSE; sourceTree = "<group>"; };
- C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = init_cpu_capabilities.c; sourceTree = "<group>"; };
- C9B535CF138D9E980028D27C /* strlen.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strlen.s; sourceTree = "<group>"; };
- C9B535D2138D9E980028D27C /* strnlen.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strnlen.s; sourceTree = "<group>"; };
- C9B535D3138D9E980028D27C /* strstr.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strstr.s; sourceTree = "<group>"; };
C9B535F7138D9E980028D27C /* creat.2 */ = {isa = PBXFileReference; lastKnownFileType = text; path = creat.2; sourceTree = "<group>"; };
C9B535F8138D9E980028D27C /* creat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = creat.c; sourceTree = "<group>"; };
C9B535FA138D9E980028D27C /* gethostid.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = gethostid.3; sourceTree = "<group>"; };
C9B5380B138D9E990028D27C /* gmon.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gmon.c; sourceTree = "<group>"; };
C9B5380D138D9E990028D27C /* moncontrol.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = moncontrol.3; sourceTree = "<group>"; };
C9B53819138D9E990028D27C /* mcount.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = mcount.s; sourceTree = "<group>"; };
- C9B5383D138D9E990028D27C /* strcpy.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strcpy.s; sourceTree = "<group>"; };
- C9B5383E138D9E990028D27C /* strlcat.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strlcat.s; sourceTree = "<group>"; };
- C9B5383F138D9E990028D27C /* strlcpy.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strlcpy.s; sourceTree = "<group>"; };
- C9B53840138D9E990028D27C /* strlen.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strlen.s; sourceTree = "<group>"; };
- C9B53842138D9E990028D27C /* strncpy.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strncpy.s; sourceTree = "<group>"; };
C9B53850138D9E990028D27C /* _locale.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _locale.h; sourceTree = "<group>"; };
C9B53852138D9E990028D27C /* _types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _types.h; sourceTree = "<group>"; };
C9B53853138D9E990028D27C /* _wctype.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _wctype.h; sourceTree = "<group>"; };
C9B53CED138D9E9A0028D27C /* bstring.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = bstring.3; sourceTree = "<group>"; };
C9B53CEF138D9E9A0028D27C /* bzero.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = bzero.3; sourceTree = "<group>"; };
C9B53CF5138D9E9A0028D27C /* index.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = index.3; sourceTree = "<group>"; };
- C9B53CF7138D9E9A0028D27C /* index.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = index.c; sourceTree = "<group>"; };
C9B53CF8138D9E9A0028D27C /* memccpy.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = memccpy.3; sourceTree = "<group>"; };
C9B53CFB138D9E9A0028D27C /* memchr.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = memchr.3; sourceTree = "<group>"; };
C9B53CFE138D9E9A0028D27C /* memcmp.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = memcmp.3; sourceTree = "<group>"; };
C9B53D35138D9E9A0028D27C /* string.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = string.3; sourceTree = "<group>"; };
C9B53D38138D9E9A0028D27C /* strlcpy.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strlcpy.3; sourceTree = "<group>"; };
C9B53D3B138D9E9A0028D27C /* strlen.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strlen.3; sourceTree = "<group>"; };
- C9B53D3C138D9E9A0028D27C /* strlen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strlen.c; sourceTree = "<group>"; };
C9B53D3E138D9E9A0028D27C /* strmode.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strmode.3; sourceTree = "<group>"; };
C9B53D40138D9E9A0028D27C /* strmode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strmode.c; sourceTree = "<group>"; };
C9B53D44138D9E9A0028D27C /* strndup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strndup.c; sourceTree = "<group>"; };
- C9B53D45138D9E9A0028D27C /* strnlen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strnlen.c; sourceTree = "<group>"; };
C9B53D46138D9E9A0028D27C /* strnstr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strnstr.c; sourceTree = "<group>"; };
C9B53D47138D9E9A0028D27C /* strpbrk.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strpbrk.3; sourceTree = "<group>"; };
C9B53D49138D9E9A0028D27C /* strpbrk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strpbrk.c; sourceTree = "<group>"; };
C9B53D52138D9E9A0028D27C /* strspn.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strspn.3; sourceTree = "<group>"; };
C9B53D54138D9E9A0028D27C /* strspn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strspn.c; sourceTree = "<group>"; };
C9B53D55138D9E9A0028D27C /* strstr.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strstr.3; sourceTree = "<group>"; };
- C9B53D57138D9E9A0028D27C /* strstr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strstr.c; sourceTree = "<group>"; };
C9B53D58138D9E9A0028D27C /* strtok.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strtok.3; sourceTree = "<group>"; };
C9B53D5A138D9E9A0028D27C /* strtok.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strtok.c; sourceTree = "<group>"; };
C9B53D5B138D9E9A0028D27C /* strxfrm.3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = strxfrm.3; sourceTree = "<group>"; };
C9B53DEB138D9E9A0028D27C /* uuid_unparse.3.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = uuid_unparse.3.in; sourceTree = "<group>"; };
C9B53DED138D9E9A0028D27C /* uuidP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = uuidP.h; sourceTree = "<group>"; };
C9B53DF9138D9E9A0028D27C /* mcount.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = mcount.s; sourceTree = "<group>"; };
- C9B53E17138D9E9A0028D27C /* strcpy.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strcpy.s; sourceTree = "<group>"; };
- C9B53E1A138D9E9A0028D27C /* strlen.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strlen.s; sourceTree = "<group>"; };
- C9B53E1C138D9E9A0028D27C /* strncpy.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = strncpy.s; sourceTree = "<group>"; };
C9B53E2C138DA0610028D27C /* libPlatform.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPlatform.a; sourceTree = BUILT_PRODUCTS_DIR; };
C9C2A948138DF7DD00287F00 /* libc.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = libc.xcconfig; sourceTree = "<group>"; };
C9C2A94D138DFFD900287F00 /* libBase.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBase.a; sourceTree = BUILT_PRODUCTS_DIR; };
path = NetBSD;
sourceTree = "<group>";
};
+ 4B2C50DE1F8453A6005DA2B6 /* h */ = {
+ isa = PBXGroup;
+ children = (
+ 4BA6E56A202ACF7A00F38D3A /* bsd.h */,
+ 4B0899B920460FAC001360A4 /* cleanup.h */,
+ 4BA6E563202AC0C200F38D3A /* err.h */,
+ 4BA6E55B202AB1F100F38D3A /* errno.h */,
+ 4B6D181C206DEFBD00C00E37 /* mach_exception.h */,
+ 4BCC350E20659AD500A4CBAA /* mach_utils.h */,
+ 4BA6E567202ACAFA00F38D3A /* stdio.h */,
+ 4BA6E564202AC43700F38D3A /* stdlib.h */,
+ 4BA6E55D202AB31100F38D3A /* string.h */,
+ 92D763E41EA6F887001467FC /* dirstat_collection.h */,
+ 92D763E51EA6F887001467FC /* dirstat.h */,
+ 4B69E81220800BE9008D13D2 /* libdarwin_init.h */,
+ );
+ path = h;
+ sourceTree = "<group>";
+ };
4B2C64A015519B0500342BFA /* os */ = {
isa = PBXGroup;
children = (
+ 4B782978208926A70070E1FF /* api.h */,
926F73991E03E8D6001E049D /* variant_private.h */,
2DF67CE7184F9CD000B83A3D /* debug_private.h */,
2DF67CDD184F9CBE00B83A3D /* debug_private.c */,
926F73961E03E8C4001E049D /* libdarwin */ = {
isa = PBXGroup;
children = (
+ 4B2C50DE1F8453A6005DA2B6 /* h */,
9280EA171E59BC8A007A6F58 /* AppleInternalVariant.plist */,
- 928841341EA7554D001064D1 /* dirstat_collection.c */,
- 92D763E41EA6F887001467FC /* dirstat_collection.h */,
+ 4B2C50E41F8453FA005DA2B6 /* internal.h */,
+ 4BA6E56B202AD02900F38D3A /* bsd.c */,
+ 4B6D181E206DF1E200C00E37 /* exception.c */,
+ 4BA6E561202AC06300F38D3A /* err.c */,
+ 4B6CFC032065B9FF0022DBAD /* mach.c */,
+ 4BA6E568202ACDAA00F38D3A /* stdio.c */,
+ 4BA6E565202AC94800F38D3A /* stdlib.c */,
+ 4BA6E55E202AB35900F38D3A /* string.c */,
92D763DC1EA6D9FB001467FC /* dirstat.c */,
- 92D763E51EA6F887001467FC /* dirstat.h */,
- 92767C821E0A7E2100AB9C76 /* init.c */,
+ 928841341EA7554D001064D1 /* dirstat_collection.c */,
926F73971E03E8C4001E049D /* variant.c */,
+ 92767C821E0A7E2100AB9C76 /* init.c */,
);
path = libdarwin;
sourceTree = "<group>";
C9B53595138D9A690028D27C = {
isa = PBXGroup;
children = (
- 926F73961E03E8C4001E049D /* libdarwin */,
C9B535AE138D9E980028D27C /* APPLE_LICENSE */,
C9B535AF138D9E980028D27C /* arm */,
- C9B535E2138D9E980028D27C /* arm64 */,
C9B535F5138D9E980028D27C /* compat-43 */,
C9B53612138D9E980028D27C /* darwin */,
C9B5361D138D9E980028D27C /* db */,
C9B5380A138D9E990028D27C /* gmon */,
C9B5380F138D9E990028D27C /* i386 */,
C9B5384F138D9E990028D27C /* include */,
+ 926F73961E03E8C4001E049D /* libdarwin */,
C9B538FE138D9E990028D27C /* locale */,
C9B53A04138D9E990028D27C /* man */,
C9B53A0E138D9E990028D27C /* nbsdcompat */,
isa = PBXGroup;
children = (
C9B535B0138D9E980028D27C /* gen */,
- C9B535BF138D9E980028D27C /* string */,
);
path = arm;
sourceTree = "<group>";
path = gen;
sourceTree = "<group>";
};
- C9B535BF138D9E980028D27C /* string */ = {
- isa = PBXGroup;
- children = (
- C9B535CF138D9E980028D27C /* strlen.s */,
- C9B535D2138D9E980028D27C /* strnlen.s */,
- C9B535D3138D9E980028D27C /* strstr.s */,
- );
- path = string;
- sourceTree = "<group>";
- };
- C9B535E2138D9E980028D27C /* arm64 */ = {
- isa = PBXGroup;
- children = (
- C9B535EB138D9E980028D27C /* string */,
- );
- path = arm64;
- sourceTree = "<group>";
- };
- C9B535EB138D9E980028D27C /* string */ = {
- isa = PBXGroup;
- children = (
- 63505E3A1548525D00B637D7 /* strnlen.s */,
- );
- path = string;
- sourceTree = "<group>";
- };
C9B535F5138D9E980028D27C /* compat-43 */ = {
isa = PBXGroup;
children = (
C9ECE2761950E384008E8672 /* atexit_receipt.c */,
92ABC7E81D375FC2000DF880 /* compatibility_hacks.c */,
C9D9432A138DB72000FB7ACC /* forceLibcToBuild.c */,
- C9B535B6138D9E980028D27C /* init_cpu_capabilities.c */,
C9B53616138D9E980028D27C /* kvm.c */,
FC960EF21850F33A005B9A9A /* libc_private.h */,
);
C9B537FE138D9E990028D27C /* tcsetattr.3 */,
C9B537FF138D9E990028D27C /* tcsetpgrp.3 */,
C9B53800138D9E990028D27C /* thread_stack_pcs.c */,
+ 2B514AB3203E4D9500641A4B /* thread_stack_pcs.h */,
C9B53801138D9E990028D27C /* tzset.3 */,
C9B53802138D9E990028D27C /* uname.3 */,
C9B53803138D9E990028D27C /* uname.c */,
isa = PBXGroup;
children = (
C9B53810138D9E990028D27C /* gen */,
- C9B53829138D9E990028D27C /* string */,
);
path = i386;
sourceTree = "<group>";
path = gen;
sourceTree = "<group>";
};
- C9B53829138D9E990028D27C /* string */ = {
- isa = PBXGroup;
- children = (
- C9B5383D138D9E990028D27C /* strcpy.s */,
- C9B5383E138D9E990028D27C /* strlcat.s */,
- C9B5383F138D9E990028D27C /* strlcpy.s */,
- C9B53840138D9E990028D27C /* strlen.s */,
- C9B53842138D9E990028D27C /* strncpy.s */,
- );
- path = string;
- sourceTree = "<group>";
- };
C9B5384F138D9E990028D27C /* include */ = {
isa = PBXGroup;
children = (
+ 3006CB0E20BF7482003C5C79 /* _stdio.h */,
C9B53850138D9E990028D27C /* _locale.h */,
FC60BAD016555A4A00033196 /* _types */,
C9B53852138D9E990028D27C /* _types.h */,
C9B53A0B138D9E990028D27C /* gethostuuid.2 */,
C9B53A0D138D9E990028D27C /* utmp.5 */,
C942135A13905D1C004BA536 /* manpages.lst */,
+ 4B151E0B1F8574B400F3F52F /* style.3 */,
);
path = man;
sourceTree = "<group>";
63D4060513DDEDF10094DD56 /* stpcpy.c */,
63D4060913DDEEA10094DD56 /* stpncpy.c */,
63D4060C13DDF26A0094DD56 /* strcat.c */,
- 6310518613D4D966004F7BA8 /* strcpy.c */,
- 63D4061213DDF6A20094DD56 /* strlcat.c */,
- 6310518B13D4DABD004F7BA8 /* strlcpy.c */,
63D4060F13DDF4340094DD56 /* strncat.c */,
- 6310518E13D4DAEA004F7BA8 /* strncpy.c */,
);
path = string;
sourceTree = "<group>";
C9B53CED138D9E9A0028D27C /* bstring.3 */,
C9B53CEF138D9E9A0028D27C /* bzero.3 */,
C9B53CF5138D9E9A0028D27C /* index.3 */,
- C9B53CF7138D9E9A0028D27C /* index.c */,
C9B53CF8138D9E9A0028D27C /* memccpy.3 */,
C9B53CFB138D9E9A0028D27C /* memchr.3 */,
C9B53CFE138D9E9A0028D27C /* memcmp.3 */,
C9B53D35138D9E9A0028D27C /* string.3 */,
C9B53D38138D9E9A0028D27C /* strlcpy.3 */,
C9B53D3B138D9E9A0028D27C /* strlen.3 */,
- C9B53D3C138D9E9A0028D27C /* strlen.c */,
C9B53D3E138D9E9A0028D27C /* strmode.3 */,
C9B53D40138D9E9A0028D27C /* strmode.c */,
C9B53D44138D9E9A0028D27C /* strndup.c */,
- C9B53D45138D9E9A0028D27C /* strnlen.c */,
C9B53D46138D9E9A0028D27C /* strnstr.c */,
C9B53D47138D9E9A0028D27C /* strpbrk.3 */,
C9B53D49138D9E9A0028D27C /* strpbrk.c */,
C9B53D52138D9E9A0028D27C /* strspn.3 */,
C9B53D54138D9E9A0028D27C /* strspn.c */,
C9B53D55138D9E9A0028D27C /* strstr.3 */,
- C9B53D57138D9E9A0028D27C /* strstr.c */,
C9B53D58138D9E9A0028D27C /* strtok.3 */,
C9B53D5A138D9E9A0028D27C /* strtok.c */,
C9B53D5B138D9E9A0028D27C /* strxfrm.3 */,
isa = PBXGroup;
children = (
C9B53DF0138D9E9A0028D27C /* gen */,
- C9B53E07138D9E9A0028D27C /* string */,
);
path = x86_64;
sourceTree = "<group>";
path = gen;
sourceTree = "<group>";
};
- C9B53E07138D9E9A0028D27C /* string */ = {
- isa = PBXGroup;
- children = (
- C9B53E17138D9E9A0028D27C /* strcpy.s */,
- C9B53E1A138D9E9A0028D27C /* strlen.s */,
- C9B53E1C138D9E9A0028D27C /* strncpy.s */,
- 639D126615595DDE00D0403A /* strnlen.s */,
- );
- path = string;
- sourceTree = "<group>";
- };
C9C2A946138DF66900287F00 /* xcodescripts */ = {
isa = PBXGroup;
children = (
E4A877A6174D82FB000DBB55 /* alias.list */,
- C00AC1181E04B7E000286B61 /* legacy_opendir_alias.list */,
C9C2A948138DF7DD00287F00 /* libc.xcconfig */,
C9766153138ECF0000741512 /* variants.xcconfig */,
C9AE91AE1517CDAC00A2626C /* eos.xcconfig */,
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
- 926F739A1E03E8D6001E049D /* variant_private.h in Headers */,
+ 4B6D181D206DEFBD00C00E37 /* mach_exception.h in Headers */,
+ 4B20DB4D202B81A4005C2327 /* bsd.h in Headers */,
+ 4B20DB50202B81A4005C2327 /* err.h in Headers */,
+ 4B20DB51202B81A4005C2327 /* errno.h in Headers */,
+ 4B20DB52202B81A4005C2327 /* stdio.h in Headers */,
+ 4B0899BC2046258F001360A4 /* cleanup.h in Headers */,
+ 4BCC350F20659AD500A4CBAA /* mach_utils.h in Headers */,
+ 4B20DB53202B81A4005C2327 /* stdlib.h in Headers */,
+ 4B69E81320800D47008D13D2 /* libdarwin_init.h in Headers */,
+ 4B782979208926A80070E1FF /* api.h in Headers */,
+ 4B20DB54202B81A4005C2327 /* string.h in Headers */,
+ 4B075C8E208BE9F200FD4F23 /* variant_private.h in Headers */,
+ 4B4E643F2069E94A00C4D8D5 /* internal.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
buildPhases = (
926F738E1E03E2A3001E049D /* Sources */,
926F738F1E03E2A3001E049D /* Frameworks */,
+ 3F55A4D72062412800C15893 /* Create public header path (safe to remove once we start installing public headers) */,
926F73901E03E2A3001E049D /* Headers */,
9280EA241E5A5D6F007A6F58 /* Copy AppleInternalVariant.plist */,
);
C9B53597138D9A690028D27C /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0700;
+ LastUpgradeCheck = 1000;
TargetAttributes = {
925E7FE619E8945900AC7889 = {
CreatedOnToolsVersion = 6.1;
shellScript = "perl \"$SRCROOT/xcodescripts/generate_features.pl\"";
showEnvVarsInLog = 0;
};
+ 3F55A4D72062412800C15893 /* Create public header path (safe to remove once we start installing public headers) */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Create public header path (safe to remove once we start installing public headers)";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = "/bin/bash -e -x";
+ shellScript = "mkdir -p ${TAPI_PUBLIC_HEADER_PATH}";
+ };
3FF283291A4764370098AD2C /* Simulator Build Compat Symlink */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 8;
files = (
);
inputPaths = (
+ "$(SRCROOT)/xcodescripts/skip_installhdrs.sh",
"$(SRCROOT)/xcodescripts/manpages.sh",
);
name = "Install Manpages";
);
runOnlyForDeploymentPostprocessing = 1;
shellPath = "/bin/bash -e";
- shellScript = ". \"${SCRIPT_INPUT_FILE_0}\"";
+ shellScript = ". \"${SCRIPT_INPUT_FILE_0}\" \"${SCRIPT_INPUT_FILE_1}\"";
showEnvVarsInLog = 0;
};
C95B7EDA138F3C55004311DA /* Generate libc-features.h */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 4B6CFC042065B9FF0022DBAD /* mach.c in Sources */,
926F73981E03E8C4001E049D /* variant.c in Sources */,
+ 4BA6E566202AC94800F38D3A /* stdlib.c in Sources */,
92D763E01EA6DA3A001467FC /* dirstat.c in Sources */,
+ 4BA6E569202ACDAA00F38D3A /* stdio.c in Sources */,
+ 4B6D181F206DF1E200C00E37 /* exception.c in Sources */,
92767C841E0A7E2700AB9C76 /* init.c in Sources */,
+ 4BA6E562202AC06300F38D3A /* err.c in Sources */,
+ 4BA6E56C202AD02900F38D3A /* bsd.c in Sources */,
928841361EA75555001064D1 /* dirstat_collection.c in Sources */,
+ 4BA6E55F202AB35900F38D3A /* string.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
buildActionMask = 2147483647;
files = (
C0E343921C582ECB00E749C2 /* mcount.s in Sources */,
- C0E343931C582ECB00E749C2 /* strcpy.s in Sources */,
- C0E343941C582ECB00E749C2 /* strlcat.s in Sources */,
- C0E343951C582ECB00E749C2 /* strlcpy.s in Sources */,
928BD1011D76072200EC01FC /* timingsafe_bcmp.c in Sources */,
- C0E343961C582ECB00E749C2 /* strlen.s in Sources */,
- C0E343971C582ECB00E749C2 /* strncpy.s in Sources */,
- C0E343981C582ECB00E749C2 /* strlen.s in Sources */,
- C0E343991C582ECB00E749C2 /* strnlen.s in Sources */,
- C0E3439A1C582ECB00E749C2 /* strstr.s in Sources */,
C0E3439B1C582ECB00E749C2 /* mcount.s in Sources */,
- C0E3439C1C582ECB00E749C2 /* (null) in Sources */,
- C0E3439D1C582ECB00E749C2 /* (null) in Sources */,
- C0E3439E1C582ECB00E749C2 /* (null) in Sources */,
- C0E3439F1C582ECB00E749C2 /* (null) in Sources */,
- C0E343A01C582ECB00E749C2 /* init_cpu_capabilities.c in Sources */,
C0E343A11C582ECB00E749C2 /* creat.c in Sources */,
C0E343A21C582ECB00E749C2 /* gethostid.c in Sources */,
C0E343A31C582ECB00E749C2 /* getwd.c in Sources */,
C0E345621C582ECB00E749C2 /* timelocal.c in Sources */,
C0E345631C582ECB00E749C2 /* getdate.c in Sources */,
C0E345641C582ECB00E749C2 /* timezone_unix03.c in Sources */,
- C0E345651C582ECB00E749C2 /* index.c in Sources */,
C0E345661C582ECB00E749C2 /* memmem.c in Sources */,
C0E345671C582ECB00E749C2 /* rindex.c in Sources */,
C0E345681C582ECB00E749C2 /* strcasecmp.c in Sources */,
C0E3456B1C582ECB00E749C2 /* strcspn.c in Sources */,
C0E3456C1C582ECB00E749C2 /* strdup.c in Sources */,
C0E3456D1C582ECB00E749C2 /* strerror.c in Sources */,
- C0E3456E1C582ECB00E749C2 /* strlen.c in Sources */,
C0E3456F1C582ECB00E749C2 /* strmode.c in Sources */,
C0E345701C582ECB00E749C2 /* strndup.c in Sources */,
- C0E345711C582ECB00E749C2 /* strnlen.c in Sources */,
C0E345721C582ECB00E749C2 /* strnstr.c in Sources */,
C0E345731C582ECB00E749C2 /* strpbrk.c in Sources */,
C0E345741C582ECB00E749C2 /* strrchr.c in Sources */,
C0E345751C582ECB00E749C2 /* strsep.c in Sources */,
C0E345761C582ECB00E749C2 /* strsignal.c in Sources */,
C0E345771C582ECB00E749C2 /* strspn.c in Sources */,
- C0E345781C582ECB00E749C2 /* strstr.c in Sources */,
C0E345791C582ECB00E749C2 /* strtok.c in Sources */,
C0E3457A1C582ECB00E749C2 /* strxfrm.c in Sources */,
C0E3457B1C582ECB00E749C2 /* swab.c in Sources */,
C0E345C11C582ECB00E749C2 /* (null) in Sources */,
C0E345C21C582ECB00E749C2 /* (null) in Sources */,
C0E345C31C582ECB00E749C2 /* scandir_b.c in Sources */,
- C0E345CA1C582ECB00E749C2 /* strcpy.c in Sources */,
- C0E345CB1C582ECB00E749C2 /* strlcpy.c in Sources */,
- C0E345CC1C582ECB00E749C2 /* strncpy.c in Sources */,
C0E345CD1C582ECB00E749C2 /* stpcpy.c in Sources */,
C0E345CE1C582ECB00E749C2 /* stpncpy.c in Sources */,
C0E345CF1C582ECB00E749C2 /* strcat.c in Sources */,
C0E345D01C582ECB00E749C2 /* strncat.c in Sources */,
- C0E345D11C582ECB00E749C2 /* strlcat.c in Sources */,
C0E345D21C582ECB00E749C2 /* sync_volume_np.c in Sources */,
C0E345D31C582ECB00E749C2 /* dirfd.c in Sources */,
C0E345D41C582ECB00E749C2 /* eos_stubs.c in Sources */,
- C0E345D51C582ECB00E749C2 /* strnlen.s in Sources */,
C0E345D61C582ECB00E749C2 /* assumes.c in Sources */,
C0E345D71C582ECB00E749C2 /* inet_ntop.c in Sources */,
C0E345D81C582ECB00E749C2 /* inet_pton.c in Sources */,
C925800A138E1CC000B3107C /* strptime.c in Sources */,
C925800B138E1CC000B3107C /* time32.c in Sources */,
C925800C138E1CC000B3107C /* timelocal.c in Sources */,
- C9258010138E1CD200B3107C /* index.c in Sources */,
C9258015138E1CD200B3107C /* memmem.c in Sources */,
C9258018138E1CD200B3107C /* rindex.c in Sources */,
C925801B138E1CD200B3107C /* strcasecmp.c in Sources */,
C9258022138E1CD200B3107C /* strcspn.c in Sources */,
C9258023138E1CD200B3107C /* strdup.c in Sources */,
C9258024138E1CD200B3107C /* strerror.c in Sources */,
- C9258027138E1CD200B3107C /* strlen.c in Sources */,
C9258028138E1CD200B3107C /* strmode.c in Sources */,
C925802C138E1CD200B3107C /* strndup.c in Sources */,
- C925802D138E1CD200B3107C /* strnlen.c in Sources */,
C925802E138E1CD200B3107C /* strnstr.c in Sources */,
C925802F138E1CD200B3107C /* strpbrk.c in Sources */,
C9258030138E1CD200B3107C /* strrchr.c in Sources */,
C9258031138E1CD200B3107C /* strsep.c in Sources */,
C9258032138E1CD200B3107C /* strsignal.c in Sources */,
C9258033138E1CD200B3107C /* strspn.c in Sources */,
- C9258034138E1CD200B3107C /* strstr.c in Sources */,
C9258035138E1CD200B3107C /* strtok.c in Sources */,
C9258036138E1CD200B3107C /* strxfrm.c in Sources */,
C9258037138E1CD200B3107C /* swab.c in Sources */,
buildActionMask = 2147483647;
files = (
C94213361390396E004BA536 /* mcount.s in Sources */,
- C942134C1390396E004BA536 /* strcpy.s in Sources */,
- C942134D1390396E004BA536 /* strlcat.s in Sources */,
- C942134E1390396E004BA536 /* strlcpy.s in Sources */,
- C942134F1390396E004BA536 /* strlen.s in Sources */,
- C94213511390396E004BA536 /* strncpy.s in Sources */,
- C942131E13903959004BA536 /* strlen.s in Sources */,
- C942132113903959004BA536 /* strnlen.s in Sources */,
- C942132213903959004BA536 /* strstr.s in Sources */,
C94212E413901595004BA536 /* mcount.s in Sources */,
- C94212FA13901595004BA536 /* strcpy.s in Sources */,
- C94212FD13901595004BA536 /* strlen.s in Sources */,
- C94212FF13901595004BA536 /* strncpy.s in Sources */,
- C942103213900C8A004BA536 /* init_cpu_capabilities.c in Sources */,
C942103913900C8A004BA536 /* creat.c in Sources */,
C942103A13900C8A004BA536 /* gethostid.c in Sources */,
C942103B13900C8A004BA536 /* getwd.c in Sources */,
C942124413900C8A004BA536 /* timelocal.c in Sources */,
C942124513900C8A004BA536 /* getdate.c in Sources */,
C942124613900C8A004BA536 /* timezone_unix03.c in Sources */,
- C942124A13900C8A004BA536 /* index.c in Sources */,
C942124F13900C8A004BA536 /* memmem.c in Sources */,
C942125213900C8A004BA536 /* rindex.c in Sources */,
C942125513900C8A004BA536 /* strcasecmp.c in Sources */,
C942125C13900C8A004BA536 /* strcspn.c in Sources */,
C942125D13900C8A004BA536 /* strdup.c in Sources */,
C942125E13900C8A004BA536 /* strerror.c in Sources */,
- C942126113900C8A004BA536 /* strlen.c in Sources */,
C942126213900C8A004BA536 /* strmode.c in Sources */,
C942126613900C8A004BA536 /* strndup.c in Sources */,
- C942126713900C8A004BA536 /* strnlen.c in Sources */,
C942126813900C8A004BA536 /* strnstr.c in Sources */,
C942126913900C8A004BA536 /* strpbrk.c in Sources */,
C942126A13900C8A004BA536 /* strrchr.c in Sources */,
C942126B13900C8A004BA536 /* strsep.c in Sources */,
C942126C13900C8A004BA536 /* strsignal.c in Sources */,
C942126D13900C8A004BA536 /* strspn.c in Sources */,
- C942126E13900C8A004BA536 /* strstr.c in Sources */,
C942126F13900C8A004BA536 /* strtok.c in Sources */,
C942127013900C8A004BA536 /* strxfrm.c in Sources */,
C942127113900C8A004BA536 /* swab.c in Sources */,
C94212BA13900C8A004BA536 /* unpack.c in Sources */,
C94212BB13900C8A004BA536 /* unparse.c in Sources */,
C94212C613900C8A004BA536 /* scandir_b.c in Sources */,
- 6310518713D4D966004F7BA8 /* strcpy.c in Sources */,
- 6310518C13D4DABD004F7BA8 /* strlcpy.c in Sources */,
- 6310518F13D4DAEA004F7BA8 /* strncpy.c in Sources */,
63D4060813DDEDFF0094DD56 /* stpcpy.c in Sources */,
63D4060A13DDEEA20094DD56 /* stpncpy.c in Sources */,
63D4060D13DDF26A0094DD56 /* strcat.c in Sources */,
63D4061013DDF4340094DD56 /* strncat.c in Sources */,
- 63D4061313DDF6A30094DD56 /* strlcat.c in Sources */,
B19C645C1450F90200032373 /* sync_volume_np.c in Sources */,
3FD4D48E1472F4B200075CCE /* dirfd.c in Sources */,
- 63505E3B1548525D00B637D7 /* strnlen.s in Sources */,
4B2C64A315519BC300342BFA /* assumes.c in Sources */,
FC2ED610157D4BE80098EC69 /* inet_ntop.c in Sources */,
FC2ED619157D4BE80098EC69 /* inet_pton.c in Sources */,
- 639D126A15595DDE00D0403A /* strnlen.s in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C95B7EDD138F3C55004311DA /* init_cpu_capabilities.c in Sources */,
C95B7EE4138F3C55004311DA /* creat.c in Sources */,
C95B7EE5138F3C55004311DA /* gethostid.c in Sources */,
C95B7EE6138F3C55004311DA /* getwd.c in Sources */,
C95B80EF138F3C55004311DA /* timelocal.c in Sources */,
C95B80F0138F3C55004311DA /* getdate.c in Sources */,
C95B80F1138F3C55004311DA /* timezone_unix03.c in Sources */,
- C95B80F5138F3C55004311DA /* index.c in Sources */,
C95B80FA138F3C55004311DA /* memmem.c in Sources */,
C95B80FD138F3C55004311DA /* rindex.c in Sources */,
C95B8100138F3C55004311DA /* strcasecmp.c in Sources */,
C95B8107138F3C55004311DA /* strcspn.c in Sources */,
C95B8108138F3C55004311DA /* strdup.c in Sources */,
C95B8109138F3C55004311DA /* strerror.c in Sources */,
- C95B810C138F3C55004311DA /* strlen.c in Sources */,
C95B810D138F3C55004311DA /* strmode.c in Sources */,
C95B8111138F3C55004311DA /* strndup.c in Sources */,
- C95B8112138F3C55004311DA /* strnlen.c in Sources */,
C95B8113138F3C55004311DA /* strnstr.c in Sources */,
C95B8114138F3C55004311DA /* strpbrk.c in Sources */,
C95B8115138F3C55004311DA /* strrchr.c in Sources */,
C95B8116138F3C55004311DA /* strsep.c in Sources */,
C95B8117138F3C55004311DA /* strsignal.c in Sources */,
C95B8118138F3C55004311DA /* strspn.c in Sources */,
- C95B8119138F3C55004311DA /* strstr.c in Sources */,
C95B811A138F3C55004311DA /* strtok.c in Sources */,
C95B811B138F3C55004311DA /* strxfrm.c in Sources */,
C95B811C138F3C55004311DA /* swab.c in Sources */,
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C95B8188138F52B0004311DA /* init_cpu_capabilities.c in Sources */,
C95B818F138F52B0004311DA /* creat.c in Sources */,
C95B8190138F52B0004311DA /* gethostid.c in Sources */,
C95B8191138F52B0004311DA /* getwd.c in Sources */,
C95B839A138F52B0004311DA /* timelocal.c in Sources */,
C95B839B138F52B0004311DA /* getdate.c in Sources */,
C95B839C138F52B0004311DA /* timezone_unix03.c in Sources */,
- C95B83A0138F52B0004311DA /* index.c in Sources */,
C95B83A5138F52B0004311DA /* memmem.c in Sources */,
C95B83A8138F52B0004311DA /* rindex.c in Sources */,
C95B83AB138F52B0004311DA /* strcasecmp.c in Sources */,
C95B83B2138F52B0004311DA /* strcspn.c in Sources */,
C95B83B3138F52B0004311DA /* strdup.c in Sources */,
C95B83B4138F52B0004311DA /* strerror.c in Sources */,
- C95B83B7138F52B0004311DA /* strlen.c in Sources */,
C95B83B8138F52B0004311DA /* strmode.c in Sources */,
C95B83BC138F52B0004311DA /* strndup.c in Sources */,
- C95B83BD138F52B0004311DA /* strnlen.c in Sources */,
C95B83BE138F52B0004311DA /* strnstr.c in Sources */,
C95B83BF138F52B0004311DA /* strpbrk.c in Sources */,
C95B83C0138F52B0004311DA /* strrchr.c in Sources */,
C95B83C1138F52B0004311DA /* strsep.c in Sources */,
C95B83C2138F52B0004311DA /* strsignal.c in Sources */,
C95B83C3138F52B0004311DA /* strspn.c in Sources */,
- C95B83C4138F52B0004311DA /* strstr.c in Sources */,
C95B83C5138F52B0004311DA /* strtok.c in Sources */,
C95B83C6138F52B0004311DA /* strxfrm.c in Sources */,
C95B83C7138F52B0004311DA /* swab.c in Sources */,
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C95B842E138F53DB004311DA /* init_cpu_capabilities.c in Sources */,
C95B8435138F53DB004311DA /* creat.c in Sources */,
C95B8436138F53DB004311DA /* gethostid.c in Sources */,
C95B8437138F53DB004311DA /* getwd.c in Sources */,
C95B8640138F53DB004311DA /* timelocal.c in Sources */,
C95B8641138F53DB004311DA /* getdate.c in Sources */,
C95B8642138F53DB004311DA /* timezone_unix03.c in Sources */,
- C95B8646138F53DB004311DA /* index.c in Sources */,
C95B864B138F53DB004311DA /* memmem.c in Sources */,
C95B864E138F53DB004311DA /* rindex.c in Sources */,
C95B8651138F53DB004311DA /* strcasecmp.c in Sources */,
C95B8658138F53DB004311DA /* strcspn.c in Sources */,
C95B8659138F53DB004311DA /* strdup.c in Sources */,
C95B865A138F53DB004311DA /* strerror.c in Sources */,
- C95B865D138F53DB004311DA /* strlen.c in Sources */,
C95B865E138F53DB004311DA /* strmode.c in Sources */,
C95B8662138F53DB004311DA /* strndup.c in Sources */,
- C95B8663138F53DB004311DA /* strnlen.c in Sources */,
C95B8664138F53DB004311DA /* strnstr.c in Sources */,
C95B8665138F53DB004311DA /* strpbrk.c in Sources */,
C95B8666138F53DB004311DA /* strrchr.c in Sources */,
C95B8667138F53DB004311DA /* strsep.c in Sources */,
C95B8668138F53DB004311DA /* strsignal.c in Sources */,
C95B8669138F53DB004311DA /* strspn.c in Sources */,
- C95B866A138F53DB004311DA /* strstr.c in Sources */,
C95B866B138F53DB004311DA /* strtok.c in Sources */,
C95B866C138F53DB004311DA /* strxfrm.c in Sources */,
C95B866D138F53DB004311DA /* swab.c in Sources */,
buildActionMask = 2147483647;
files = (
C97A6F291517AF53005E1998 /* mcount.s in Sources */,
- C97A6F3F1517AF53005E1998 /* strcpy.s in Sources */,
- C97A6F401517AF53005E1998 /* strlcat.s in Sources */,
- C97A6F411517AF53005E1998 /* strlcpy.s in Sources */,
- C97A6F421517AF53005E1998 /* strlen.s in Sources */,
- C97A6F441517AF53005E1998 /* strncpy.s in Sources */,
- C97A6F5A1517AF53005E1998 /* strlen.s in Sources */,
- C97A6F5C1517AF53005E1998 /* strnlen.s in Sources */,
- C97A6F5D1517AF53005E1998 /* strstr.s in Sources */,
C97A6F6D1517AF53005E1998 /* mcount.s in Sources */,
C97A6F761517AF53005E1998 /* (null) in Sources */,
C97A6F791517AF53005E1998 /* (null) in Sources */,
C97A6F7A1517AF53005E1998 /* (null) in Sources */,
C97A6F7E1517AF53005E1998 /* (null) in Sources */,
- C97A6F8F1517AF53005E1998 /* init_cpu_capabilities.c in Sources */,
C97A6F961517AF53005E1998 /* creat.c in Sources */,
C97A6F971517AF53005E1998 /* gethostid.c in Sources */,
C97A6F981517AF53005E1998 /* getwd.c in Sources */,
C97A71821517AF53005E1998 /* timelocal.c in Sources */,
C97A71831517AF53005E1998 /* getdate.c in Sources */,
C97A71841517AF53005E1998 /* timezone_unix03.c in Sources */,
- C97A71881517AF53005E1998 /* index.c in Sources */,
C97A718D1517AF53005E1998 /* memmem.c in Sources */,
C97A71901517AF53005E1998 /* rindex.c in Sources */,
C97A71911517AF53005E1998 /* strcasecmp.c in Sources */,
C97A71961517AF53005E1998 /* strcspn.c in Sources */,
C97A71971517AF53005E1998 /* strdup.c in Sources */,
C97A71981517AF53005E1998 /* strerror.c in Sources */,
- C97A71991517AF53005E1998 /* strlen.c in Sources */,
C97A719A1517AF53005E1998 /* strmode.c in Sources */,
C97A719C1517AF53005E1998 /* strndup.c in Sources */,
- C97A719D1517AF53005E1998 /* strnlen.c in Sources */,
C97A719E1517AF53005E1998 /* strnstr.c in Sources */,
C97A719F1517AF53005E1998 /* strpbrk.c in Sources */,
C97A71A01517AF53005E1998 /* strrchr.c in Sources */,
C97A71A11517AF53005E1998 /* strsep.c in Sources */,
C97A71A21517AF53005E1998 /* strsignal.c in Sources */,
C97A71A31517AF53005E1998 /* strspn.c in Sources */,
- C97A71A41517AF53005E1998 /* strstr.c in Sources */,
C97A71A51517AF53005E1998 /* strtok.c in Sources */,
C97A71A61517AF53005E1998 /* strxfrm.c in Sources */,
C97A71A71517AF53005E1998 /* swab.c in Sources */,
C97A71F91517AF53005E1998 /* (null) in Sources */,
C97A71FA1517AF53005E1998 /* (null) in Sources */,
C97A71FD1517AF53005E1998 /* scandir_b.c in Sources */,
- C97A720D1517AF53005E1998 /* strcpy.c in Sources */,
- C97A720E1517AF53005E1998 /* strlcpy.c in Sources */,
- C97A720F1517AF53005E1998 /* strncpy.c in Sources */,
C97A72101517AF53005E1998 /* stpcpy.c in Sources */,
C97A72111517AF53005E1998 /* stpncpy.c in Sources */,
C97A72121517AF53005E1998 /* strcat.c in Sources */,
C97A72131517AF53005E1998 /* strncat.c in Sources */,
- C97A72141517AF53005E1998 /* strlcat.c in Sources */,
C97A72161517AF53005E1998 /* sync_volume_np.c in Sources */,
C97A72171517AF53005E1998 /* dirfd.c in Sources */,
C925D1FD1518F4A2003D315B /* eos_stubs.c in Sources */,
- 63505E3C1548525D00B637D7 /* strnlen.s in Sources */,
4B2C64A415519BC400342BFA /* assumes.c in Sources */,
FC2ED611157D4BE80098EC69 /* inet_ntop.c in Sources */,
FC2ED61A157D4BE80098EC69 /* inet_pton.c in Sources */,
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C9EB2F84138F68CB0075BB52 /* init_cpu_capabilities.c in Sources */,
- C9EB2F99138F68CB0075BB52 /* strlen.s in Sources */,
- C9EB2F9C138F68CB0075BB52 /* strnlen.s in Sources */,
- C9EB2F9D138F68CB0075BB52 /* strstr.s in Sources */,
+ E408425B20B585BF00CC87A7 /* forceLibcToBuild.c in Sources */,
C9EB2F53138F68A80075BB52 /* mcount.s in Sources */,
- C9EB2F72138F68A80075BB52 /* strcpy.s in Sources */,
- C9EB2F73138F68A80075BB52 /* strlcat.s in Sources */,
- C9EB2F74138F68A80075BB52 /* strlcpy.s in Sources */,
- C9EB2F75138F68A80075BB52 /* strlen.s in Sources */,
- C9EB2F77138F68A80075BB52 /* strncpy.s in Sources */,
C9B53E5E138DA5910028D27C /* mcount.s in Sources */,
- C9B53E77138DA59F0028D27C /* strcpy.s in Sources */,
- C9B53E7A138DA59F0028D27C /* strlen.s in Sources */,
- C9B53E7C138DA59F0028D27C /* strncpy.s in Sources */,
- 63505E3D1548525D00B637D7 /* strnlen.s in Sources */,
- 639D126C15595DDE00D0403A /* strnlen.s in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C9EB355C138F81A40075BB52 /* kvm.c in Sources */,
C98373971395989E00E5C052 /* OSMemoryNotification.c in Sources */,
C98373981395989E00E5C052 /* OSThermalNotification.c in Sources */,
- 6310518A13D4D9E9004F7BA8 /* strcpy.c in Sources */,
- 6310518D13D4DABD004F7BA8 /* strlcpy.c in Sources */,
- 6310519013D4DAEA004F7BA8 /* strncpy.c in Sources */,
63D4060613DDEDF10094DD56 /* stpcpy.c in Sources */,
63D4060B13DDEEA20094DD56 /* stpncpy.c in Sources */,
63D4060E13DDF26A0094DD56 /* strcat.c in Sources */,
63D4061113DDF4340094DD56 /* strncat.c in Sources */,
- 63D4061413DDF6A30094DD56 /* strlcat.c in Sources */,
B19C645D1450F90200032373 /* sync_volume_np.c in Sources */,
3FB7E1B5146EF2E000843438 /* dirfd.c in Sources */,
4B2C64BA1551B03700342BFA /* assumes.c in Sources */,
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C9765EB2138EC61900741512 /* init_cpu_capabilities.c in Sources */,
C9765EB9138EC61900741512 /* creat.c in Sources */,
C9765EBA138EC61900741512 /* gethostid.c in Sources */,
C9765EBB138EC61900741512 /* getwd.c in Sources */,
C97660C4138EC61A00741512 /* timelocal.c in Sources */,
C97660C5138EC61A00741512 /* getdate.c in Sources */,
C97660C6138EC61A00741512 /* timezone_unix03.c in Sources */,
- C97660CA138EC61A00741512 /* index.c in Sources */,
C97660CF138EC61A00741512 /* memmem.c in Sources */,
C97660D2138EC61A00741512 /* rindex.c in Sources */,
C97660D5138EC61A00741512 /* strcasecmp.c in Sources */,
C97660DC138EC61A00741512 /* strcspn.c in Sources */,
C97660DD138EC61A00741512 /* strdup.c in Sources */,
C97660DE138EC61A00741512 /* strerror.c in Sources */,
- C97660E1138EC61A00741512 /* strlen.c in Sources */,
C97660E2138EC61A00741512 /* strmode.c in Sources */,
C97660E6138EC61A00741512 /* strndup.c in Sources */,
- C97660E7138EC61A00741512 /* strnlen.c in Sources */,
C97660E8138EC61A00741512 /* strnstr.c in Sources */,
C97660E9138EC61A00741512 /* strpbrk.c in Sources */,
C97660EA138EC61A00741512 /* strrchr.c in Sources */,
C97660EB138EC61A00741512 /* strsep.c in Sources */,
C97660EC138EC61A00741512 /* strsignal.c in Sources */,
C97660ED138EC61A00741512 /* strspn.c in Sources */,
- C97660EE138EC61A00741512 /* strstr.c in Sources */,
C97660EF138EC61A00741512 /* strtok.c in Sources */,
C97660F0138EC61A00741512 /* strxfrm.c in Sources */,
C97660F1138EC61A00741512 /* swab.c in Sources */,
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C9EB2FCD138F6D880075BB52 /* init_cpu_capabilities.c in Sources */,
C9EB2FD4138F6D880075BB52 /* creat.c in Sources */,
C9EB2FD5138F6D880075BB52 /* gethostid.c in Sources */,
C9EB2FD6138F6D880075BB52 /* getwd.c in Sources */,
C9EB31DF138F6D880075BB52 /* timelocal.c in Sources */,
C9EB31E0138F6D880075BB52 /* getdate.c in Sources */,
C9EB31E1138F6D880075BB52 /* timezone_unix03.c in Sources */,
- C9EB31E5138F6D880075BB52 /* index.c in Sources */,
C9EB31EA138F6D880075BB52 /* memmem.c in Sources */,
C9EB31ED138F6D880075BB52 /* rindex.c in Sources */,
C9EB31F0138F6D880075BB52 /* strcasecmp.c in Sources */,
C9EB31F7138F6D880075BB52 /* strcspn.c in Sources */,
C9EB31F8138F6D880075BB52 /* strdup.c in Sources */,
C9EB31F9138F6D880075BB52 /* strerror.c in Sources */,
- C9EB31FC138F6D880075BB52 /* strlen.c in Sources */,
C9EB31FD138F6D880075BB52 /* strmode.c in Sources */,
C9EB3201138F6D880075BB52 /* strndup.c in Sources */,
- C9EB3202138F6D880075BB52 /* strnlen.c in Sources */,
C9EB3203138F6D880075BB52 /* strnstr.c in Sources */,
C9EB3204138F6D880075BB52 /* strpbrk.c in Sources */,
C9EB3205138F6D880075BB52 /* strrchr.c in Sources */,
C9EB3206138F6D880075BB52 /* strsep.c in Sources */,
C9EB3207138F6D880075BB52 /* strsignal.c in Sources */,
C9EB3208138F6D880075BB52 /* strspn.c in Sources */,
- C9EB3209138F6D880075BB52 /* strstr.c in Sources */,
C9EB320A138F6D880075BB52 /* strtok.c in Sources */,
C9EB320B138F6D880075BB52 /* strxfrm.c in Sources */,
C9EB320C138F6D880075BB52 /* swab.c in Sources */,
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C9EB3274138F75580075BB52 /* init_cpu_capabilities.c in Sources */,
C9EB327B138F75580075BB52 /* creat.c in Sources */,
C9EB327C138F75580075BB52 /* gethostid.c in Sources */,
C9EB327D138F75580075BB52 /* getwd.c in Sources */,
C9EB3486138F75580075BB52 /* timelocal.c in Sources */,
C9EB3487138F75580075BB52 /* getdate.c in Sources */,
C9EB3488138F75580075BB52 /* timezone_unix03.c in Sources */,
- C9EB348C138F75580075BB52 /* index.c in Sources */,
C9EB3491138F75580075BB52 /* memmem.c in Sources */,
C9EB3494138F75580075BB52 /* rindex.c in Sources */,
C9EB3497138F75580075BB52 /* strcasecmp.c in Sources */,
C9EB349E138F75580075BB52 /* strcspn.c in Sources */,
C9EB349F138F75580075BB52 /* strdup.c in Sources */,
C9EB34A0138F75580075BB52 /* strerror.c in Sources */,
- C9EB34A3138F75580075BB52 /* strlen.c in Sources */,
C9EB34A4138F75580075BB52 /* strmode.c in Sources */,
C9EB34A8138F75580075BB52 /* strndup.c in Sources */,
- C9EB34A9138F75580075BB52 /* strnlen.c in Sources */,
C9EB34AA138F75580075BB52 /* strnstr.c in Sources */,
C9EB34AB138F75580075BB52 /* strpbrk.c in Sources */,
C9EB34AC138F75580075BB52 /* strrchr.c in Sources */,
C9EB34AD138F75580075BB52 /* strsep.c in Sources */,
C9EB34AE138F75580075BB52 /* strsignal.c in Sources */,
C9EB34AF138F75580075BB52 /* strspn.c in Sources */,
- C9EB34B0138F75580075BB52 /* strstr.c in Sources */,
C9EB34B1138F75580075BB52 /* strtok.c in Sources */,
C9EB34B2138F75580075BB52 /* strxfrm.c in Sources */,
C9EB34B3138F75580075BB52 /* swab.c in Sources */,
3F5120EF16C3174300AFB431 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(BASE_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
- INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
3F5120F016C3174300AFB431 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(BASE_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
- INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
925E7FE719E8945A00AC7889 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
925E7FE819E8945A00AC7889 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"_LIBC_NO_FEATURE_VERIFICATION=1",
+ "DARWIN_BUILDING_LIBSYSTEM_DARWIN=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$($(TARGET_NAME)_SEARCH_PATHS)",
+ "$(DERIVED_FILES_DIR)/dtrace",
+ "$(SRCROOT_SEARCH_PATHS)",
+ "$(SYSTEM_FRAMEWORK_HEADERS)",
+ "$(SDKROOT)/usr/local/include",
+ "$(inherited)",
+ "$(PROJECT_DIR)/libdarwin/h",
+ );
LIBRARY_SEARCH_PATHS = /usr/lib/system;
+ LIBSYSTEM_DARWIN_LDFLAGS = "-all_load -nostdlib -L/usr/lib/system -umbrella System $(LIBCOMPILER_RT_LDFLAGS) $(LIBDYLD_LDFLAGS) $(LIBSYSCALL_LDFLAGS) $(LIBM_LDFLAGS) $(LIBMALLOC_LDFLAGS) $(LIBPLATFORM_LDFLAGS) $(LIBPTHREAD_LDFLAGS) $(LIBPLATFORM_LDFLAGS) $(LIBC_LDFLAGS) $(LIBDISPATCH_LDFLAGS) $(LIBXPC_LDFLAGS) -Wl,-upward-lsystem_trace";
OTHER_LDFLAGS = "$(LIBSYSTEM_DARWIN_LDFLAGS)";
+ OTHER_TAPI_FLAGS = "$(inherited) -extra-public-header $(SRCROOT)/libdarwin/h/dirstat.h -extra-public-header $(SRCROOT)/libdarwin/internal.h -DDARWIN_TAPI=1 -extra-public-header $(SRCROOT)/os/variant_private.h";
PRIVATE_HEADERS_FOLDER_PATH = "$(DARWIN_PRIVATE_HEADERS_FOLDER_PATH)";
PRODUCT_NAME = darwin;
- PUBLIC_HEADERS_FOLDER_PATH = "$(DARWIN_PUBLIC_HEADERS_FOLDER_PATH)";
SKIP_INSTALL = NO;
+ SUPPORTS_TEXT_BASED_API = YES;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"_LIBC_NO_FEATURE_VERIFICATION=1",
+ "DARWIN_BUILDING_LIBSYSTEM_DARWIN=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$($(TARGET_NAME)_SEARCH_PATHS)",
+ "$(DERIVED_FILES_DIR)/dtrace",
+ "$(SRCROOT_SEARCH_PATHS)",
+ "$(SYSTEM_FRAMEWORK_HEADERS)",
+ "$(SDKROOT)/usr/local/include",
+ "$(inherited)",
+ "$(PROJECT_DIR)/libdarwin/h",
+ );
LIBRARY_SEARCH_PATHS = /usr/lib/system;
+ LIBSYSTEM_DARWIN_LDFLAGS = "-all_load -nostdlib -L/usr/lib/system -umbrella System $(LIBCOMPILER_RT_LDFLAGS) $(LIBDYLD_LDFLAGS) $(LIBSYSCALL_LDFLAGS) $(LIBM_LDFLAGS) $(LIBMALLOC_LDFLAGS) $(LIBPLATFORM_LDFLAGS) $(LIBPTHREAD_LDFLAGS) $(LIBPLATFORM_LDFLAGS) $(LIBC_LDFLAGS) $(LIBDISPATCH_LDFLAGS) $(LIBXPC_LDFLAGS) -Wl,-upward-lsystem_trace";
OTHER_LDFLAGS = "$(LIBSYSTEM_DARWIN_LDFLAGS)";
+ OTHER_TAPI_FLAGS = "$(inherited) -extra-public-header $(SRCROOT)/libdarwin/h/dirstat.h -extra-public-header $(SRCROOT)/libdarwin/internal.h -DDARWIN_TAPI=1 -extra-public-header $(SRCROOT)/os/variant_private.h";
PRIVATE_HEADERS_FOLDER_PATH = "$(DARWIN_PRIVATE_HEADERS_FOLDER_PATH)";
PRODUCT_NAME = darwin;
- PUBLIC_HEADERS_FOLDER_PATH = "$(DARWIN_PUBLIC_HEADERS_FOLDER_PATH)";
SKIP_INSTALL = NO;
+ SUPPORTS_TEXT_BASED_API = YES;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
926F739F1E046E56001E049D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
926F73A01E046E56001E049D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
928F25D21BEACED7007B13C7 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
};
name = Debug;
};
928F25D31BEACED7007B13C7 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
};
name = Release;
};
B122F2AB1432B8E600AF95D0 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = (
"$(FreeBSD_EXCLUDED_SOURCE_GDTOA)",
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
- INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = TRE;
};
name = Debug;
B122F2AC1432B8E600AF95D0 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = (
"$(FreeBSD_EXCLUDED_SOURCE_GDTOA)",
EXECUTABLE_PREFIX = lib;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
- INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = TRE;
};
name = Release;
isa = XCBuildConfiguration;
baseConfigurationReference = C0E345E31C58300F00E749C2 /* libc_static.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
PRODUCT_NAME = "$(PRODUCT_NAME)";
};
name = Debug;
isa = XCBuildConfiguration;
baseConfigurationReference = C0E345E31C58300F00E749C2 /* libc_static.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
PRODUCT_NAME = "$(PRODUCT_NAME)";
};
name = Release;
C9257ED1138E1B5000B3107C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = (
"$(FreeBSD_EXCLUDED_SOURCE_GDTOA)",
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
- INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
C9257ED2138E1B5000B3107C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = (
"$(FreeBSD_EXCLUDED_SOURCE_GDTOA)",
EXECUTABLE_PREFIX = lib;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
- INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(FreeBSD_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
C9258103138E2D3100B3107C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(BASE_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
GCC_C_LANGUAGE_STANDARD = gnu11;
C9258104138E2D3100B3107C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(BASE_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
GCC_C_LANGUAGE_STANDARD = gnu11;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
BUILD_VARIANTS = normal;
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
BUILD_VARIANTS = normal;
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9AE91AE1517CDAC00A2626C /* eos.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
};
name = Debug;
};
isa = XCBuildConfiguration;
baseConfigurationReference = C9AE91AE1517CDAC00A2626C /* eos.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
};
name = Release;
};
isa = XCBuildConfiguration;
baseConfigurationReference = C9C2A948138DF7DD00287F00 /* libc.xcconfig */;
buildSettings = {
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ ONLY_ACTIVE_ARCH = YES;
};
name = Debug;
};
isa = XCBuildConfiguration;
baseConfigurationReference = C9C2A948138DF7DD00287F00 /* libc.xcconfig */;
buildSettings = {
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
};
name = Release;
};
C9B53E2E138DA0610028D27C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
EXCLUDED_SOURCE_FILE_NAMES = "*";
EXECUTABLE_PREFIX = lib;
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
C9B53E2F138DA0610028D27C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
EXCLUDED_SOURCE_FILE_NAMES = "*";
EXECUTABLE_PREFIX = lib;
INCLUDED_SOURCE_FILE_NAMES = "$(Platform_INCLUDED_SOURCE_FILE_NAMES)";
C9C2A94F138DFFDA00287F00 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(BASE_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
- INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
C9C2A950138DFFDA00287F00 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(BASE_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
- INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))";
+ INCLUDED_SOURCE_FILE_NAMES = "$(BASE_INCLUDED_SOURCE_FILE_NAMES)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
C9D94331138DB73300FB7ACC /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)";
PRODUCT_NAME = c;
SKIP_INSTALL = NO;
STRIP_INSTALLED_PRODUCT = YES;
+ SUPPORTS_TEXT_BASED_API = NO;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
C9D94332138DB73300FB7ACC /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)";
PRODUCT_NAME = c;
SKIP_INSTALL = NO;
STRIP_INSTALLED_PRODUCT = YES;
+ SUPPORTS_TEXT_BASED_API = NO;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
isa = XCBuildConfiguration;
baseConfigurationReference = C9766153138ECF0000741512 /* variants.xcconfig */;
buildSettings = {
+ CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
EXCLUDED_SOURCE_FILE_NAMES = "$(VARIANT_EXCLUDED_SOURCE_FILE_NAMES)";
EXECUTABLE_PREFIX = lib;
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)db.c 8.4 (Berkeley) 2/21/94";
#endif /* LIBC_SCCS and not lint */
dbp->seq = (int (*)())__dberr;
dbp->sync = (int (*)())__dberr;
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getcwd.c 8.5 (Berkeley) 2/7/95";
#endif /* LIBC_SCCS and not lint */
{
return __private_getcwd(pt, size, 1);
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93";
#endif /* LIBC_SCCS and not lint */
}
}
#endif
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)signal.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
return signal__(s, a, 0);
}
#endif /* __DYNAMIC__ */
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)timezone.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
"GMT%c%d:%02d",sign,zone / 60,zone % 60);
return(czone);
}
+#pragma clang diagnostic pop
.\" SUCH DAMAGE.
.\"
.\"
-.Dd February 15, 2007
+.Dd March 1, 2018
.Dt backtrace 3
-.Os "Mac OS X"
+.Os "Darwin"
.Sh NAME
.Nm backtrace ,
.Nm backtrace_symbols ,
-.Nm backtrace_symbols_fd
+.Nm backtrace_symbols_fd ,
+.Nm backtrace_image_offsets ,
+.Nm backtrace_from_fp
.Nd call stack backtrace and display functions
.Sh SYNOPSIS
.In execinfo.h
.Fa "int size"
.Fa "int fd"
.Fc
+.Ft void
+.Fo backtrace_image_offsets
+.Fa "void* const* array"
+.Fa "struct image_offset *image_offsets"
+.Fa "int size"
+.Fc
+.Ft int
+.Fo backtrace_from_fp
+.Fa "void* startfp"
+.Fa "void** array"
+.Fa "int size"
+.Fc
.Sh DESCRIPTION
These routines provide a mechanism to examine the current thread's call stack.
.Pp
but the resulting strings are immediately written to the file descriptor
.Fa fd ,
and are not returned.
+.Pp
+.Fn backtrace_image_offsets
+attempts to transform a call stack obtained by
+.Fn backtrace
+into an array of image offsets, for deferred symbolication. Each entry in the
+array has an offset relative to the
+.Li __TEXT
+section of the image with the given UUID. The results are written to
+.Fa image_offsets
+which should be an array of
+.Fa size
+length.
+.Pp
+.Fn backtrace_from_fp
+takes a backtrace of frames starting from the given frame pointer.
.Sh EXAMPLE
.Pp
#include <execinfo.h>
...
.Pp
.Sh HISTORY
-These functions first appeared in
-Mac OS X 10.5.
+.Fn backtrace ,
+.Fn backtrace_symbols ,
+and
+.Fn backtrace_symbols_fd
+first appeared in Mac OS X 10.5.
+.Fn backtrace_image_offsets
+and
+.Fn backtrace_from_fp
+first appeared macOS 10.14 and iOS 12.
.Sh SEE ALSO
.Xr dladdr 3 ,
.Xr malloc 3
#include <sys/uio.h>
#include <dlfcn.h>
+#include <errno.h>
+#include <mach-o/dyld_priv.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <uuid/uuid.h>
#include "stack_logging.h"
#include "execinfo.h"
+extern void _thread_stack_pcs(vm_address_t *buffer, unsigned max,
+ unsigned *nb, unsigned skip, void *startfp);
+
int backtrace(void** buffer, int size) {
- extern void _thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *nb, unsigned skip);
unsigned int num_frames;
- _thread_stack_pcs((vm_address_t*)buffer, size, &num_frames, 1);
+ _thread_stack_pcs((vm_address_t*)buffer, size, &num_frames, 1, NULL);
+ while (num_frames >= 1 && buffer[num_frames-1] == NULL) num_frames -= 1;
+ return num_frames;
+}
+
+int
+backtrace_from_fp(void *startfp, void **buffer, int size)
+{
+ unsigned int num_frames;
+ _thread_stack_pcs((vm_address_t*)buffer, size, &num_frames, 1, startfp);
while (num_frames >= 1 && buffer[num_frames-1] == NULL) num_frames -= 1;
return num_frames;
}
dladdr(buffer[i], &info);
iov[0].iov_len = _backtrace_snprintf(buf, sizeof(buf), i, buffer[i], &info);
-
+
writev(fd, iov, 2);
}
}
+
+void
+backtrace_image_offsets(void* const* buffer, struct image_offset *imgoffs, int size)
+{
+ struct dyld_image_uuid_offset infos[size];
+ _dyld_images_for_addresses(size, (const void **)buffer, infos);
+
+ for (int i = 0; i < size; i++) {
+ uuid_copy(imgoffs[i].uuid, infos[i].uuid);
+ imgoffs[i].offset = infos[i].offsetInImage;
+ };
+}
.Pp
.Fa clock_id
can be a value from
-one of 5 predefined values:
+one of 8 predefined values:
.Bl -tag -width Er
.It Dv CLOCK_REALTIME
the system's real time (i.e. wall time) clock, expressed as the amount of time
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
#include <sys/cdefs.h>
#include <unistd.h>
}
#endif
#endif /* BUILDING_VARIANT */
+
+#pragma clang diagnostic pop
#include <unistd.h>
#include <ctype.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#ifdef unused
static int error(int);
#endif // unused
(void)write(STDERR_FILENO, "\n", 1);
}
#endif // unused
+#pragma clang diagnostic pop
+
#include <sys/cdefs.h>
#include <Availability.h>
+#include <os/base.h>
+#include <os/availability.h>
+#include <stdint.h>
+#include <uuid/uuid.h>
__BEGIN_DECLS
int backtrace(void**,int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
+
+API_AVAILABLE(macosx(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT
+int backtrace_from_fp(void *startfp, void **array, int size);
+
char** backtrace_symbols(void* const*,int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
void backtrace_symbols_fd(void* const*,int,int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
+struct image_offset {
+ /*
+ * The UUID of the image.
+ */
+ uuid_t uuid;
+
+ /*
+ * The offset is relative to the __TEXT section of the image.
+ */
+ uint32_t offset;
+};
+
+API_AVAILABLE(macosx(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT
+void backtrace_image_offsets(void* const* array,
+ struct image_offset *image_offsets, int size);
+
__END_DECLS
#endif /* !_EXECINFO_H_ */
#endif /* __BLOCKS__ */
#include <malloc_private.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
static FTSENT *fts_alloc(FTS *, char *, ssize_t);
static FTSENT *fts_build(FTS *, int);
static void fts_lfree(FTSENT *);
errno = oerrno;
return (ret);
}
+#pragma clang diagnostic pop
#include <regex.h>
#include <limits.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
static char zapchar;
static FILE *tf;
}
return (1);
}
+#pragma clang diagnostic pop
+
/*
- * Copyright (c) 1999, 2007 Apple Inc. All rights reserved.
+ * Copyright (c) 1999-2018 Apple Inc. All rights reserved.
*
* @APPLE_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. 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,
* 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_LICENSE_HEADER_END@
*/
#include <stdlib.h>
#include "stack_logging.h"
+
#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__)
#define FP_LINK_OFFSET 1
-#elif defined(__ppc__) || defined(__ppc64__)
-#define FP_LINK_OFFSET 2
#else
-#error ********** Unimplemented architecture
+#error ********** Unimplemented architecture
#endif
+
#define INSTACK(a) ((a) >= stackbot && (a) <= stacktop)
-#if defined(__ppc__) || defined(__ppc64__) || defined(__x86_64__)
+#if defined(__x86_64__)
#define ISALIGNED(a) ((((uintptr_t)(a)) & 0xf) == 0)
-#elif defined(__arm__) || defined(__arm64__)
-#define ISALIGNED(a) ((((uintptr_t)(a)) & 0x1) == 0)
#elif defined(__i386__)
#define ISALIGNED(a) ((((uintptr_t)(a)) & 0xf) == 8)
+#elif defined(__arm__) || defined(__arm64__)
+#define ISALIGNED(a) ((((uintptr_t)(a)) & 0x1) == 0)
#endif
__private_extern__ __attribute__((noinline))
void
-_thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *nb, unsigned skip)
+_thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *nb,
+ unsigned skip, void *startfp)
{
- void *frame, *next;
- pthread_t self = pthread_self();
- void *stacktop = pthread_get_stackaddr_np(self);
- void *stackbot = stacktop - pthread_get_stacksize_np(self);
+ void *frame, *next;
+ pthread_t self = pthread_self();
+ void *stacktop = pthread_get_stackaddr_np(self);
+ void *stackbot = stacktop - pthread_get_stacksize_np(self);
- *nb = 0;
+ *nb = 0;
- /* make sure return address is never out of bounds */
- stacktop -= (FP_LINK_OFFSET + 1) * sizeof(void *);
+ /* make sure return address is never out of bounds */
+ stacktop -= (FP_LINK_OFFSET + 1) * sizeof(void *);
- /*
- * The original implementation called the first_frame_address() function,
- * which returned the stack frame pointer. The problem was that in ppc,
- * it was a leaf function, so no new stack frame was set up with
- * optimization turned on (while a new stack frame was set up without
- * optimization). We now inline the code to get the stack frame pointer,
- * so we are consistent about the stack frame.
- */
-#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__)
- frame = __builtin_frame_address(0);
-#elif defined(__ppc__) || defined(__ppc64__)
- /* __builtin_frame_address IS BROKEN IN BEAKER: RADAR #2340421 */
- __asm__ volatile("mr %0, r1" : "=r" (frame));
-#endif
- if(!INSTACK(frame) || !ISALIGNED(frame))
- return;
-#if defined(__ppc__) || defined(__ppc64__)
- /* back up the stack pointer up over the current stack frame */
- next = *(void **)frame;
- if(!INSTACK(next) || !ISALIGNED(next) || next <= frame)
- return;
- frame = next;
-#endif
- while (skip--) {
- next = *(void **)frame;
- if(!INSTACK(next) || !ISALIGNED(next) || next <= frame)
- return;
- frame = next;
- }
- while (max--) {
- buffer[*nb] = *(vm_address_t *)(((void **)frame) + FP_LINK_OFFSET);
- (*nb)++;
- next = *(void **)frame;
- if(!INSTACK(next) || !ISALIGNED(next) || next <= frame)
- return;
- frame = next;
- }
+ frame = __builtin_frame_address(0);
+ if(!INSTACK(frame) || !ISALIGNED(frame))
+ return;
+ while ((startfp && startfp >= *(void **)frame) || skip--) {
+ next = *(void **)frame;
+ if(!INSTACK(next) || !ISALIGNED(next) || next <= frame)
+ return;
+ frame = next;
+ }
+ while (max--) {
+ void *retaddr = (void *)*(vm_address_t *)
+ (((void **)frame) + FP_LINK_OFFSET);
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wint-conversion"
+ buffer[*nb] = retaddr;
+#pragma clang diagnostic pop
+ (*nb)++;
+ next = *(void **)frame;
+ if(!INSTACK(next) || !ISALIGNED(next) || next <= frame)
+ return;
+ frame = next;
+ }
}
+// Prevent thread_stack_pcs() from getting tail-call-optimized into
+// _thread_stack_pcs() on 64-bit environments, thus making the "number of hot
+// frames to skip" be more predictable, giving more consistent backtraces.
+//
+// See <rdar://problem/5364825> "stack logging: frames keep getting truncated"
+// for why this is necessary.
+__attribute__((disable_tail_calls))
void
thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *nb)
{
- _thread_stack_pcs(buffer, max, nb, 0);
-
- // The following prevents thread_stack_pcs() from getting tail-call-optimized into _thread_stack_pcs() on 64-bit environments,
- // thus making the "number of hot frames to skip" be more predictable, giving more consistent backtraces.
- // See <rdar://problem/5364825> "stack logging: frames keep getting truncated" for why this is necessary.
- __asm__ volatile("");
+ _thread_stack_pcs(buffer, max, nb, 0, NULL);
}
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * "Portions Copyright (c) 2004 Apple Computer, Inc. All Rights
+ * Reserved. 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 1.0 (the 'License'). You may not use this file
+ * except in compliance with the License. Please obtain a copy of the
+ * License at http://www.apple.com/publicsource 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 OR NON-INFRINGEMENT. Please see the
+ * License for the specific language governing rights and limitations
+ * under the License."
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef _LIBC_THREAD_STACK_PCS_H
+#define _LIBC_THREAD_STACK_PCS_H
+
+#include <sys/cdefs.h>
+#include <mach/vm_statistics.h>
+#include <mach/vm_types.h>
+
+__BEGIN_DECLS
+
+extern void thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *num);
+
+__END_DECLS
+
+#endif // _LIBC_THREAD_STACK_PCS_H
+++ /dev/null
-/*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-
-// ***************
-// * S T R C P Y *
-// ***************
-//
-// char *strcpy(const char *dst, const char *src);
-//
-// We optimize the move by doing it vector parallel. This introduces
-// a complication: if we blindly did vector load/stores until finding
-// a 0, we might get a spurious page fault by touching bytes past it.
-// To avoid this, we never do a load that crosses a page boundary,
-// and never store a byte we don't have to.
-//
-// We align the destination, because unaligned vector stores are slow.
-
- .text
- .globl _strcpy
-
- .align 4
-_strcpy: // char *strcpy(const char *dst, const char *src);
- pushl %edi
- movl 8(%esp),%edi // get dest ptr
- movl 12(%esp),%ecx // get source ptr
- movl %edi,%edx // copy dest ptr
- negl %edx
- andl $15,%edx // how many bytes to align dest ptr?
- jnz LLoopOverBytes // not aligned, so go do so
-
-
-// In order to avoid spurious page faults, we loop until nearing the source page
-// end. Then we revert to a byte-by-byte loop for 16 bytes until the page is crossed,
-// then resume the vector loop.
-// %ecx = source ptr (unaligned)
-// %edi = dest ptr (aligned)
-
-LNextChunk:
- movl %ecx,%eax // copy source ptr
- movl $4096,%edx
- andl $4095,%eax // get offset into source page
- subl %eax,%edx // get #bytes remaining in source page
- shrl $4,%edx // get #chunks till end of page
- jnz LLoopOverChunks // enter vector loop
- movl $16,%edx // move 16 bytes to cross page but keep dest aligned
- jmp LLoopOverBytes
-
-
-// Loop over bytes.
-// %ecx = source ptr
-// %edi = dest ptr
-// %edx = byte count
-
- .align 4,0x90 // align inner loops to optimize I-fetch
-LLoopOverBytes:
- movzb (%ecx),%eax // get source byte
- inc %ecx
- movb %al,(%edi) // pack into dest
- inc %edi
- testl %eax,%eax // 0?
- jz LDone // yes, we're done
- dec %edx // more to go?
- jnz LLoopOverBytes
-
- jmp LNextChunk // we've come to end of page
-
-
-// Loop over 16-byte chunks.
-// %ecx = source ptr (unaligned)
-// %edi = dest ptr (aligned)
-// %edx = chunk count
-
- .align 4,0x90 // align inner loops to optimize I-fetch
-LLoopOverChunks:
- movdqu (%ecx),%xmm1 // get source
- pxor %xmm0,%xmm0 // get some 0s
- addl $16,%ecx
- pcmpeqb %xmm1,%xmm0 // compare source to 0s
- pmovmskb %xmm0,%eax // get result mask for 0 check
- testl %eax,%eax // any 0s?
- jnz LFound0 // yes, exit loop
- movdqa %xmm1,(%edi) // no 0s so do aligned store into destination
- addl $16,%edi
- dec %edx // more to go?
- jnz LLoopOverChunks
-
- movl $16,%edx // move 16 bytes
- jmp LLoopOverBytes // cross page but keep dest aligned
-
-
-// Found a zero in the vector. Figure out where it is, and store the bytes
-// up to it.
-// %edi = dest ptr (aligned)
-// %eax = result mask
-// %xmm1 = source vector
-
-LFound0:
- bsf %eax,%edx // find first 0
- inc %edx // we need to store the 0 too
- test $16,%dl // was 0 last byte?
- jz 8f // no
- movdqa %xmm1,(%edi) // yes, store entire vector
- jmp LDone
-8:
- test $8,%dl // 8-byte store required?
- jz 4f // no
- movq %xmm1,(%edi) // pack in 8 low bytes
- psrldq $8,%xmm1 // then shift vector down 8 bytes
- addl $8,%edi
-4:
- test $4,%dl // 4-byte store required?
- jz 3f // no
- movd %xmm1,(%edi) // pack in 4 low bytes
- psrldq $4,%xmm1 // then shift vector down 4 bytes
- addl $4,%edi
-3:
- andl $3,%edx // more to go?
- jz LDone // no
- movd %xmm1,%eax // move remainders out of vector into %eax
-1: // loop on up to three bytes
- movb %al,(%edi) // pack in next byte
- shrl $8,%eax // shift next byte into position
- inc %edi
- dec %edx
- jnz 1b
-
-LDone:
- movl 8(%esp),%eax // original dest ptr is return value
- popl %edi
- ret
+++ /dev/null
-/*
- * Copyright (c) 2007 Apple Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-
-// *****************
-// * S T R L C A T *
-// *****************
-//
-// size_t strlcat(char *dst, const char *src, size_t size);
-//
-// We use SSE to do the initial strlen(), and word-parallel copies
-// to do the move. This appears to be faster than either all SSE
-// or all word-parallel, at least on Core2 class machines.
-//
-// Using 4- or 16-byte parallel loops introduce a complication:
-// if we blindly did parallel load/stores until finding
-// a 0, we might get a spurious page fault by touching bytes past it.
-// To avoid this, we never do a load that crosses a page boundary,
-// or store unnecessary bytes.
-//
-// The word parallel test for 0s relies on the following inobvious
-// but very efficient test:
-// x = dataWord + 0xFEFEFEFF
-// y = ~dataWord & 0x80808080
-// if (x & y) == 0 then no zero found
-// The test maps any non-zero byte to zero, and any zero byte to 0x80,
-// with one exception: 0x01 bytes preceeding the first zero are also
-// mapped to 0x80.
-//
-// On Core2 class machines, this algorithm seems to be faster than the
-// naive byte-by-byte version for operands longer than about 10 bytes.
-
- .text
- .globl _strlcat
-
- .align 4
-_strlcat: // size_t *strlcat(char *dst, const char *src, size_t size);
- pushl %edi
- pushl %esi
- pushl %ebx
- movl 16(%esp),%edi // get dest ptr
- movl 20(%esp),%esi // get source ptr
- movl 24(%esp),%ebx // get length of buffer
-
-
-// Use SSE to find the 0-byte at current end of buffer.
-// This is just a minor variant of strlen().
-
- movl %edi,%ecx // copy buffer ptr
- andl $(-16),%edi // 16-byte align buffer ptr
- pxor %xmm0,%xmm0 // get some 0s
- andl $15,%ecx // get #bytes in dq before start of buffer
- movl $16,%edx
- orl $(-1),%eax
- subl %ecx,%edx // #bytes from buffer start to end of dq
- subl %edx,%ebx // does buffer end before end of dq?
- jb LShortBuf1 // yes, drop into byte-by-byte mode
- movdqa (%edi),%xmm1 // get first aligned chunk of buffer
- addl $16,%edi
- pcmpeqb %xmm0,%xmm1 // check for 0s
- shl %cl,%eax // create mask for the bytes of aligned dq in operand
- pmovmskb %xmm1,%ecx // collect mask of 0-bytes
- andl %eax,%ecx // mask out any 0s that occur before buffer start
- jnz 2f // found end of buffer
-1:
- subl $16,%ebx // another dq in buffer?
- jb LShortBuf2 // no, drop into byte-by-byte mode
- movdqa (%edi),%xmm1 // get next chunk
- addl $16,%edi
- pcmpeqb %xmm0,%xmm1 // check for 0s
- pmovmskb %xmm1,%ecx // collect mask of 0-bytes
- testl %ecx,%ecx // any 0-bytes?
- jz 1b // no
-2:
- bsf %ecx,%edx // find first 1-bit (ie, first 0-byte)
- subl $16,%edi // back up ptr into buffer
- addl $16,%ebx // recover length remaining as of start of dq
- addl %edx,%edi // point to 0-byte
- subl %edx,%ebx // compute #bytes remaining in buffer
-
-
-// Copy byte-by-byte until source is 4-byte aligned.
-// %edi = points to 1st byte available in buffer
-// %esi = src ptr
-// %ebx = buffer length remaining (ie, starting at %edi)
-//
-// NB: the rest of this code is cut-and-pasted from strlcpy().
-
- movl %esi,%edx // copy source ptr
- negl %edx
- andl $3,%edx // how many bytes to align source ptr?
- jz LAligned // already aligned
-
-
-// Loop over bytes.
-// %edi = dest ptr
-// %esi = source ptr
-// %ebx = length remaining in buffer
-// %edx = number of bytes to copy (>0, may not fit in buffer)
-
-LLoopOverBytes:
- movzb (%esi),%eax // get source byte before checking buffer length
- testl %ebx,%ebx // buffer full?
- jz L0NotFound // yes
- inc %esi
- dec %ebx
- movb %al,(%edi) // pack into dest
- inc %edi
- testl %eax,%eax // 0?
- jz LDone // yes, done
- dec %edx // more to go?
- jnz LLoopOverBytes
-
-
-// Source is aligned. Loop over words until end of buffer. We
-// align the source, rather than the dest, to avoid getting spurious page faults.
-// %edi = dest ptr (unaligned)
-// %esi = source ptr (word aligned)
-// %ebx = length remaining in buffer
-
-LAligned:
- movl $5,%edx // if buffer almost exhausted, prepare to copy rest byte-by-byte
- cmpl $4,%ebx // enough for at least one word?
- jb LLoopOverBytes
-
-
-// Loop over words.
-// %edi = dest ptr (unaligned)
-// %esi = source ptr (word aligned)
-// %ebx = length remaining in buffer (>=4)
-
-LLoopOverWords:
- movl (%esi),%eax // get next 4 bytes of source
- subl $4,%ebx
- addl $4,%esi
- movl %eax,%edx // make 2 copies of word
- movl %eax,%ecx
- notl %edx // use magic word-parallel test for 0s
- addl $0xFEFEFEFF,%ecx
- andl $0x80808080,%edx
- testl %ecx,%edx
- jnz L0Found // one of the bytes of %eax is a 0
- movl %eax,(%edi) // pack 4 bytes into destination
- addl $4,%edi
- cmpl $4,%ebx // room in buffer for another word?
- jae LLoopOverWords // yes
-
- movl %ebx,%edx // copy leftovers in byte loop
- jmp LLoopOverBytes
-
-// Found a 0-byte in the word of source. Store a byte at a time until the 0.
-// %edi = dest ptr (unaligned)
-// %eax = last word of source, known to have a 0-byte
-
-LNextByte:
- shrl $8,%eax // next byte
-L0Found:
- movb %al,(%edi) // pack in next byte
- incl %edi
- testb %al,%al // 0?
- jnz LNextByte
-
-// Done storing string.
-// %edi = ptr to byte after 0-byte
-
-LDone:
- subl 16(%esp),%edi // subtract original dest ptr to get length stored
- decl %edi // don't count the 0-byte
- movl %edi,%eax // copy to return value
-LExit:
- popl %ebx
- popl %esi
- popl %edi
- ret
-
-// Buffer filled but 0-byte not found. We return the length of the buffer plus the length
-// of the source string. This is not optimized, as it is an error condition.
-// %edi = dest ptr (ie, 1 past end of buffer)
-// %esi = source ptr (ptr to 1st byte that does not fit)
-
-L0NotFound:
- movl 24(%esp),%eax // reload buffer length
- testl %eax,%eax // null?
- jz LScanSourceTo0 // yes, cannot store a 0
- xorl %edx,%edx // get a 0
- movb %dl,-1(%edi) // store a 0 at end of buffer to delimit string
-LScanSourceTo0:
- movzb (%esi),%edx // get next byte of source
- incl %esi
- incl %eax
- testl %edx,%edx // 0?
- jnz LScanSourceTo0
- decl %eax // don't count the 0-byte
- jmp LExit
-
-
-// Buffer too short to reach end of even one 16-byte aligned chunk.
-// %esi = src ptr
-
-LShortBuf1:
- movl 16(%esp),%edi // recover ptr to start of buffer
- movl 24(%esp),%ebx // recover buffer length
- jmp LShortBuf3
-
-
-// Out of aligned dq's of buffer, 0-byte still not found.
-// %esi = src ptr
-// %edi = 1st buffer byte not checked for 0
-// %ebx = length remaining - 16
-
-LShortBuf2:
- addl $16,%ebx // length remaining
-LShortBuf3:
- movl 24(%esp),%eax // recover original buffer length, in case 0-byte not found
- movl $17,%edx // buffer almost exhausted, prepare to copy byte-by-byte
-1:
- testl %ebx,%ebx // no 0s in buffer at all?
- jz LScanSourceTo0 // yes, cannot store a 0
- cmpb $0,(%edi) // is this the 0?
- jz LLoopOverBytes // yes, append source
- incl %edi
- decl %ebx
- jmp 1b // loop looking for 0
+++ /dev/null
-/*
- * Copyright (c) 2007 Apple Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-
-// *****************
-// * S T R L C P Y *
-// *****************
-//
-// size_t strlcpy(char *dst, const char *src, size_t size);
-//
-// We optimize the move by doing it word parallel. This introduces
-// a complication: if we blindly did word load/stores until finding
-// a 0, we might get a spurious page fault by touching bytes past it.
-// To avoid this, we never do a load that crosses a page boundary,
-// or store unnecessary bytes.
-//
-// The test for 0s relies on the following inobvious but very efficient
-// word-parallel test:
-// x = dataWord + 0xFEFEFEFF
-// y = ~dataWord & 0x80808080
-// if (x & y) == 0 then no zero found
-// The test maps any non-zero byte to zero, and any zero byte to 0x80,
-// with one exception: 0x01 bytes preceeding the first zero are also
-// mapped to 0x80.
-//
-// On Core2 class machines, this word-parallel implementation seems to
-// be slightly faster than using SSE up to about 100 bytes.
-// It is faster than the naive byte-by-byte implementation for
-// operands longer than about 8 bytes.
-
- .text
- .globl _strlcpy
-
- .align 4
-_strlcpy: // size_t *strlcpy(char *dst, const char *src, size_t size);
- pushl %edi
- pushl %esi
- pushl %ebx
- movl 16(%esp),%edi // get dest ptr
- movl 20(%esp),%esi // get source ptr
- movl 24(%esp),%ecx // get length of buffer
- movl %esi,%edx // copy source ptr
- negl %edx
- andl $3,%edx // how many bytes to align source ptr?
- jz LAligned // already aligned
-
-
-// Loop over bytes.
-// %edi = dest ptr
-// %esi = source ptr
-// %ecx = length remaining in buffer
-// %edx = number of bytes to copy (>0, may not fit in buffer)
-
-LLoopOverBytes:
- movzb (%esi),%eax // get source byte before checking buffer length
- testl %ecx,%ecx // buffer full?
- jz L0NotFound // yes
- inc %esi
- dec %ecx
- movb %al,(%edi) // pack into dest
- inc %edi
- testl %eax,%eax // 0?
- jz LDone // yes, done
- dec %edx // more to go?
- jnz LLoopOverBytes
-
-
-// Source is aligned. Loop over words until end of buffer. We
-// align the source, rather than the dest, to avoid getting spurious page faults.
-// %edi = dest ptr (unaligned)
-// %esi = source ptr (word aligned)
-// %ecx = length remaining in buffer
-
-LAligned:
- movl $5,%edx // if buffer almost exhausted, prepare to copy rest byte-by-byte
- cmpl $4,%ecx // enough for at least one word?
- jb LLoopOverBytes
-
-
-// Loop over words.
-// %edi = dest ptr (unaligned)
-// %esi = source ptr (word aligned)
-// %ecx = length remaining in buffer (>=4)
-
-LLoopOverWords:
- movl (%esi),%eax // get next 4 bytes of source
- subl $4,%ecx
- addl $4,%esi
- movl %eax,%edx // make 2 copies of word
- movl %eax,%ebx
- notl %edx // use magic word-parallel test for 0s
- addl $0xFEFEFEFF,%ebx
- andl $0x80808080,%edx
- testl %ebx,%edx
- jnz L0Found // one of the bytes of %eax is a 0
- movl %eax,(%edi) // pack 4 bytes into destination
- addl $4,%edi
- cmpl $4,%ecx // room in buffer for another word?
- jae LLoopOverWords // yes
-
- movl %ecx,%edx // copy leftovers in byte loop
- jmp LLoopOverBytes
-
-// Found a 0-byte in the word of source. Store a byte at a time until the 0.
-// %edi = dest ptr (unaligned)
-// %eax = last word of source, known to have a 0-byte
-
-LNextByte:
- shrl $8,%eax // next byte
-L0Found:
- movb %al,(%edi) // pack in next byte
- incl %edi
- testb %al,%al // 0?
- jnz LNextByte
-
-// Done storing string.
-// %edi = ptr to byte after 0-byte
-
-LDone:
- subl 16(%esp),%edi // subtract original dest ptr to get length stored
- decl %edi // don't count the 0-byte
- movl %edi,%eax // copy to return value
-LExit:
- popl %ebx
- popl %esi
- popl %edi
- ret
-
-// Buffer filled but 0-byte not found. We return the length of the source string.
-// This is not optimized, as it is an error condition.
-// %edi = dest ptr (ie, 1 past end of buffer)
-// %esi = source ptr (ptr to 1st byte that does not fit)
-
-L0NotFound:
- movl 24(%esp),%eax // reload buffer length
- testl %eax,%eax // null?
- jz 1f // yes, cannot store a 0
- xorl %edx,%edx // get a 0
- movb %dl,-1(%edi) // store a 0 at end of buffer to delimit string
-1:
- movzb (%esi),%edx // get next byte of source
- incl %esi
- incl %eax
- testl %edx,%edx // 0?
- jnz 1b
- decl %eax // don't count the 0-byte
- jmp LExit
+++ /dev/null
-/*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This 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 OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
-
-/*
- * Strlen, for processors with SSE3.
- *
- * Note that all memory references must be aligned, in order to avoid spurious
- * page faults. Thus we have to load the aligned 16-byte chunk containing the
- * first byte of the operand, then mask out false 0s that may occur before the
- * first byte.
- *
- * We favor the fall-through (ie, short operand) path.
- */
-
- .text
- .globl _strlen
- .align 4, 0x90
-_strlen: // size_t strlen(char *b);
- movl 4(%esp),%edx // get ptr to string
- pxor %xmm0,%xmm0 // zero %xmm0
- movl %edx,%ecx // copy ptr
- andl $(-16),%edx // 16-byte align ptr
- orl $(-1),%eax
- pcmpeqb (%edx),%xmm0 // check whole qw for 0s
- andl $15,%ecx // get #bytes in aligned dq before operand
- shl %cl,%eax // create mask for the bytes of aligned dq in operand
- pmovmskb %xmm0,%ecx // collect mask of 0-bytes
- andl %eax,%ecx // mask out any 0s that occur before 1st byte
- jz LEnterLoop // no 0-bytes (ie, 1-bits), so enter by-16 loop
-
-// We've found a 0-byte.
-// %edx = aligned address of 16-byte block containing the terminating 0-byte
-// %ecx = compare bit vector
-
-LFoundIt:
- bsf %ecx,%eax // find first 1-bit (ie, first 0-byte)
- movl 4(%esp),%ecx // recover ptr to 1st byte in string
- addl %edx,%eax // get address of the 0-byte
- subl %ecx,%eax // subtract address of 1st byte to get string length
- ret
-
-// Loop over aligned 16-byte blocks:
-// %edx = address of previous block
-
-LEnterLoop:
- pxor %xmm0,%xmm0 // get some 0-bytes
- addl $16,%edx // advance ptr
-LLoop:
- movdqa (%edx),%xmm1 // get next chunk
- addl $16,%edx
- pcmpeqb %xmm0,%xmm1 // check for 0s
- pmovmskb %xmm1,%ecx // collect mask of 0-bytes
- test %ecx,%ecx // any 0-bytes?
- jz LLoop // no 0-bytes, so get next dq
-
- subl $16,%edx // back up ptr
- jmp LFoundIt
-
-
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <machine/cpu_capabilities.h>
-
-
-// *****************
-// * S T R N C P Y *
-// *****************
-//
-// char *strncpy(const char *dst, const char *src, size_t n);
-//
-// We optimize the move by doing it vector parallel. This introduces
-// a complication: if we blindly did vector load/stores until finding
-// a 0, we might get a spurious page fault by touching bytes past it.
-// To avoid this, we never do a load that crosses a page boundary,
-// and never store a byte we don't have to.
-//
-// We align the destination, because unaligned vector stores are slow.
-//
-// Recall that strncpy() zero fills the remainder of the dest buffer,
-// and does not terminate the string if it's length is greater than or
-// equal to n.
-
-#define kShort 31 // too short to bother with vector loop
-
- .text
- .globl _strncpy
-
- .align 4
-_strncpy: // char *strncpy(const char *dst, const char *src, size_t n);
- pushl %edi
- pushl %esi
- movl 12(%esp),%edi // get dest ptr
- movl 16(%esp),%esi // get source ptr
- movl 20(%esp),%ecx // get length
- movl %edi,%edx // copy dest ptr
- negl %edx
- andl $15,%edx // how many bytes to align dest ptr?
- jnz LCheckShortCopy // align destination first
-
-
-// In order to avoid spurious page faults, we loop until nearing the source page
-// end. Then we revert to a byte-by-byte loop for 16 bytes until the page is crossed,
-// then resume the vector loop.
-// %esi = source ptr (unaligned)
-// %edi = dest ptr (aligned)
-// %ecx = buffer length remaining
-
-LNextChunk: // NB: can drop down to here
- movl %esi,%eax // copy source ptr
- movl $4096,%edx
- andl $4095,%eax // get offset into source page
- subl %eax,%edx // get #bytes remaining in source page
- cmpl %ecx,%edx // will buffer run out before the page end?
- cmova %ecx,%edx // get min(length remaining, bytes to page end)
- shrl $4,%edx // get #chunks till end of page
- jnz LLoopOverChunks // enter vector loop
-
-// We can't use the chunk loop yet. Check for short and empty buffers, then use byte loop.
-
-LCrossPage: // if buffer is large enough, cross source page
- movl $16,%edx // move 16 bytes to cross page but keep dest aligned
-LCheckShortCopy: // we propose to copy %edx bytes in byte loop
- cmpl $(kShort),%ecx // much left?
- ja LLoopOverBytes // yes, loop over bytes then more chunks
- movl %ecx,%edx // no, use the byte loop for everything
- testl %ecx,%ecx // have we filled buffer?
- jnz LLoopOverBytes // no
- jmp LDone
-
-
-// Loop over bytes.
-// %esi = source ptr
-// %edi = dest ptr
-// %ecx = buffer length remaining
-// %edx = count of bytes to loop over (<= buffer length)
-
- .align 4,0x90 // align inner loops to optimize I-fetch
-LLoopOverBytes:
- movzb (%esi),%eax // get source byte
- inc %esi
- dec %ecx // decrement length
- movb %al,(%edi) // pack into dest
- inc %edi
- testl %eax,%eax // 0?
- jz LZeroBuffer // yes, we're done copying string
- dec %edx // more to go?
- jnz LLoopOverBytes
-
- testl %ecx,%ecx // at end of buffer?
- jnz LNextChunk // no, xfer chunks
- jmp LDone // yes
-
-
-// Loop over 16-byte chunks.
-// %esi = source ptr (unaligned)
-// %edi = dest ptr (aligned)
-// %ecx = buffer length remaining
-// %edx = chunk count
-
- .align 4,0x90 // align inner loops to optimize I-fetch
-LLoopOverChunks:
- movdqu (%esi),%xmm1 // get source
- pxor %xmm0,%xmm0 // get some 0s
- addl $16,%esi
- pcmpeqb %xmm1,%xmm0 // compare source to 0s
- pmovmskb %xmm0,%eax // get result mask for 0 check
- testl %eax,%eax // any 0s?
- jnz LFound0 // yes, exit loop
- movdqa %xmm1,(%edi) // no 0s so do aligned store into destination
- addl $16,%edi
- subl $16,%ecx // decrement length remaining
- dec %edx // more to go?
- jnz LLoopOverChunks
-
- jmp LCrossPage // cross page but keep dest aligned
-
-
-// Found a zero in the vector. Figure out where it is, and store the bytes
-// up to it. It is possible that we should check to be sure (%ecx >= 16), and
-// just do an aligned store of %xmm1 if so. But if we did, we'd be doing byte
-// stores into the same double quadword in bzero(), which might hit a hazard.
-// Experimentation needed.
-// %edi = dest ptr (aligned)
-// %eax = result mask
-// %ecx = buffer length remaining
-// %xmm1 = source vector
-
-LFound0:
- bsf %eax,%edx // find first 0
- subl %edx,%ecx // decrement remaining buffer length
- test $8,%dl // 8-byte store required?
- jz 4f // no
- movq %xmm1,(%edi) // pack in 8 low bytes
- psrldq $8,%xmm1 // then shift vector down 8 bytes
- addl $8,%edi
-4:
- test $4,%dl // 4-byte store required?
- jz 3f // no
- movd %xmm1,(%edi) // pack in 4 low bytes
- psrldq $4,%xmm1 // then shift vector down 4 bytes
- addl $4,%edi
-3:
- andl $3,%edx // more to go?
- jz LZeroBuffer // no
- movd %xmm1,%eax // move remainders out of vector into %eax
-1: // loop on up to three bytes
- movb %al,(%edi) // pack in next byte
- shrl $8,%eax // shift next byte into position
- inc %edi
- dec %edx
- jnz 1b
-
-// We've copied the string. Now zero the rest of the buffer, using commpage bzero().
-// %edi = dest ptr
-// %ecx = buffer length remaining
-
-LZeroBuffer:
-// The stack currently is aligned to 4 mod 16 (it was 0 mod 16 at the time of
-// the call, and the return address, edi, and esi have been pushed). It needs
-// to aligned 0 mod 16 when we call bzero, so we subtract 20 from esp (not 4
-// because we need to have 8 bytes for the arguments to bzero).
- subl $20,%esp
- movl %ecx,4(%esp) // remaining buffer size
- movl %edi, (%esp) // pointer to first unstored byte
- call _bzero
- addl $20,%esp
-
-LDone:
- movl 12(%esp),%eax // original dest ptr is return value
- popl %esi
- popl %edi
- ret
#include <Availability.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
typedef struct {
struct _ftsent *fts_cur; /* current node */
struct _ftsent *fts_child; /* linked list of children */
//End-Libc
__END_DECLS
+#pragma clang diagnostic pop
#endif /* !_FTS_H_ */
+
__BEGIN_DECLS
/* Define pressure levels usable by OSThermalPressureLevel */
-#if TARGET_OS_IPHONE
typedef enum {
+#if TARGET_OS_OSX || TARGET_OS_IOSMAC
+ kOSThermalPressureLevelNominal = 0,
+ kOSThermalPressureLevelModerate,
+ kOSThermalPressureLevelHeavy,
+ kOSThermalPressureLevelTrapping,
+ kOSThermalPressureLevelSleeping
+#else
kOSThermalPressureLevelNominal = 0,
kOSThermalPressureLevelLight = 10,
kOSThermalPressureLevelModerate = 20,
kOSThermalPressureLevelHeavy = 30,
kOSThermalPressureLevelTrapping = 40,
kOSThermalPressureLevelSleeping = 50
-} OSThermalPressureLevel;
-#else
-typedef enum {
- kOSThermalPressureLevelNominal = 0,
- kOSThermalPressureLevelModerate,
- kOSThermalPressureLevelHeavy,
- kOSThermalPressureLevelTrapping,
- kOSThermalPressureLevelSleeping
-} OSThermalPressureLevel;
#endif
+} OSThermalPressureLevel;
/*
** External notify(3) string for thermal pressure level notification
#define _STDLIB_H_
#include <Availability.h>
+#include <sys/cdefs.h>
#include <_types.h>
#if !defined(_ANSI_SOURCE)
#define LIBC_ABORT(f,...) abort_report_np("%s:%s:%u: " f, __FILE__, __func__, __LINE__, ## __VA_ARGS__)
//End-Libc
-#ifndef __alloc_size
-#if __has_attribute(alloc_size)
-#define __alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
-#else
-#define __alloc_size(...)
-#endif
-#endif // __alloc_size
+#include <malloc/_malloc.h>
__BEGIN_DECLS
void abort(void) __dead2;
#endif /* !__DARWIN_NO_LONG_LONG */
void *bsearch(const void *__key, const void *__base, size_t __nel,
size_t __width, int (* _Nonnull __compar)(const void *, const void *));
-void *calloc(size_t __count, size_t __size) __result_use_check __alloc_size(1,2);
+/* calloc is now declared in _malloc.h */
div_t div(int, int) __pure2;
void exit(int) __dead2;
-void free(void *);
+/* free is now declared in _malloc.h */
char *getenv(const char *);
long labs(long) __pure2;
ldiv_t ldiv(long, long) __pure2;
llabs(long long);
lldiv_t lldiv(long long, long long);
#endif /* !__DARWIN_NO_LONG_LONG */
-void *malloc(size_t __size) __result_use_check __alloc_size(1);
+/* malloc is now declared in _malloc.h */
int mblen(const char *__s, size_t __n);
size_t mbstowcs(wchar_t * __restrict , const char * __restrict, size_t);
int mbtowc(wchar_t * __restrict, const char * __restrict, size_t);
-int posix_memalign(void **__memptr, size_t __alignment, size_t __size) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0);
+/* posix_memalign is now declared in _malloc.h */
void qsort(void *__base, size_t __nel, size_t __width,
int (* _Nonnull __compar)(const void *, const void *));
int rand(void) __swift_unavailable("Use arc4random instead.");
-void *realloc(void *__ptr, size_t __size) __result_use_check __alloc_size(2);
+/* realloc is now declared in _malloc.h */
void srand(unsigned) __swift_unavailable("Use arc4random instead.");
double strtod(const char *, char **) __DARWIN_ALIAS(strtod);
float strtof(const char *, char **) __DARWIN_ALIAS(strtof);
strtouq(const char *__str, char **__endptr, int __base);
#endif /* !__DARWIN_NO_LONG_LONG */
extern char *suboptarg; /* getsubopt(3) external variable */
-void *valloc(size_t) __alloc_size(1);
+/* valloc is now declared in _malloc.h */
#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
/* Poison the following routines if -fshort-wchar is set */
#define strbase(name, addr, field) \
((struct name *)((char *)(addr) - fldoff(name, field)))
+/* Number of elements in a statically-defined array */
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && __GNUC__
+#define countof(arr) ({ \
+ _Static_assert( \
+ !__builtin_types_compatible_p(typeof(arr), typeof(&(arr)[0])), \
+ "array must be statically defined"); \
+ (sizeof(arr) / sizeof(arr[0])); \
+})
+#else
+#define countof(arr) \
+ (sizeof(arr) / sizeof(arr[0]))
+#endif
+
+/* Length of a statically-defined string (does not include null terminator) */
+#define lenof(str) \
+ (sizeof(str) - 1)
+
#endif /* !_STRUCT_H_ */
for ((N) = RB_TREE_MIN(T); (N); \
(N) = rb_tree_iterate((T), (N), RB_DIR_RIGHT))
#define RB_TREE_FOREACH_SAFE(N, T, TVAR) \
- for ((N) = RB_TREE_MIN(T); (N) && ((TVAR) = rb_tree_iterate((T), (N), RB_DIR_RIGHT)); \
+ for ((N) = RB_TREE_MIN(T); (N) && ((TVAR) = rb_tree_iterate((T), (N), RB_DIR_RIGHT), 1); \
(N) = (TVAR))
#define RB_TREE_FOREACH_REVERSE(N, T) \
for ((N) = RB_TREE_MAX(T); (N); \
(N) = rb_tree_iterate((T), (N), RB_DIR_LEFT))
#define RB_TREE_FOREACH_REVERSE_SAFE(N, T, TVAR) \
- for ((N) = RB_TREE_MAX(T); (N) && ((TVAR) = rb_tree_iterate((T), (N), RB_DIR_LEFT)); \
+ for ((N) = RB_TREE_MAX(T); (N) && ((TVAR) = rb_tree_iterate((T), (N), RB_DIR_LEFT), 1); \
(N) = (TVAR))
#include <_stdio.h>
#include <_xlocale.h>
+#include <sys/_types/_mbstate_t.h>
/* Initially added in Issue 4 */
__BEGIN_DECLS
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark Utilities
+static int
+_sysctl_12809455(int mib[4], size_t mib_cnt, void *old, size_t *old_len,
+ void *new, size_t new_len)
+{
+ int error = -1;
+ int ret = -1;
+ size_t mylen = 0;
+ size_t *mylenp = NULL;
+#if RDAR_12809455
+ bool workaround_12809455 = false;
+#endif
+
+ if (old_len) {
+ mylen = *old_len;
+ mylenp = &mylen;
+ }
+
+ // sysctl(3) doesn't behave anything like its documentation leads you to
+ // believe. If the given buffer is too small to hold the requested data,
+ // what's supposed to happen is:
+ //
+ // - as much data as possible is copied into the buffer
+ // - the number of bytes copied is written to the len parameter
+ // - errno is set to ENOMEM
+ // - -1 is returned (to indicate that you should check errno)
+ //
+ // What actually happens:
+ //
+ // - no data is copied
+ // - len is set to zero
+ // - errno is undefined
+ // - zero is returned
+ //
+ // So... swing and a miss.
+ //
+ // Since it returns success in this case our only indication that something
+ // went wrong is if mylen is set to zero.
+ //
+ // So we do our best to sniff out the misbehavior and emulate sysctl(3)'s
+ // API contract until it's fixed.
+ //
+ // <rdar://problem/12809455>
+#if RDAR_12809455
+ if (old_len && *old_len > 0) {
+ // We can only work around the bug if the passed-in length was non-zero.
+ workaround_12809455 = true;
+ }
+#endif
+
+ ret = sysctl(mib, (u_int)mib_cnt, old, mylenp, new, new_len);
+#if RDAR_12809455
+ if (workaround_12809455 && old && ret == 0 && mylen == 0) {
+ ret = -1;
+ errno = ENOMEM;
+ }
+#endif // RDAR_12809455
+
+ if (ret == 0) {
+ error = 0;
+ } else {
+ error = errno;
+ }
+
+ if (old_len) {
+ *old_len = mylen;
+ }
+
+ return error;
+}
+
+static char *
+_strblk(const char *str)
+{
+ const char *cur = str;
+
+ while (*cur && !isblank(*cur)) {
+ cur++;
+ }
+
+ return (char *)cur;
+}
+
+static bool
+_get_boot_arg_value(const char *which, char *where, size_t max)
+{
+ // This is (very) loosely based on the implementation of
+ // PE_parse_boot_argn() (or at least the parts where I was able to easily
+ // decipher the policy).
+ bool found = false;
+ errno_t error = -1;
+ char *buff = NULL;
+ size_t buff_len = 0;
+ char *theone = NULL;
+ char *equals = NULL;
+
+ error = sysctlbyname_get_data_np("kern.bootargs", (void **)&buff,
+ &buff_len);
+ if (error) {
+ goto __out;
+ }
+
+ theone = strstr(buff, which);
+ if (!theone) {
+ goto __out;
+ }
+
+ found = true;
+ if (!where) {
+ // Caller just wants to know whether the boot-arg exists.
+ goto __out;
+ }
+
+ equals = strchr(theone, '=');
+ if (!equals || isblank(equals[1])) {
+ strlcpy(where, "", max);
+ } else {
+ char *nextsep = NULL;
+ char nextsep_old = 0;
+
+ // Find the next separator and nerf it temporarily for the benefit of
+ // the underlying strcpy(3).
+ nextsep = _strblk(theone);
+ nextsep_old = *nextsep;
+ *nextsep = 0;
+ strlcpy(where, &equals[1], max);
+
+ *nextsep = nextsep_old;
+ }
+
+__out:
+ free(buff);
+ return found;
+}
+
+#pragma mark API
+errno_t
+sysctl_get_data_np(int mib[4], size_t mib_cnt, void **buff, size_t *buff_len)
+{
+ errno_t error = -1;
+ size_t needed = 0;
+ void *mybuff = NULL;
+
+ // We need to get the length of the parameter so we can allocate a buffer
+ // that's large enough.
+ error = _sysctl_12809455(mib, mib_cnt, NULL, &needed, NULL, 0);
+ if (error) {
+ goto __out;
+ }
+
+ mybuff = malloc(needed);
+ if (!mybuff) {
+ error = errno;
+ goto __out;
+ }
+
+ error = _sysctl_12809455(mib, mib_cnt, mybuff, &needed, NULL, 0);
+ if (error) {
+ // It's conceivable that some other process came along within this
+ // window and modified the variable to be even larger than we'd
+ // previously been told, but if that's the case, just give up.
+ goto __out;
+ }
+
+ *buff = mybuff;
+ *buff_len = needed;
+
+__out:
+ if (error) {
+ free(mybuff);
+ }
+ return error;
+}
+
+errno_t
+sysctlbyname_get_data_np(const char *mibdesc, void **buff, size_t *buff_len)
+{
+ int ret = -1;
+ int error = -1;
+ int mib[4];
+ size_t mib_cnt = countof(mib);
+
+ ret = sysctlnametomib(mibdesc, mib, &mib_cnt);
+ if (ret) {
+ error = errno;
+ goto __out;
+ }
+
+ error = sysctl_get_data_np(mib, mib_cnt, buff, buff_len);
+
+__out:
+ return error;
+}
+
+bool
+os_parse_boot_arg_int(const char *which, int64_t *where)
+{
+ bool found = false;
+ char buff[24] = {0};
+ char *endptr = NULL;
+ int64_t val = 0;
+
+ found = _get_boot_arg_value(which, buff, sizeof(buff));
+ if (!found || !where) {
+ goto __out;
+ }
+
+ // A base of zero handles bases 8, 10, and 16.
+ val = strtoll(buff, &endptr, 0);
+ if (*endptr == 0) {
+ *where = val;
+ } else {
+ // The boot-arg value was invalid, so say we didn't find it.
+ found = false;
+ }
+
+__out:
+ return found;
+}
+
+bool
+os_parse_boot_arg_string(const char *which, char *where, size_t maxlen)
+{
+ return _get_boot_arg_value(which, where, maxlen);
+}
/*
- * Copyright (c) 2017 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2017 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
+++ /dev/null
-/*
- * Copyright (c) 2017 Apple Inc. All rights reserved.
- *
- * @APPLE_APACHE_LICENSE_HEADER_START@
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @APPLE_APACHE_LICENSE_HEADER_END@
- */
-
-#ifndef __DIRSTAT_H__
-#define __DIRSTAT_H__
-
-#include <sys/types.h>
-#include <stdint.h>
-
-__BEGIN_DECLS
-
-/* Fail if the file system does not support fast directory sizing on the provided directory */
-#define DIRSTAT_FAST_ONLY 0x1
-
-/* Do not use filesystem support for directory sizing. */
-#define DIRSTAT_FORCE_FALLBACK 0x2
-
-/*
- * NOT ABI: the size of this structure may grow. You must pass the current
- * size of this structure in as the dirstat_size argument to the functions
- * below.
- */
-struct dirstat {
- off_t total_size;
- uint64_t descendants;
-};
-
-/* Returns -1 on error and sets errno. Does not cross file-system boundaries. */
-__API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
-int dirstat_np(const char *path, int flags, struct dirstat *ds, size_t dirstat_size);
-
-__API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
-int dirstatat_np(int dfd, const char *path, int flags, struct dirstat *ds, size_t dirstat_size);
-
-__END_DECLS
-
-#endif // __DIRSTAT_H__
* SUCH DAMAGE.
*/
/*
- * Copyright (c) 2017 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2017 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
+++ /dev/null
-/*
- * Copyright (c) 2017 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <sys/cdefs.h>
-#include <stdint.h>
-#include <stdbool.h>
-
-__BEGIN_DECLS
-
-typedef struct dirstat_fileid_set_s dirstat_fileid_set_s;
-typedef dirstat_fileid_set_s *dirstat_fileid_set_t;
-
-dirstat_fileid_set_t _dirstat_fileid_set_create(void);
-void _dirstat_fileid_set_destroy(dirstat_fileid_set_t set);
-bool _dirstat_fileid_set_add(dirstat_fileid_set_t set, uint64_t fileid);
-
-__END_DECLS
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark Utilities
+static void
+_print_preamble(FILE *fp, const char *fmt, va_list ap)
+{
+ fprintf(fp, "%s: ", getprogname());
+ vfprintf(fp, fmt, ap);
+}
+
+#pragma mark API
+void
+err_np(errno_t code, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ verr_np(code, fmt, ap);
+ va_end(ap);
+}
+
+void
+errc_np(int eval, errno_t code, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ verrc_np(eval, code, fmt, ap);
+ va_end(ap);
+}
+
+void
+warn_np(errno_t code, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vwarn_np(code, fmt, ap);
+ va_end(ap);
+}
+
+void
+verr_np(errno_t code, const char *fmt, va_list ap)
+{
+ _print_preamble(stderr, fmt, ap);
+ fprintf(stderr, ": %s\n", strerror_np(code));
+ exit(sysexit_np(code));
+}
+
+void
+verrc_np(int eval, errno_t code, const char *fmt, va_list ap)
+{
+ _print_preamble(stderr, fmt, ap);
+ fprintf(stderr, ": %s\n", strerror_np(code));
+ exit(eval);
+}
+
+void
+vwarn_np(errno_t code, const char *fmt, va_list ap)
+{
+ _print_preamble(stderr, fmt, ap);
+ fprintf(stderr, ": %s\n", strerror_np(code));
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark Assertions
+static_assert(_OS_CRASH_LAST < OS_CRASH_PORT_ARRAY_COUNT,
+ "array not large enough");
+
+#pragma mark Private Utilities
+static thread_state_flavor_t
+_exception_thread_state_flavor(void)
+{
+ thread_state_flavor_t flavor = 0;
+#if defined(__i386__) || defined(__x86_64__)
+ flavor = x86_THREAD_STATE;
+#elif defined(__arm__) || defined(__arm64__)
+ flavor = ARM_THREAD_STATE;
+#else // defined(__i386__) || defined(__x86_64__)
+#error "unsupported architecture"
+#endif // defined(__i386__) || defined(__x86_64__)
+ return flavor;
+}
+
+static exception_mask_t
+_exception_mask(os_crash_flags_t flags)
+{
+ exception_mask_t mask = 0;
+ if (flags & OS_CRASH_FLAG_CRASH) {
+ mask |= EXC_MASK_CRASH;
+ }
+ if (flags & OS_CRASH_FLAG_GUARD) {
+ mask |= EXC_MASK_GUARD;
+ }
+ if (flags & OS_CRASH_FLAG_RESOURCE) {
+ mask |= EXC_MASK_RESOURCE;
+ }
+ if (flags & OS_CRASH_FLAG_CORPSE) {
+ mask |= EXC_MASK_CORPSE_NOTIFY;
+ mask &= (exception_mask_t)(~EXC_MASK_CRASH);
+ }
+ return mask;
+}
+
+static exception_behavior_t
+_exception_behavior(void)
+{
+ return (EXCEPTION_STATE_IDENTITY|MACH_EXCEPTION_CODES);
+}
+
+static void
+_os_exception_port_set(os_crash_port_t *ep,
+ os_crash_type_t type, mach_port_t p)
+{
+ kern_return_t kr = KERN_FAILURE;
+
+ ep->oep_type = type;
+ ep->oep_port = p;
+
+ kr = mach_port_mod_refs(mach_task_self(), p, MACH_PORT_RIGHT_SEND, 1);
+ if (kr == KERN_SUCCESS) {
+ ep->oep_port = p;
+ } else {
+ ep->oep_port = MACH_PORT_DEAD;
+ }
+}
+
+#pragma mark API
+kern_return_t
+os_crash_set_reporter_port(mach_port_t where,
+ os_crash_flags_t flags, mach_port_t p)
+{
+ kern_return_t kr = KERN_FAILURE;
+ exception_mask_t mask = _exception_mask(flags);
+ exception_behavior_t bhvr = _exception_behavior();
+ thread_state_flavor_t flvr = _exception_thread_state_flavor();
+ mach_port_t host_priv = MACH_PORT_NULL;
+
+ // If we're not privleged to get the host-privileged port, no big deal, then
+ // the comparison below will fail.
+ (void)host_get_host_priv_port(mach_host_self(), &host_priv);
+
+ if (flags == OS_CRASH_FLAG_INIT) {
+ return KERN_SUCCESS;
+ }
+
+ if (where == mach_host_self() || where == host_priv) {
+ kr = host_set_exception_ports(where, mask, p, bhvr, flvr);
+ } else {
+ kr = task_set_exception_ports(where, mask, p, bhvr, flvr);
+ }
+
+ return kr;
+}
+
+kern_return_t
+os_crash_get_reporter_port_array(mach_port_t where, os_crash_port_array_t array)
+{
+ kern_return_t kr = KERN_FAILURE;
+ exception_mask_t masks[EXC_TYPES_COUNT];
+ mach_msg_type_number_t nmasks = 0;
+ exception_port_t ports[EXC_TYPES_COUNT];
+ exception_behavior_t behaviors[EXC_TYPES_COUNT];
+ thread_state_flavor_t flavors[EXC_TYPES_COUNT];
+ exception_mask_t mask = EXC_MASK_CRASH
+ | EXC_MASK_GUARD
+ | EXC_MASK_RESOURCE
+ | EXC_MASK_CORPSE_NOTIFY;
+ size_t i = 0;
+ size_t j = 0;
+ mach_port_t host_priv = MACH_PORT_NULL;
+
+ (void)host_get_host_priv_port(mach_host_self(), &host_priv);
+
+ if (where == mach_host_self() || where == host_priv) {
+ kr = host_get_exception_ports(mach_host_self(), mask,
+ masks, &nmasks, ports, behaviors, flavors);
+ } else {
+ kr = task_get_exception_ports(where, mask,
+ masks, &nmasks, ports, behaviors, flavors);
+ }
+
+ if (kr) {
+ goto __out;
+ }
+
+ bzero(array, sizeof(array[0]) * OS_CRASH_PORT_ARRAY_COUNT);
+ for (i = 0; i < nmasks; i++) {
+ if (masks[i] & EXC_MASK_CRASH) {
+ _os_exception_port_set(&array[j], OS_CRASH_CRASH, ports[i]);
+ j++;
+ }
+ if (masks[i] & EXC_MASK_GUARD) {
+ _os_exception_port_set(&array[j], OS_CRASH_GUARD, ports[i]);
+ j++;
+ }
+ if (masks[i] & EXC_MASK_RESOURCE) {
+ _os_exception_port_set(&array[j], OS_CRASH_RESOURCE, ports[i]);
+ j++;
+ }
+ if (masks[i] & EXC_MASK_CORPSE_NOTIFY) {
+ _os_exception_port_set(&array[j], OS_CRASH_CORPSE, ports[i]);
+ j++;
+ }
+ kr = mach_port_deallocate(mach_task_self(), ports[i]);
+ os_assert_mach("deallocate port", kr);
+ }
+
+__out:
+ return kr;
+}
+
+void
+os_crash_port_array_deallocate(os_crash_port_array_t array)
+{
+ size_t i = 0;
+
+ for (i = 0; i < 16; i++) {
+ if (MACH_PORT_VALID(array[i].oep_port)) {
+ kern_return_t kr = KERN_FAILURE;
+ kr = mach_port_deallocate(mach_task_self(), array[i].oep_port);
+ os_assert_mach("deallocate port", kr);
+ }
+ }
+}
+
+kern_return_t
+os_crash_spawnattr_set_reporter_port(posix_spawnattr_t *psattr,
+ os_crash_flags_t flags, mach_port_t p)
+{
+ int error = -1;
+ exception_mask_t mask = _exception_mask(flags);
+ exception_behavior_t bhvr = _exception_behavior();
+ thread_state_flavor_t flvr = _exception_thread_state_flavor();
+
+ if (!MACH_PORT_VALID(p)) {
+ return KERN_INVALID_NAME;
+ }
+
+ if (flags == OS_CRASH_FLAG_INIT) {
+ return KERN_SUCCESS;
+ }
+
+ error = posix_spawnattr_setexceptionports_np(psattr, mask, p, bhvr, flvr);
+ os_assert_zero(error);
+
+ return KERN_SUCCESS;
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Darwin-specific additions for FreeBSD APIs.
+ */
+#ifndef __DARWIN_BSD_H
+#define __DARWIN_BSD_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <sys/cdefs.h>
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+__BEGIN_DECLS;
+
+/*!
+ * @function sysctl_get_data_np
+ * A convenience routine for getting a sysctl(3) property whose size is not
+ * known at compile-time.
+ *
+ * @param mib
+ * An array describing the property to manipulate. This is a "management
+ * information base"-style descriptor, as described in sysctl(3).
+ *
+ * @param mib_cnt
+ * The number of items in the MIB array.
+ *
+ * @param buff
+ * On successful return, a pointer to a newly-allocated buffer. The caller is
+ * responsible for free(3)ing this buffer when it is no longer needed.
+ *
+ * @param buff_len
+ * On successful return, the length of the returned buffer.
+ *
+ * @result
+ * See the sysctl(3) man page for possible return codes.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1 OS_NONNULL3 OS_NONNULL4
+errno_t
+sysctl_get_data_np(int *mib, size_t mib_cnt, void **buff, size_t *buff_len);
+
+/*!
+ * @function sysctlbyname_get_data_np
+ * A convenience routine for getting a sysctl(3) property whose size is not
+ * known at compile-time.
+ *
+ * @param mibdesc
+ * An ASCII representation of the MIB vector describing the property to
+ * manipulate. Each element of the vector described is separated by a '.'
+ * character (e.g. "kern.ostype").
+ *
+ * @param buff
+ * On successful return, a pointer to a newly-allocated buffer. The caller is
+ * responsible for free(3)ing this buffer when it is no longer needed.
+ *
+ * @param buff_len
+ * On successful return, the length of the returned buffer.
+ *
+ * @result
+ * See the sysctl(3) man page for possible return codes.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1 OS_NONNULL2 OS_NONNULL3
+errno_t
+sysctlbyname_get_data_np(const char *mibdesc, void **buff, size_t *buff_len);
+
+/*!
+ * @function os_parse_boot_arg_int
+ * A routine for extracting a boot-arg as an integer value that is semantically
+ * similar to the PE_parse_boot_argn() kernel routine.
+ *
+ * @param which
+ * The name of the boot-arg whose value is to be obtained. The caller may pass
+ * NULL to simply check for the existence of a boot-arg.
+ *
+ * @param where
+ * On successful return, the integer value of the given boot-arg.
+ *
+ * @result
+ * A Boolean indicating whether the named argument was found. If the discovered
+ * argument value was not convertible to an integer according to the contract
+ * in strtoll(3), the implementation will return false.
+ *
+ * @discussion
+ * Boot-args are expressed with an '=' sign as a separator between the name and
+ * value of an argument, e.g. "cs_enforcement_disable=1".
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1
+bool
+os_parse_boot_arg_int(const char *which, int64_t *where);
+
+/*!
+ * @function os_parse_boot_arg_string
+ * A routine for extracting a boot-arg's string value that is semantically
+ * similar to the PE_parse_boot_argn() kernel routine.
+ *
+ * @param which
+ * The name of the boot-arg whose value is to be obtained.
+ *
+ * @param where
+ * The buffer in which to place the extracted value on successful return. The
+ * caller may pass NULL to simply check for the existence of a boot-arg.
+ *
+ * @param maxlen
+ * The length of the {@link where} buffer. May be zero if the caller only wishes
+ * to check for the existence of a boot-arg.
+ *
+ * @result
+ * A Boolean indicating whether the named argument was found.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1
+bool
+os_parse_boot_arg_string(const char *which, char *where, size_t maxlen);
+
+__END_DECLS;
+
+#endif // __DARWIN_BSD_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Attributes to handle automatic clean-up of certain types of variables when
+ * they go out of scope.
+ *
+ * IMPORTANT: These attributes will NOT cause a variable to be cleaned up when
+ * its value changes. For example, this pattern would leak:
+ *
+ * void *__os_free ptr = malloc(10);
+ * ptr = somewhere_else;
+ * return;
+ *
+ * You should only use these attributes for very well-scoped, temporary
+ * allocations.
+ */
+#ifndef __DARWIN_CLEANUP_H
+#define __DARWIN_CLEANUP_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <os/assumes.h>
+#include <os/object_private.h>
+
+#include <sys/errno.h>
+#include <sys/cdefs.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <mach/mach_init.h>
+#include <mach/port.h>
+#include <mach/mach_port.h>
+#include <mach/kern_return.h>
+
+__BEGIN_DECLS;
+
+#if __has_attribute(cleanup)
+/*!
+ * @define __os_free
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to free(3) when it goes out of scope. Applying this
+ * attribute to variables that do not reference heap allocations will result in
+ * undefined behavior.
+ */
+#define __os_free __attribute__((cleanup(__os_cleanup_free)))
+static inline void
+__os_cleanup_free(void *__p)
+{
+ void **tp = (void **)__p;
+ void *p = *tp;
+ free(p);
+}
+
+/*!
+ * @define __os_close
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to close(2) when it goes out of scope. Applying
+ * this attribute to variables that do not reference a valid file descriptor
+ * will result in undefined behavior. If the variable's value is -1 upon going
+ * out-of-scope, no cleanup is performed.
+ */
+#define __os_close __attribute__((cleanup(__os_cleanup_close)))
+static inline void
+__os_cleanup_close(int *__fd)
+{
+ int fd = *__fd;
+ if (fd == -1) {
+ return;
+ }
+ posix_assert_zero(close(fd));
+}
+
+/*!
+ * @define __os_fclose
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to fclose(3) when it goes out of scope. Applying
+ * this attribute to variables that do not reference a valid FILE* will result
+ * in undefined behavior. If the variable's value is NULL upon going out-of-
+ * scope, no cleanup is performed.
+ */
+#define __os_fclose __attribute__((cleanup(__os_cleanup_fclose)))
+static inline void
+__os_cleanup_fclose(FILE **__fp)
+{
+ FILE *f = *__fp;
+ int ret = -1;
+
+ if (!f) {
+ return;
+ }
+
+ ret = fclose(f);
+ if (ret == EOF) {
+ os_assert_zero(errno);
+ }
+}
+
+/*!
+ * @define __os_close_mach_recv
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to {@link darwin_mach_port_close_recv} when it goes
+ * out of scope. Applying this attribute to variables that do not reference a
+ * valid Mach port receive right will result in undefined behavior. If the
+ * variable's value is MACH_PORT_NULL or MACH_PORT_DEAD upon going out-of-scope,
+ * no cleanup is performed.
+ */
+#define __os_close_mach_recv \
+ __attribute__((cleanup(__os_cleanup_close_mach_recv)))
+static inline void
+__os_cleanup_close_mach_recv(mach_port_t *__p)
+{
+ mach_port_t p = *__p;
+ kern_return_t kr = KERN_FAILURE;
+
+ if (!MACH_PORT_VALID(p)) {
+ return;
+ }
+
+ kr = mach_port_destruct(mach_task_self(), p, 0, 0);
+ os_assert_zero(kr);
+}
+
+/*!
+ * @define __os_release_mach_send
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to {@link darwin_mach_port_release} when it goes
+ * out of scope. Applying this attribute to variables that do not reference a
+ * valid Mach port send right or MACH_PORT_NULL or MACH_PORT_DEAD will result
+ * in undefined behavior. If the variable's value is MACH_PORT_NULL or
+ * MACH_PORT_DEAD upon going out-of-scope, no cleanup is performed.
+ */
+#define __os_release_mach_send \
+ __attribute__((cleanup(__os_cleanup_release_mach_send)))
+static inline void
+__os_cleanup_release_mach_send(mach_port_t *__p)
+{
+ mach_port_t p = *__p;
+ kern_return_t kr = KERN_FAILURE;
+
+ if (!MACH_PORT_VALID(p)) {
+ return;
+ }
+
+ kr = mach_port_deallocate(mach_task_self(), p);
+ os_assert_zero(kr);
+}
+
+/*!
+ * @define __os_preserve_errno
+ * An attribute that may be applied to a variable's type. This attribute sets
+ * the global errno to the value of the variable when the variable goes out of
+ * scope. This attribute is useful for preserving the value of errno upon entry
+ * to a function and guaranteeing that it is restored upon exit.
+ */
+#define __os_preserve_errno \
+ __unused __attribute__((cleanup(__os_cleanup_errno)))
+static inline void
+__os_cleanup_errno(int *__e)
+{
+ errno = *__e;
+}
+
+/*!
+ * @define __os_release
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to os_release() when it goes out of scope. Applying
+ * this attribute to a variable which does not reference a valid os_object_t
+ * object will result in undefined behavior. If the variable's value is NULL
+ * upon going out-of-scope, no cleanup is performed.
+ *
+ * This attribute may be applied to dispatch and XPC objects.
+ */
+#define __os_release __attribute__((cleanup(__os_cleanup_os_release)))
+static inline void
+__os_cleanup_os_release(void *__p)
+{
+ _os_object_t *tp = (_os_object_t *)__p;
+ _os_object_t o = *tp;
+ if (!o) {
+ return;
+ }
+ os_release(o);
+}
+
+#if __COREFOUNDATION__
+/*!
+ * @define __os_cfrelease
+ * An attribute that may be applied to a variable's type. This attribute causes
+ * the variable to be passed to CFRelease() when it goes out of scope. Applying
+ * this attribute to a variable which does not reference a valid CoreFoundation
+ * object will result in undefined behavior. If the variable's value is NULL
+ * upon going out-of-scope, no cleanup is performed.
+ */
+#define __os_cfrelease __attribute__((cleanup(__os_cleanup_cfrelease)))
+static inline void
+__os_cleanup_cfrelease(void *__p)
+{
+ CFTypeRef *tp = (CFTypeRef *)__p;
+ CFTypeRef cf = *tp;
+ if (!cf) {
+ return;
+ }
+ CFRelease(cf);
+}
+#endif // __COREFOUNDATION__
+
+#else // __has_attribute(cleanup)
+#define __os_free __attribute__((__os_not_supported))
+#define __os_close __attribute__((__os_not_supported))
+#define __os_fclose __attribute__((__os_not_supported))
+#define __os_close_mach_recv __attribute__((__os_not_supported))
+#define __os_release_mach_send __attribute__((__os_not_supported))
+#define __os_preserve_errno __attribute__((__os_not_supported))
+#define __os_release __attribute__((__os_not_supported))
+#define __os_cfrelease __attribute__((__os_not_supported))
+#endif // __has_attribute(cleanup)
+
+__END_DECLS;
+
+#endif // __DARWIN_CLEANUP_H
--- /dev/null
+/*
+ * Copyright (c) 2017 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+#ifndef __DIRSTAT_H__
+#define __DIRSTAT_H__
+
+#include <Availability.h>
+#include <sys/types.h>
+#include <stdint.h>
+
+__BEGIN_DECLS
+
+/* Fail if the file system does not support fast directory sizing on the provided directory */
+#define DIRSTAT_FAST_ONLY 0x1
+
+/* Do not use filesystem support for directory sizing. */
+#define DIRSTAT_FORCE_FALLBACK 0x2
+
+/*
+ * NOT ABI: the size of this structure may grow. You must pass the current
+ * size of this structure in as the dirstat_size argument to the functions
+ * below.
+ */
+struct dirstat {
+ off_t total_size;
+ uint64_t descendants;
+};
+
+/* Returns -1 on error and sets errno. Does not cross file-system boundaries. */
+__API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
+int dirstat_np(const char *path, int flags, struct dirstat *ds, size_t dirstat_size);
+
+__API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0))
+int dirstatat_np(int dfd, const char *path, int flags, struct dirstat *ds, size_t dirstat_size);
+
+__END_DECLS
+
+#endif // __DIRSTAT_H__
--- /dev/null
+/*
+ * Copyright (c) 2017 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+#include <sys/cdefs.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+__BEGIN_DECLS
+
+#pragma GCC visibility push(hidden)
+
+typedef struct dirstat_fileid_set_s dirstat_fileid_set_s;
+typedef dirstat_fileid_set_s *dirstat_fileid_set_t;
+
+dirstat_fileid_set_t _dirstat_fileid_set_create(void);
+void _dirstat_fileid_set_destroy(dirstat_fileid_set_t set);
+bool _dirstat_fileid_set_add(dirstat_fileid_set_t set, uint64_t fileid);
+
+#pragma GCC visibility pop
+
+__END_DECLS
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Non-standard, Darwin-specific additions to the err(3) family of APIs. The
+ * following additions are provided:
+ *
+ * - support for the error code additions in os/errno.h
+ * - automatic conversion of an error code into a sysexits(3) code
+ * - a debug_*() family of routines
+ *
+ * There are no direct equivalents for err(3), warn(3), verr(3), or vwarn(3)
+ * because those routines query errno for error information, and it is not valid
+ * to store error codes from os/error.h in errno. Therefore when evaluating the
+ * output of normal POSIX routines, use the err(1) family of routines. When
+ * evaluating the output of routines that can return the error codes in
+ * os/error.h, you may use these routines and always explicitly pass the error
+ * code.
+ *
+ * There are no equivalents for errx(3), warnx(3), verrx(3), or vwarnx(3)
+ * because those routines do not query error information.
+ */
+#ifndef __DARWIN_ERR_H
+#define __DARWIN_ERR_H
+
+#include <os/base.h>
+#include <os/api.h>
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/cdefs.h>
+#include <uuid/uuid.h>
+
+#include <stdarg.h>
+#include <stdio.h>
+
+__BEGIN_DECLS;
+
+/*!
+ * @function err_np
+ * Writes a formatted error message to stderr(4) and exits the program.
+ *
+ * @param code
+ * The error code to query in the output.
+ *
+ * @param fmt
+ * The printf(3)-like format string representing the message to print.
+ *
+ * @param ...
+ * The arguments corresponding to the format string.
+ *
+ * @discussion
+ * This routine will look up an appropriate sysexits(3) code using the given
+ * error code using {@link darwin_sysexit} and pass it to exit(3).
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NORETURN OS_NONNULL2 OS_FORMAT_PRINTF(2, 3)
+void
+err_np(errno_t code, const char *fmt, ...);
+
+/*!
+ * @function errc_np
+ * Writes a formatted error message to stderr(4) and exits the program.
+ *
+ * @param eval
+ * The code to pass to exit(3). This should be a code defined in sysexits(3).
+ *
+ * @param code
+ * The error code to query in the output.
+ *
+ * @param fmt
+ * The printf(3)-like format string representing the message to print.
+ *
+ * @param ...
+ * The arguments corresponding to the format string.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NORETURN OS_NONNULL3 OS_FORMAT_PRINTF(3, 4)
+void
+errc_np(int eval, errno_t code, const char *fmt, ...);
+
+/*!
+ * @function warn_np
+ * Writes a formatted warning message to stderr(4).
+ *
+ * @param code
+ * The error code to query in the output.
+ *
+ * @param fmt
+ * The printf(3)-like format string representing the message to print.
+ *
+ * @param ...
+ * The arguments corresponding to the format string.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NONNULL2 OS_FORMAT_PRINTF(2, 3)
+void
+warn_np(errno_t code, const char *fmt, ...);
+
+/*!
+ * @function verr_np
+ * Writes a formatted error message to stderr(4) and exits the program.
+ *
+ * @param code
+ * The error code to query in the output.
+ *
+ * @param fmt
+ * The printf(3)-like format string representing the message to print.
+ *
+ * @param ap
+ * The argument pointer corresponding to the format string.
+ *
+ * @discussion
+ * This routine will look up an appropriate sysexits(3) code using the given
+ * error code using {@link darwin_sysexit} and pass it to exit(3).
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NORETURN OS_NONNULL2 OS_NONNULL3
+void
+verr_np(errno_t code, const char *fmt, va_list ap);
+
+/*!
+ * @function verrc_np
+ * Writes a formatted error message to stderr(4) and exits the program.
+ *
+ * @param eval
+ * The code to pass to exit(3). This should be a code defined in sysexits(3).
+ *
+ * @param code
+ * The error code to query in the output.
+ *
+ * @param fmt
+ * The printf(3)-like format string representing the message to print.
+ *
+ * @param ap
+ * The argument pointer corresponding to the format string.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NORETURN OS_NONNULL3 OS_NONNULL4
+void
+verrc_np(int eval, errno_t code, const char *fmt, va_list ap);
+
+/*!
+ * @function vwarn_np
+ * Writes a formatted warning message to stderr(4).
+ *
+ * @param code
+ * The error code to query in the output.
+ *
+ * @param fmt
+ * The printf(3)-like format string representing the message to print.
+ *
+ * @param ap
+ * The arguments corresponding to the format string.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NONNULL2 OS_NONNULL3
+void
+vwarn_np(errno_t code, const char *fmt, va_list ap);
+
+__END_DECLS;
+
+#endif // __DARWIN_ERR_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*
+ * @header
+ * Non-standard, Darwin-specific additions to the error codes enumerated in
+ * intro(2) and sys/errno.h.
+ */
+#ifndef __DARWIN_ERRNO_H
+#define __DARWIN_ERRNO_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <sys/errno.h>
+#include <sys/cdefs.h>
+#include <sysexits.h>
+
+/*!
+ * @enum
+ * Additional POSIX-flavor error codes that are meaningful to Darwin. These
+ * definitions all have a "_NP" suffix to distinguish them from POSIX error
+ * codes (meaning "not POSIX").
+ */
+#define EBASE_NP 200
+#define _ENPERR(__c) (EBASE_NP + __c)
+
+/*!
+ * @const ENOTENTITLED_NP
+ * The remote process lacked a required entitlement to perform the operation.
+ */
+#define ENOTENTITLED_NP _ENPERR(0)
+
+/*!
+ * @const ENOTPLATFORM_NP
+ * The operation may only be invoked by platform binaries.
+ */
+#define ENOTPLATFORM_NP _ENPERR(1)
+
+/*!
+ * @const EROOTLESS_NP
+ * The operation was denied by System Integrity Protection.
+ */
+#define EROOTLESS_NP _ENPERR(2)
+
+/*!
+ * @const ETAINTED_NP
+ * The operation may only be invoked by processes which are not tainted by
+ * debugging and introspection functionality (e.g. dyld(1) environment
+ * variables, debugger attachment, etc.).
+ */
+#define ETAINTED_NP _ENPERR(3)
+
+/*!
+ * @const EQUARANTINE_NP
+ * The operation is not permitted on quarantined file.
+ */
+#define EQUARANTINE_NP _ENPERR(4)
+
+/*!
+ * @const EBADUSER_NP
+ * The operation referenced a user name or identifier that was invalid.
+ */
+#define EBADUSER_NP _ENPERR(5)
+
+/*!
+ * @const EBADGROUP_NP
+ * The operation referenced a group name or identifier that was invalid.
+ */
+#define EBADGROUP_NP _ENPERR(6)
+
+/*!
+ * @const EOWNERSHIP_NP
+ * Ownership or access permissions on a file were too permissive.
+ */
+#define EOWNERSHIP_NP _ENPERR(7)
+
+/*!
+ * @const ENOOOO_NP
+ * A series of operations was executed in the improper order (no out-of-order
+ * operations allowed).
+ */
+#define ENOOOO_NP _ENPERR(8)
+
+/*!
+ * @const ENOTBUNDLE_NP
+ * The path given to the operation did not refer to a bundle.
+ */
+#define ENOTBUNDLE_NP _ENPERR(9)
+
+/*!
+ * @const EBADBUNDLE_NP
+ * The path given to the operation did not refer to a valid bundle.
+ */
+#define EBADBUNDLE_NP _ENPERR(10)
+
+/*!
+ * @const EBADPATH_NP
+ * The path given to the operation was not valid.
+ */
+#define EBADPATH_NP _ENPERR(11)
+
+/*!
+ * @const EBADPLIST_NP
+ * The plist given to the operation was invalid.
+ */
+#define EBADPLIST_NP _ENPERR(12)
+
+/*!
+ * @const EBADKEY_NP
+ * A key in the given plist was unrecognized.
+ */
+#define EBADKEY_NP _ENPERR(13)
+
+/*!
+ * @const EBADVAL_NP
+ * The value for a key in the given plist was either not present (and was
+ * required to be) or was present but not of the appropriate type.
+ */
+#define EBADVAL_NP _ENPERR(14)
+
+/*!
+ @const EBADSUBSYS_NP
+ * The request referenced a subsystem that did not exist.
+ */
+#define EBADSUBSYS_NP _ENPERR(15)
+
+/*!
+ * @const E2BIMPL_NP
+ * The operation has not yet been implemented.
+ */
+#define E2BIMPL_NP _ENPERR(16)
+
+/*!
+ * @const EDEPRECATED_NP
+ * The operation has been deprecated.
+ */
+#define EDEPRECATED_NP _ENPERR(17)
+
+/*!
+ * @const EREMOVED_NP
+ * The operation has been removed from the implementation.
+ */
+#define EREMOVED_NP _ENPERR(18)
+
+/*!
+ * @const EDROPPED_NP
+ * The request referenced a data structure that will never achieve the state
+ * required to perform the operation.
+ */
+#define EDROPPED_NP _ENPERR(19)
+
+/*!
+ * @const EDEFERRED_NP
+ * The request referenced a data structure that was not in the state required
+ * to perform the operation, and the request has been pended until the object
+ * reaches the required state. This code is meant to be used for control flow
+ * purposes in the server and should not be returned to the caller.
+ */
+#define EDEFERRED_NP _ENPERR(20)
+
+/*!
+ * @const EUSAGE_NP
+ * Improper command line usage. This code is meant to be used for control flow
+ * purposes in a command line tool so that routines may return an error code
+ * indicating improper usage without having to use EX_USAGE, which collides with
+ * the POSIX error space. It should not be passed to exit(3), _exit(2), et al.
+ * and should instead be translated into EX_USAGE either directly or with
+ * {@link darwin_sysexit}.
+ */
+#define EUSAGE_NP _ENPERR(21)
+
+/*!
+ * @const EUNKNOWN_NP
+ * An error occurred in a subsystem, and insufficient detail as to the nature of
+ * the failure was available to translate it into a more descriptive error code.
+ */
+#define EUNKNOWN_NP _ENPERR(22)
+#define __ELAST_NP _ENPERR(22)
+
+/*!
+ * @const EX_BADRECEIPT_NP
+ * An exit code indicating that the program could not verify its purchase
+ * receipt from the Mac App Store. This exit code is inspected by the system to
+ * trigger a re-validation of the purchase receipt. It must be passed to the
+ * exit(3) Libc API and not to _exit(2) system call. This exit code is only
+ * relevant to the macOS variant of Darwin.
+ */
+#define EX_BADRECEIPT_NP (173)
+
+__BEGIN_DECLS;
+
+/*!
+ * @function sysexit_np
+ * Translates a {@link errno_t} or POSIX error code into an exit code
+ * defined in sysexits(3).
+ *
+ * @param code
+ * The error code to translate.
+ *
+ * @result
+ * The sysexits(3) exit code most appropriate for the given error. If no
+ * appropriate exit code could be determined, the designated ¯\_(ツ)_/¯ exit
+ * code, EX_UNAVAILABLE, is returned (cf. sysexits(3)).
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_CONST
+int
+sysexit_np(int code);
+
+__END_DECLS;
+
+#endif // __DARWIN_ERRNO_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * libdarwin initialization header.
+ */
+#ifndef __DARWIN_INIT_H
+#define __DARWIN_INIT_H
+
+#include <os/base.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS;
+
+OS_EXPORT
+void
+__libdarwin_init(void);
+
+__END_DECLS;
+
+#endif // __DARWIN_INIT_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Darwin-specific interfaces for manipulating Mach exception handling
+ * properties of a task.
+ */
+#ifndef __DARWIN_EXCEPTION_H
+#define __DARWIN_EXCEPTION_H
+
+#include <os/base.h>
+#include <os/api.h>
+
+#include <sys/cdefs.h>
+#include <spawn.h>
+
+#include <mach/mach.h>
+#include <mach/port.h>
+#include <mach/mach_port.h>
+#include <mach/kern_return.h>
+
+__BEGIN_DECLS;
+
+/*!
+ * @typedef os_crash_flags_t
+ * A flagset describing crash handling behaviors.
+ *
+ * @param OS_CRASH_FLAG_INIT
+ * Handle no exceptions.
+ *
+ * @param OS_CRASH_FLAG_CRASH
+ * Handle exceptions due to crashing conditions (e.g. segmentation violations,
+ * signals raise(3)ed manually, etc.). These exceptions will suspend the subject
+ * task until the exception handler has returned.
+ *
+ * @param OS_CRASH_FLAG_GUARD
+ * Handle exceptions due to the subject task violating guarded kernel handles
+ * (e.g. guarded mach port rights and file descriptors).
+ *
+ * @param OS_CRASH_FLAG_RESOURCE
+ * Handle exceptions due to the subject task exceeding resource usage limits
+ * (e.g. CPU spins, memory growth, etc.).
+ *
+ * @param OS_CRASH_FLAG_CORPSE
+ * Handle exceptions which create corpses. The subject task of these exceptions
+ * is a corpse of the original task, which is torn down asynchronously. Corpses
+ * are a limited representation of the original task that is suitable for most
+ * introspection needs.
+ *
+ * This flag is mutually exclusive with {@link OS_CRASH_FLAG_CRASH}, and if both
+ * are present, this flag will be preferred.
+ *
+ * @discussion
+ * There are other Mach exception types than the ones enumerated by these flags,
+ * but they are almost exclusively handled internally by the kernel, and
+ * therefore are of little interest to userspace. Those that are not handled by
+ * the kernel are only relevant to debuggers.
+ */
+OS_ENUM(os_crash_flags, uint32_t,
+ OS_CRASH_FLAG_INIT = 0,
+ OS_CRASH_FLAG_CRASH = (1 << 0),
+ OS_CRASH_FLAG_GUARD = (1 << 1),
+ OS_CRASH_FLAG_RESOURCE = (1 << 2),
+ OS_CRASH_FLAG_CORPSE = (1 << 3),
+);
+
+/*!
+ * @enum os_crash_type_t
+ * A type describing exception types relevant to userspace crash reporters.
+ * These values serve as indexes into a {@link os_crash_port_array_t}.
+ *
+ * @const OS_CRASH_NONE
+ * No exception type.
+ *
+ * @const OS_CRASH_CRASH
+ * A crashing exception with the behavior described in {@link OS_CRASH_FLAG_CRASH}.
+ *
+ * @const OS_CRASH_GUARD
+ * A guard exception with the behavior described in {@link OS_CRASH_FLAG_GUARD}.
+ *
+ * @const OS_CRASH_RESOURCE
+ * A resource exception with the behavior described in {@link OS_CRASH_FLAG_RESOURCE}.
+ *
+ * @const OS_CRASH_CORPSE
+ * A corpse exception with the behavior described in {@link OS_CRASH_FLAG_CORPSE}.
+ */
+OS_ENUM(os_crash_type, uint32_t,
+ OS_CRASH_NONE,
+ OS_CRASH_CRASH,
+ OS_CRASH_GUARD,
+ OS_CRASH_RESOURCE,
+ OS_CRASH_CORPSE,
+ _OS_CRASH_LAST,
+);
+
+/*!
+ * struct os_crash_port_t
+ * A type describing an exception port and the exception it handles.
+ *
+ * @property oep_type
+ * The type of exception handled by the port.
+ *
+ * @property oep_port
+ * A handle representing a send right to the exception port.
+ */
+DARWIN_API_AVAILABLE_20170407
+typedef struct _os_crash_port {
+ os_crash_type_t oep_type;
+ mach_port_t oep_port;
+} os_crash_port_t;
+
+/*!
+ * @define DARWIN_EXCEPTION_PORT_ARRAY_COUNT
+ * The maximum number of exception ports that an exception port array can
+ * accommodate.
+ */
+#define OS_CRASH_PORT_ARRAY_COUNT (16lu)
+
+/*!
+ * @typedef os_crash_port_array_t
+ * An array of exception ports. This array can accommodate all exception types
+ * described in the {@link os_crash_type_t} type and is sized to
+ * accommodate future exception types.
+ */
+DARWIN_API_AVAILABLE_20170407
+typedef os_crash_port_t os_crash_port_array_t[OS_CRASH_PORT_ARRAY_COUNT];
+
+/*!
+ * @function os_crash_set_reporter_port
+ * Routine to set the exception handler port for the exceptions given.
+ *
+ * @param where
+ * The task port or host port for which to set the exception handler. This
+ * routine will internally choose the proper method of setting the exception
+ * port based on whether this parameter represents the host or not.
+ *
+ * @param flags
+ * Flags describing which exceptions are to be handled by the port.
+ *
+ * @param p
+ * A send right to the desired exception handler port.
+ *
+ * @result
+ * A kernel return code.
+ *
+ * @discussion
+ * This routine automatically chooses the most expressive thread state to
+ * deliver in the exception message based on the current architecture.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT
+kern_return_t
+os_crash_set_reporter_port(mach_port_t where,
+ os_crash_flags_t flags, mach_port_t p);
+
+/*!
+ * @function os_crash_get_reporter_port_array
+ * Routine to get the ports which handle exceptions for all enumerated exception
+ * types in {@link os_crash_flags_t}.
+ *
+ * @param where
+ * The task port or host port for which to retrieve exception handler ports.
+ * This routine will internally choose the proper method of obtaining the
+ * exception ports based on whether this parameter represents the host or not.
+ *
+ * @param array
+ * An array describing the exception ports for the target host or task. This
+ * array must be disposed of with {@link os_crash_port_array_deallocate}
+ * when it is no longer needed.
+ *
+ * @result
+ * A kernel return code.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL2
+kern_return_t
+os_crash_get_reporter_port_array(mach_port_t where,
+ os_crash_port_array_t array);
+
+/*!
+ * @function os_crash_port_array_deallocate
+ * Routine to deallocate an array of exception port descriptors.
+ *
+ * @param array
+ * The array which is to be disposed of.
+ *
+ * @discussion
+ * This routine disposes of the resources represented by the kernel handles in
+ * the array. It does not manipulate the array's memory. The expectation is that
+ * the caller allocates {@link os_crash_port_array_t} from the stack.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NONNULL1
+void
+os_crash_port_array_deallocate(os_crash_port_array_t array);
+
+/*!
+ * @function os_crash_spawnattr_set_reporter_port
+ * Routine to set the exception handler port for the exceptions given in a
+ * posix_spawn(2) attributes structure.
+ *
+ * @param psattr
+ * The spawn attributes for which the exception port should be set.
+ *
+ * @param flags
+ * Flags describing which exceptions are to be handled by the port.
+ *
+ * @param p
+ * A send right to the desired exception handler port.
+ *
+ * @result
+ * A kernel return code. This routine will only fail if the port name given was
+ * invalid.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1
+kern_return_t
+os_crash_spawnattr_set_reporter_port(posix_spawnattr_t *psattr,
+ os_crash_flags_t flags, mach_port_t p);
+
+__END_DECLS;
+
+#endif // __DARWIN_EXCEPTION_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Defines additions to the Mach family of APIs.
+ */
+#ifndef __DARWIN_MACH_UTILS_H
+#define __DARWIN_MACH_UTILS_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <os/assumes.h>
+
+#include <sys/cdefs.h>
+
+#include <mach/mach.h>
+#include <mach/mach_init.h>
+#include <mach/port.h>
+#include <mach/mach_port.h>
+#include <mach/kern_return.h>
+
+/*!
+ * @define OS_MIG_SUBSYSTEM_MAXSIZE
+ * A macro that evaluates to the maximum size of a request or reply message in
+ * the given MIG subsystem.
+ *
+ * @param __subsystem
+ * The name of the MIG subsystem, defined by the "subsystem" keyword.
+ *
+ * @param __serverprefix
+ * The serverprefix of the MIG subsystem, defined by the "serverprefix" keyword.
+ */
+#define OS_MIG_SUBSYSTEM_MAXSIZE(__subsystem, __serverprefix) __extension__({ \
+ union __subsystem ## _RequestReplyUnion { \
+ union __RequestUnion__ ## __serverprefix ## __subsystem ## \
+ _subsystem requests; \
+ union __ReplyUnion__ ## __serverprefix ## __subsystem ## \
+ _subsystem replies; \
+ }; \
+ (sizeof(union __subsystem ## _RequestReplyUnion)); \
+})
+
+__BEGIN_DECLS;
+
+/*!
+ * @function os_mach_msg_get_trailer
+ * Obtains the trailer for the received Mach message.
+ *
+ * @param hdr
+ * The message header of the received Mach message.
+ *
+ * @result
+ * A pointer to the trailer that was received with the message.
+ *
+ * @discussion
+ * Every received Mach message has a minimal trailer which identifies its format
+ * and size (cf. mach_msg_trailer_t). Currently, there is one format,
+ * MACH_MSG_TRAILER_FORMAT_0. The caller is responsible for validating the
+ * returned trailer's format against this known value as well as the trailer's
+ * size before using any additional trailer fields.
+ *
+ * The result of passing a header to a message that was not received from a port
+ * is undefined.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1
+const mach_msg_trailer_t *
+os_mach_msg_get_trailer(const mach_msg_header_t *hdr);
+
+/*!
+ * @function os_mach_msg_get_audit_trailer
+ * Obtains the audit trailer for the received Mach message.
+ *
+ * @param hdr
+ * The message header of the received Mach message.
+ *
+ * @result
+ * A pointer to the audit trailer that was received with the message. If the
+ * message was not received with an audit trailer (by passing
+ * MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AUDIT) in the mach_msg() options),
+ * NULL is returned.
+ *
+ * @discussion
+ * The result of passing a header to a message that was not received from a port
+ * is undefined.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1
+const mach_msg_audit_trailer_t *
+os_mach_msg_get_audit_trailer(const mach_msg_header_t *hdr);
+
+/*!
+ * @function os_mach_msg_get_context_trailer
+ * Obtains the context trailer for the received Mach message.
+ *
+ * @param hdr
+ * The message header of the received Mach message.
+ *
+ * @result
+ * A pointer to the context trailer that was received with the message. If the
+ * message was not received with an context trailer (by passing
+ * MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_CTX) in the mach_msg() options),
+ * NULL is returned.
+ *
+ * @discussion
+ * The result of passing a header to a message that was not received from a port
+ * is undefined.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1
+const mach_msg_context_trailer_t *
+os_mach_msg_get_context_trailer(const mach_msg_header_t *hdr);
+
+/*!
+ * @const os_mach_msg_copy_description
+ * A routine for obtaining a human-readable description of a Mach message.
+ *
+ * @param msg
+ * The message for which to obtain the description.
+ *
+ * @result
+ * A human-readable string describing the given message header. This string is
+ * not intended to be machine-parseable, and the exact output format is not
+ * stable.
+ *
+ * The implementation does not attempt to introspect the contents of the
+ * message. If the implementation detects that the message is complex, it will
+ * examine the first 4 bytes past the header to obtain the descriptor count, as
+ * is specified by the Mach APIs. Therefore, you should not pass a complex
+ * header that is not part of a valid message buffer, or the output may contain
+ * garbage information.
+ *
+ * The caller is responsible for free(3)ing this string when it is no longer
+ * required.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_MALLOC OS_NONNULL1
+char *
+os_mach_msg_copy_description(const mach_msg_header_t *msg);
+
+/*!
+ * @function os_mach_msg_trailer_copy_description
+ * A routine for obtaining a human-readable description of the trailer of a Mach
+ * message.
+ *
+ * @param tlr
+ * The trailer for which to obtain the description.
+ *
+ * @result
+ * A human-readable string describing the given message trailer. This string is
+ * not intended to be machine-parseable, and the exact output format is not
+ * stable.
+ *
+ * The caller is responsible for free(3)ing this string when it is no longer
+ * required.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_MALLOC OS_NONNULL1
+char *
+os_mach_msg_trailer_copy_description(const mach_msg_trailer_t *tlr);
+
+/*!
+ * @function os_mach_port_copy_description
+ * A routine for obtaining a human-readable description string of a port right
+ * handle.
+ *
+ * @param port
+ * The port right for which to obtain the description.
+ *
+ * @result
+ * A human-readable string describing the given port right. This string is not
+ * intended to be machine-parseable, and the exact output format is not stable.
+ *
+ * The caller is responsible for free(3)ing this string when it is no longer
+ * required.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_MALLOC
+char *
+os_mach_port_copy_description(mach_port_t port);
+
+__END_DECLS;
+
+#endif // __DARWIN_MACH_UTILS_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Non-standard, Darwin-specific additions for the stdio(3) family of APIs.
+ */
+#ifndef __DARWIN_STDIO_H
+#define __DARWIN_STDIO_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS;
+
+/*!
+ * @function zsnprintf_np
+ * snprintf(3) variant which returns the numnber of bytes written less the null
+ * terminator.
+ *
+ * @param buff
+ * The buffer in which to write the string.
+ *
+ * @param len
+ * The length of the buffer.
+ *
+ * @param fmt
+ * The printf(3)-like format string.
+ *
+ * @param ...
+ * The arguments corresponding to the format string.
+ *
+ * @result
+ * The number of bytes written into the buffer, less the null terminator. This
+ * routine is useful for successive string printing that may be lossy, as it
+ * will simply return zero when there is no space left in the destination
+ * buffer, i.e. enables the following pattern:
+ *
+ * char *cur = buff;
+ * size_t left = sizeof(buff);
+ * for (i = 0; i < n_strings; i++) {
+ * size_t n_written = zsnprintf_np(buff, left, "%s", strings[i]);
+ * cur += n_written;
+ * left -= n_written;
+ * }
+ *
+ * This loop will safely terminate without any special care since, as soon as
+ * the buffer's space is exhausted, all further calls to zsnprintf_np() will
+ * write nothing and return zero.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_NONNULL1 OS_NONNULL3 OS_FORMAT_PRINTF(3, 4)
+size_t
+zsnprintf_np(char *buff, size_t len, const char *fmt, ...);
+
+__END_DECLS;
+
+#endif // __DARWIN_STDIO_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Non-standard, Darwin-specific additions to the stdlib(3) family of APIs.
+ *
+ * The os_malloc() and os_strdup() routines are wrappers to be used for small,
+ * fixed-size allocations, the assumption being that such allocation should
+ * always succeed absent other critical problems. Thus, if the requested size is
+ * is a compile-time constant, the return value is asserted to be non-NULL.
+ * Otherwise, for sizes that are not known at compile-time, the implementations
+ * loop until the allocation succeeds, assuming the failure to be due to
+ * transient resource shortages. The implementation will not loop if the program
+ * has not become multi-threaded, under the assertion that there would be no
+ * point since no other thread could possibly free up resources for the calling
+ * thread to use. Thus, in a single-threaded program, all allocations will
+ * be treated like small, fixed-size allocations and be expected to succeed.
+ *
+ * These wrappers should not be used for large allocations whose bounds cannot
+ * be determined at compile-time. For such allocations, malloc(3), calloc(3), et
+ * al. (with appropriate error handling) are the appropriate interfaces.
+ */
+#ifndef __DARWIN_STDLIB_H
+#define __DARWIN_STDLIB_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <os/assumes.h>
+#include <dispatch/private.h>
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS;
+
+/*!
+ * @function __os_temporary_resource_shortage
+ * A function whose purpose is to appear in stack traces to indicate transient
+ * resource shortage conditions. Do not call.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NOT_TAIL_CALLED
+void
+__os_temporary_resource_shortage(void);
+
+/*!
+ * @functiongroup
+ * Internal inline definitions.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_ALWAYS_INLINE OS_WARN_RESULT OS_MALLOC __alloc_size(1)
+static inline void *
+_os_malloc_loop(size_t size)
+{
+ void *ptr = NULL;
+ while (!(ptr = malloc(size))) {
+ __os_temporary_resource_shortage();
+ }
+ return ptr;
+}
+
+DARWIN_API_AVAILABLE_20170407
+OS_ALWAYS_INLINE OS_WARN_RESULT OS_MALLOC __alloc_size(1)
+static inline void *
+_os_malloc_known(size_t size)
+{
+ return malloc(size);
+}
+
+DARWIN_API_AVAILABLE_20170407
+OS_ALWAYS_INLINE OS_WARN_RESULT OS_MALLOC __alloc_size(1, 2)
+static inline void *
+_os_calloc_loop(size_t cnt, size_t size)
+{
+ void *ptr = NULL;
+ while (!(ptr = calloc(cnt, size))) {
+ __os_temporary_resource_shortage();
+ }
+ return ptr;
+}
+
+DARWIN_API_AVAILABLE_20170407
+OS_ALWAYS_INLINE OS_WARN_RESULT OS_MALLOC __alloc_size(1, 2)
+static inline void *
+_os_calloc_known(size_t cnt, size_t size)
+{
+ return calloc(cnt, size);
+}
+
+DARWIN_API_AVAILABLE_20170407
+OS_ALWAYS_INLINE OS_WARN_RESULT OS_MALLOC
+static inline char *
+_os_strdup_loop(const char *str)
+{
+ char *ptr = NULL;
+ while (!(ptr = strdup(str))) {
+ __os_temporary_resource_shortage();
+ }
+ return ptr;
+}
+
+DARWIN_API_AVAILABLE_20170407
+OS_ALWAYS_INLINE OS_WARN_RESULT OS_MALLOC
+static inline char *
+_os_strdup_known(const char *str)
+{
+ return strdup(str);
+}
+
+/*!
+ * @function os_malloc
+ * Wrapper around malloc(3) which guarantees that the allocation succeeds.
+ *
+ * @param __size
+ * The size of the allocation.
+ *
+ * @result
+ * A new object that the caller is responsible for free(3)ing.
+ *
+ * This routine will never return NULL. If the size of the allocation is known
+ * at compile-time, a failure to allocate the object will abort the caller. If
+ * the size is not known at compile-time, the routine will retry until it is
+ * successful.
+ */
+#define os_malloc(__size) ({ \
+ void *ptr = NULL; \
+ size_t _size = (__size); \
+ if (__builtin_constant_p(__size) || !_dispatch_is_multithreaded()) { \
+ ptr = _os_malloc_known(_size); \
+ os_assert_malloc("known-constant allocation", ptr, _size); \
+ } else { \
+ ptr = _os_malloc_loop(_size); \
+ } \
+ (ptr); \
+})
+
+/*!
+ * @function os_calloc
+ * Wrapper around calloc(3) which guarantees that the allocation succeeds.
+ *
+ * @param __cnt
+ * The number of elements to allocate.
+ *
+ * @param __size
+ * The size of each element to allocate.
+ *
+ * @result
+ * A new object that the caller is responsible for free(3)ing.
+ *
+ * This routine will never return NULL. If the size of the allocation is known
+ * at compile-time, a failure to allocate the object will abort the caller. If
+ * the size is not known at compile-time, the routine will retry until it is
+ * successful.
+ */
+#define os_calloc(__cnt, __size) ({ \
+ void *ptr = NULL; \
+ size_t _size = (__size); \
+ size_t _cnt = (__size); \
+ if ((__builtin_constant_p(__cnt) && __builtin_constant_p(__size)) || \
+ !_dispatch_is_multithreaded()) { \
+ ptr = _os_calloc_known(_cnt, _size); \
+ os_assert_malloc("known-constant allocation", ptr, _size); \
+ } else { \
+ ptr = _os_calloc_loop(_cnt, _size); \
+ } \
+ (ptr); \
+})
+
+/*!
+ * @function os_strdup
+ * A wrapper around strdup(3) which guarantees that the string duplication
+ * succeeds.
+ *
+ * @param __str
+ * The string to duplicate.
+ *
+ * @result
+ * A new string that the caller is responsible for free(3)ing.
+ *
+ * This routine will never return NULL. If the given string is a compile-time
+ * constant, a failure to duplicate it will abort the caller. If the string is
+ * not a compile-time constant, the routine will retry until it is successful.
+ *
+ * @discussion
+ * strdup(3) is found in the string(3) API family, but this interface is in the
+ * stdlib.h header because its semantic changes are solely related to the manner
+ * in which memory is allocated.
+ */
+#define os_strdup(__str) ({ \
+ char *ptr = NULL; \
+ const char *_str = (__str); \
+ if (__builtin_constant_p(__str) || !_dispatch_is_multithreaded()) { \
+ ptr = _os_strdup_known(_str); \
+ os_assert_malloc("known-constant allocation", ptr, strlen(_str)); \
+ } else { \
+ ptr = _os_strdup_loop(_str); \
+ } \
+ (ptr); \
+})
+
+/*!
+ * @function os_localtime_file
+ * A routine to generate a time stamp that is suitable for embedding in a file
+ * name.
+ *
+ * @param buff
+ * A pointer to a buffer where the resulting time stamp will be stored.
+ *
+ * @discussion
+ * The resulting time stamp will not include characters which require escaping
+ * in shells, such as spaces. The current implementation format is
+ *
+ * YYYY-MM-DD_HH.MM.SS.us
+ *
+ * e.g.
+ *
+ * 2017-04-24_12.45.15.045609
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT
+void
+os_localtime_file(char buff[32]);
+
+/*!
+ * @function os_simple_hash
+ * An implementation of a simple non-cryptographic hashing algorithm.
+ *
+ * @param buff
+ * A pointer to the buffer to hash.
+ *
+ * @param len
+ * The length of the buffer.
+ *
+ * @result
+ * The hashed value of the input.
+ *
+ * @discussion
+ * This routine is meant to be used as a simple way to obtain a value that can
+ * be used to choose a bucket in a simple hash table. Do not attach security
+ * assumptions to the output of this routine. Do not assume thst the computed
+ * hash is stable between hosts, OS versions, or boot sessions.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NONNULL1
+uint64_t
+os_simple_hash(const void *buff, size_t len);
+
+/*!
+ * @function os_simple_hash_string
+ * An implementation of a simple non-cryptographic hashing algorithm.
+ *
+ * @param string
+ * A pointer to the null-terminated string to hash.
+ *
+ * @result
+ * The hashed value of the input.
+ *
+ * @discussion
+ * This routine is the moral equivalent of a call to
+ *
+ * os_simple_hash(buff, strlen(buff));
+ *
+ * All the same considerations of {@link os_simple_hash} apply.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_NONNULL1
+uint64_t
+os_simple_hash_string(const char *string);
+
+__END_DECLS;
+
+#endif // __DARWIN_STDLIB_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * Non-standard, Darwin-specific additions to the string(3) family of APIs.
+ */
+#ifndef __DARWIN_STRING_H
+#define __DARWIN_STRING_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS;
+
+/*!
+ * @typedef os_flag_t
+ * A type describing a flag's human-readable name.
+ *
+ * @property ohf_flag
+ * The flag value.
+ *
+ * @property ohf_human
+ * The human-readable, string representation of the flag value.
+ */
+DARWIN_API_AVAILABLE_20170407
+typedef struct _os_flag {
+ const uint64_t ohf_flag;
+ const char *const ohf_human_flag;
+} os_flag_t;
+
+/*!
+ * @define OS_FLAGSET_COUNT
+ * The maximum number of flags that a flagset can represent.
+ */
+#define OS_FLAGSET_COUNT (sizeof(uint64_t) * BYTE_SIZE)
+
+/*!
+ * @typedef os_flagset_t
+ * A type describing an array of human flags. Can accommodate up to 64 flags.
+ */
+DARWIN_API_AVAILABLE_20170407
+typedef os_flag_t os_flagset_t[OS_FLAGSET_COUNT];
+
+/*!
+ * @macro os_flag_init
+ * Initializer for a {@link os_flag_t} structure which stringifies the
+ * flag value.
+ *
+ * @param __flag
+ * The name of the flag to initialize.
+ */
+#define os_flag_init(__flag) { \
+ .ohf_flag = __flag, \
+ .ohf_human_flag = #__flag, \
+}
+
+/*!
+ * @function strerror_np
+ * Returns a human-readable string for the given {@link errno_t} or
+ * POSIX error code.
+ *
+ * @param code
+ * The error code for which to obtain the string.
+ *
+ * @result
+ * A human-readable string describing the error condition. If a POSIX error code
+ * is given, this is equivalent to a call to strerror(3).
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_PURE
+const char *
+strerror_np(int code);
+
+/*!
+ * @function symerror_np
+ * Returns the token name of the given {@link errno_t} or POSIX error
+ * code.
+ *
+ * @param code
+ * The error code for which to obtain the token string.
+ *
+ * @result
+ * The string describing the error token. For example, if code 2 is passed, the
+ * string "EPERM" is returned.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_PURE
+const char *
+symerror_np(int code);
+
+/*!
+ * @function symexit_np
+ * Returns the token name of the given sysexits(3) code.
+ *
+ * @param code
+ * The sysexits(3) code for which to obtain the token string.
+ *
+ * @result
+ * The string describing the exit code. For example, if 64 is passed, the string
+ * "EX_USAGE" is returned. If the code is unrecognized, "EX_UNAVAILABLE" is
+ * returned, which is more or less documented in sysexits(3) as the ¯\_(ツ)_/¯
+ * exit code.
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_PURE
+const char *
+symexit_np(int code);
+
+/*!
+ * @function os_flagset_copy_string
+ * Returns a human-readable representation of the flags set for a given word.
+ *
+ * @param flagset
+ * The human flagset which describes how to interpret the {@link flags}
+ * parameter.
+ *
+ * @param flags
+ * The flags to interpret.
+ *
+ * @result
+ * The human-readable representation of all flags set in the {@link flags}
+ * parameter, separated by the pipe character. The caller is responsible for
+ * calling free(3) on this object when it is no longer needed.
+ *
+ * @discussion
+ * This API is to be used in combination with {@link os_flag_init} to make
+ * printing the contents of flags fields simple. For example, this code can
+ * easily print a human-readable representation of the bits set in a Mach
+ * message header:
+ *
+ * static const os_flagset_t _mach_msgh_bits = {
+ * os_flag_init(MACH_MSGH_BITS_COMPLEX),
+ * os_flag_init(MACH_MSGH_BITS_RAISEIMP),
+ * os_flag_init(MACH_MSGH_BITS_IMPHOLDASRT),
+ * };
+ *
+ * char *flags_string = os_flagset_copy_string(&_mach_msgh_bits,
+ * hdr->msgh_bits);
+ *
+ * For a message header with the MACH_MSGH_BITS_COMPLEX and
+ * MACH_MSGH_BITS_RAISEIMP bits set, this will return the string
+ *
+ * MACH_MSGH_BITS_COMPLEX|MACH_MSGH_BITS_RAISEIMP
+ */
+DARWIN_API_AVAILABLE_20170407
+OS_EXPORT OS_WARN_RESULT OS_MALLOC
+char *
+os_flagset_copy_string(const os_flagset_t flagset, uint64_t flags);
+
+__END_DECLS;
+
+#endif // __DARWIN_STRING_H
/*
- * Copyright (c) 2016 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2016 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
*
* @APPLE_LICENSE_HEADER_END@
*/
+#include "internal.h"
+
+#pragma mark API
+void
+__os_temporary_resource_shortage(void)
+{
+ (void)sleep(1);
+ _os_avoid_tail_call();
+}
void
__libdarwin_init(void)
{
+
}
--- /dev/null
+/*
+ * Copyright (c) 2017 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * libdarwin internal header.
+ */
+#ifndef __DARWIN_INTERNAL_H
+#define __DARWIN_INTERNAL_H
+
+#include <os/base.h>
+#include <os/api.h>
+#include <Availability.h>
+
+#include <mach/port.h>
+#include <mach/message.h>
+#include <mach/host_priv.h>
+#include <mach/host_reboot.h>
+#include <mach/mach_time.h>
+#include <mach/mach.h>
+#include <mach/port.h>
+#include <mach/message.h>
+#include <mach/host_priv.h>
+#include <mach/host_reboot.h>
+
+#include <sys/sysctl.h>
+#include <sys/reboot.h>
+#include <sys/syscall.h>
+#include <sys/errno.h>
+#include <sys/paths.h>
+#include <sys/spawn.h>
+#include <sys/proc_info.h>
+#include <sys/sysctl.h>
+#include <sys/reboot.h>
+#include <sys/syscall.h>
+#include <sys/errno.h>
+#include <sys/paths.h>
+#include <sys/spawn.h>
+#include <sys/proc_info.h>
+
+#define OS_CRASH_ENABLE_EXPERIMENTAL_LIBTRACE 1
+#include <os/assumes.h>
+#include <os/transaction_private.h>
+#include <os/log_private.h>
+#include <os/alloc_once_private.h>
+
+#include <mach-o/getsect.h>
+#include <bsm/libbsm.h>
+#include <sysexits.h>
+#include <spawn.h>
+#include <libproc.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <err.h>
+#include <ctype.h>
+#include <struct.h>
+#include <bootstrap_priv.h>
+#include <assert.h>
+
+#define RDAR_12809455 1
+
+#include "h/bsd.h"
+#include "h/cleanup.h"
+#include "h/err.h"
+#include "h/errno.h"
+#include "h/mach_exception.h"
+#include "h/mach_utils.h"
+#include "h/stdio.h"
+#include "h/stdlib.h"
+#include "h/string.h"
+
+#if DARWIN_TAPI
+// Duplicate declarations to make TAPI happy. This header is included in the
+// TAPI build as an extra public header.
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT OS_NONNULL1
+void
+os_assert_mach(const char *op, kern_return_t kr);
+
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT
+void
+os_assert_mach_port_status(const char *desc, mach_port_t p,
+ mach_port_status_t *expected);
+#endif
+
+#endif //__DARWIN_INTERNAL_H
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark Types
+typedef struct _os_mach_port_disposition {
+ mach_msg_bits_t ompd_bits;
+ const char *const ompd_human;
+} os_mach_port_disposition_t;
+
+#define os_mach_port_disposition_init(d) [d] = { \
+ .ompd_bits = (d), \
+ .ompd_human = #d, \
+}
+
+#pragma mark Top-Level Statics
+static const os_flagset_t _mach_msgh_bits = {
+ os_flag_init(MACH_MSGH_BITS_COMPLEX),
+ os_flag_init(MACH_MSGH_BITS_RAISEIMP),
+ // MACH_MSGH_BITS_DENAP is deprecated
+ os_flag_init(MACH_MSGH_BITS_IMPHOLDASRT),
+ // MACH_MSGH_BITS_DENAPHOLDASRT is deprecated
+ // MACH_MSGH_BITS_CIRCULAR is kernel-internal
+};
+
+static const os_mach_port_disposition_t _mach_port_dispositions[] = {
+ os_mach_port_disposition_init(MACH_MSG_TYPE_MOVE_RECEIVE),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_MOVE_SEND),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_MOVE_SEND_ONCE),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_COPY_SEND),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_MAKE_SEND),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_MAKE_SEND_ONCE),
+ // MACH_MSG_TYPE_COPY_RECEIVE is not a valid operation, so unclear why it's
+ // even defined
+ os_mach_port_disposition_init(MACH_MSG_TYPE_DISPOSE_RECEIVE),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_DISPOSE_SEND),
+ os_mach_port_disposition_init(MACH_MSG_TYPE_DISPOSE_SEND_ONCE),
+};
+
+static inline const char *
+_mach_port_disposition_string(mach_msg_bits_t d)
+{
+ if (d < MACH_MSG_TYPE_MOVE_RECEIVE) {
+ return "[invalid]";
+ }
+ if (d > MACH_MSG_TYPE_DISPOSE_SEND_ONCE) {
+ return "[invalid]";
+ }
+ return _mach_port_dispositions[d].ompd_human;
+}
+
+static const os_flagset_t _mach_port_rights = {
+ os_flag_init(MACH_PORT_TYPE_SEND),
+ os_flag_init(MACH_PORT_TYPE_RECEIVE),
+ os_flag_init(MACH_PORT_TYPE_SEND_ONCE),
+ os_flag_init(MACH_PORT_TYPE_PORT_SET),
+ os_flag_init(MACH_PORT_TYPE_DEAD_NAME),
+ // MACH_PORT_TYPE_LABELH is obsolete
+ // MACH_PORT_TYPE_DNREQUEST->_mach_port_requests
+ // MACH_PORT_TYPE_SPREQUEST->_mach_port_requests
+ // MACH_PORT_TYPE_SPREQUEST_DELAYED->_mach_port_requests
+ // MACH_PORT_RIGHT_NUMBER is obsolete
+};
+
+static const os_flagset_t _mach_port_requests = {
+ os_flag_init(MACH_PORT_TYPE_DNREQUEST),
+ os_flag_init(MACH_PORT_TYPE_SPREQUEST),
+ os_flag_init(MACH_PORT_TYPE_SPREQUEST_DELAYED),
+};
+
+static const os_flagset_t _mach_port_status = {
+ os_flag_init(MACH_PORT_STATUS_FLAG_TEMPOWNER),
+ os_flag_init(MACH_PORT_STATUS_FLAG_GUARDED),
+ os_flag_init(MACH_PORT_STATUS_FLAG_STRICT_GUARD),
+ os_flag_init(MACH_PORT_STATUS_FLAG_IMP_DONATION),
+ // MACH_PORT_STATUS_FLAG_REVIVE is obsolete
+ os_flag_init(MACH_PORT_STATUS_FLAG_TASKPTR),
+};
+
+static const os_flagset_t _mach_special_bits = {
+ os_flag_init(MACH_MSG_IPC_SPACE),
+ os_flag_init(MACH_MSG_VM_SPACE),
+ os_flag_init(MACH_MSG_IPC_KERNEL),
+ os_flag_init(MACH_MSG_VM_KERNEL),
+};
+
+#pragma mark API
+const mach_msg_trailer_t *
+os_mach_msg_get_trailer(const mach_msg_header_t *hdr)
+{
+ // The mach_msg() documentation states that the trailer will follow the
+ // message body on the next natural boundary. But when we moved to 64-bit,
+ // we kept the trailer alignment on a 4-byte boundary for compatibility
+ // reasons. Specifically, natural_t is still 32 bits on both 32- and 64-bit
+ // platforms.
+ return (mach_msg_trailer_t *)((uint8_t *)hdr + round_msg(hdr->msgh_size));
+}
+
+const mach_msg_audit_trailer_t *
+os_mach_msg_get_audit_trailer(const mach_msg_header_t *hdr)
+{
+ const mach_msg_trailer_t *tlr = NULL;
+ const mach_msg_audit_trailer_t *audit_tlr = NULL;
+
+ tlr = os_mach_msg_get_trailer(hdr);
+ if (tlr->msgh_trailer_type == MACH_MSG_TRAILER_FORMAT_0) {
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_audit_trailer_t)) {
+ audit_tlr = (mach_msg_audit_trailer_t *)tlr;
+ }
+ }
+
+ return audit_tlr;
+}
+
+const mach_msg_context_trailer_t *
+os_mach_msg_get_context_trailer(const mach_msg_header_t *hdr)
+{
+ const mach_msg_trailer_t *tlr = NULL;
+ const mach_msg_context_trailer_t *ctx_tlr = NULL;
+
+ tlr = os_mach_msg_get_trailer(hdr);
+ if (tlr->msgh_trailer_type == MACH_MSG_TRAILER_FORMAT_0) {
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_context_trailer_t)) {
+ ctx_tlr = (mach_msg_context_trailer_t *)tlr;
+ }
+ }
+
+ return ctx_tlr;
+}
+
+char *
+os_mach_msg_copy_description(const mach_msg_header_t *msg)
+{
+ int ret = -1;
+ mach_msg_bits_t local = MACH_MSGH_BITS_LOCAL(msg->msgh_bits);
+ mach_msg_bits_t remote = MACH_MSGH_BITS_REMOTE(msg->msgh_bits);
+ mach_msg_bits_t voucher = MACH_MSGH_BITS_VOUCHER(msg->msgh_bits);
+ char *__os_free bits_desc = NULL;
+ const char *local_desc = _mach_port_disposition_string(local);
+ const char *remote_desc = _mach_port_disposition_string(remote);
+ const char *voucher_desc = _mach_port_disposition_string(voucher);
+ char *desc = NULL;
+ mach_msg_size_t ool_cnt = 0;
+
+ if (msg->msgh_bits & MACH_MSGH_BITS_COMPLEX) {
+ ool_cnt = ((mach_msg_base_t *)msg)->body.msgh_descriptor_count;
+ }
+
+ bits_desc = os_flagset_copy_string(_mach_msgh_bits, msg->msgh_bits);
+ ret = asprintf(&desc, "id = %#x, size = %u, bits = %s, "
+ "local disp = %s, local port = %#x, "
+ "remote disp = %s, remote port = %#x, "
+ "voucher disp = %s, voucher port = %#x, "
+ "out-of-line descriptor cnt = %u",
+ msg->msgh_id, msg->msgh_size, bits_desc,
+ local_desc, msg->msgh_local_port,
+ remote_desc, msg->msgh_remote_port,
+ voucher_desc, msg->msgh_voucher_port,
+ ool_cnt);
+ posix_assert_zero(ret);
+
+ return desc;
+}
+
+char *
+os_mach_msg_trailer_copy_description(const mach_msg_trailer_t *tlr)
+{
+ union {
+ int r;
+ size_t n;
+ } ret = {
+ .r = -1,
+ };
+ char *desc = NULL;
+ char buff[512];
+ char *cursor = buff;
+ size_t left = sizeof(buff);
+ // Yes we do not know the actual size of the trailer yet, so this is
+ // technically unsafe, but we only dereference members after determining
+ // that they are safe to dereference. Just us chickens and all that.
+ const mach_msg_mac_trailer_t *max = (const mach_msg_mac_trailer_t *)tlr;
+
+ if (tlr->msgh_trailer_type != MACH_MSG_TRAILER_FORMAT_0) {
+ ret.r = asprintf(&desc, "type = %u, size = %u",
+ tlr->msgh_trailer_type, tlr->msgh_trailer_size);
+ os_assert_zero(ret.r);
+ goto __out;
+ }
+
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_trailer_t)) {
+ ret.r = snprintf(cursor, left, "format = %u, size = %u",
+ tlr->msgh_trailer_type, tlr->msgh_trailer_size);
+ os_assert_sprintf(ret.r, left);
+
+ // Safe since the above assert has verified that ret is both positive
+ // and less than or equal to the size of the buffer.
+ cursor += ret.n;
+ left -= ret.n;
+ }
+
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_seqno_trailer_t)) {
+ ret.r = snprintf(cursor, left, ", seqno = %u", max->msgh_seqno);
+ os_assert_sprintf(ret.r, left);
+ cursor += ret.n;
+ left -= ret.n;
+ }
+
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_security_trailer_t)) {
+ ret.r = snprintf(cursor, left, ", security.uid = %u, security.gid = %u",
+ max->msgh_sender.val[0], max->msgh_sender.val[1]);
+ os_assert_sprintf(ret.r, left);
+ cursor += ret.n;
+ left -= ret.n;
+ }
+
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_audit_trailer_t)) {
+ ret.r = snprintf(cursor, left, ", audit.auid = %u, "
+ "audit.euid = %u, audit.egid = %u, "
+ "audit.ruid = %u, audit.rgid = %u, "
+ "audit.pid = %u, audit.asid = %u, audit.pidvers = %u",
+ max->msgh_audit.val[0], max->msgh_audit.val[1],
+ max->msgh_audit.val[2], max->msgh_audit.val[3],
+ max->msgh_audit.val[4], max->msgh_audit.val[5],
+ max->msgh_audit.val[6], max->msgh_audit.val[7]);
+ os_assert_sprintf(ret.r, left);
+ cursor += ret.n;
+ left -= ret.n;
+ }
+
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_context_trailer_t)) {
+ uint64_t ctx = max->msgh_context;
+ ret.r = snprintf(cursor, left, ", context = %#llx", ctx);
+ os_assert_sprintf(ret.r, left);
+ cursor += ret.n;
+ left -= ret.n;
+ }
+
+ if (tlr->msgh_trailer_size >= sizeof(mach_msg_mac_trailer_t)) {
+ ret.r = snprintf(cursor, left, ", labels.sender = %#x",
+ max->msgh_labels.sender);
+ os_assert_sprintf(ret.r, left);
+ cursor += ret.n;
+ left -= ret.n;
+ }
+
+ desc = os_strdup(buff);
+
+__out:
+ return desc;
+}
+
+char *
+os_mach_port_copy_description(mach_port_t p)
+{
+ kern_return_t kr = KERN_FAILURE;
+ mach_port_right_t right = 0;
+ mach_port_type_t type = 0;
+ mach_port_urefs_t urefs = 0;
+ mach_port_status_t status;
+ mach_msg_type_number_t status_size = MACH_PORT_RECEIVE_STATUS_COUNT;
+ char *desc = NULL;
+ char *__os_free rightdesc = NULL;
+ char *__os_free requestdesc = NULL;
+ char *__os_free statusdesc = NULL;
+ char *__os_free urefsdesc = NULL;
+ char *which_urefs = "";
+ int ret = -1;
+
+ if (p == MACH_PORT_NULL) {
+ return os_strdup("null");
+ }
+ if (p == MACH_PORT_DEAD) {
+ return os_strdup("dead-name");
+ }
+
+ kr = mach_port_type(mach_task_self(), p, &type);
+ switch (kr) {
+ case KERN_SUCCESS:
+ rightdesc = os_flagset_copy_string(_mach_port_rights, type);
+ requestdesc = os_flagset_copy_string(_mach_port_requests, type);
+ break;
+ default:
+ ret = asprintf(&rightdesc, "[%#x]", kr);
+ posix_assert_zero(ret);
+ }
+
+ kr = mach_port_get_attributes(mach_task_self(), p,
+ MACH_PORT_RECEIVE_STATUS, (mach_port_info_t)&status, &status_size);
+ switch (kr) {
+ case KERN_SUCCESS:
+ if (status.mps_flags) {
+ statusdesc = os_flagset_copy_string(_mach_port_status,
+ status.mps_flags);
+ } else {
+ statusdesc = os_strdup("[none]");
+ }
+
+ break;
+ case KERN_INVALID_RIGHT:
+ if (!(type & MACH_PORT_TYPE_RECEIVE)) {
+ statusdesc = os_strdup("[none]");
+ break;
+ }
+ default:
+ ret = asprintf(&statusdesc, "[%#x]", kr);
+ posix_assert_zero(ret);
+ }
+
+ if (type & MACH_PORT_TYPE_SEND) {
+ right = MACH_PORT_RIGHT_SEND;
+ which_urefs = "send";
+ } else if (type & MACH_PORT_TYPE_DEAD_NAME) {
+ right = MACH_PORT_RIGHT_DEAD_NAME;
+ which_urefs = "dead name";
+ }
+
+ if (which_urefs) {
+ kr = mach_port_get_refs(mach_task_self(), p, right, &urefs);
+ switch (kr) {
+ case KERN_SUCCESS:
+ ret = asprintf(&urefsdesc, ", %s urefs = %u", which_urefs, urefs);
+ break;
+ default:
+ ret = asprintf(&urefsdesc, ", %s urefs = [%#x]",
+ which_urefs, kr);
+ break;
+ }
+ }
+
+ ret = asprintf(&desc, "name = %#x, rights = %s, requests = %s, "
+ "status = %s%s",
+ p, rightdesc, requestdesc, statusdesc, urefsdesc);
+ posix_assert_zero(ret);
+
+ return desc;
+}
+
+#pragma mark API from <os/assumes.h>
+// These live here because the implementations uses functionality from
+// libdarwin, and we don't want to have a circular dependency between Libc and
+// libsystem_darwin. The long-term plan is to move assumes() and assert()
+// functionality into libdarwin anyway.
+void
+os_assert_mach(const char *op, kern_return_t kr)
+{
+ kern_return_t real_kr = (kern_return_t)(kr & (~MACH_MSG_MASK));
+ kern_return_t extra = (kern_return_t)(kr & MACH_MSG_MASK);
+ const char *err_string = NULL;
+ const char *err_type_string = NULL;
+ char err_buff[64];
+ char code_buff[16];
+ const char *special_desc = NULL;
+ int sys = err_get_system(real_kr);
+ int sub = err_get_sub(real_kr);
+ int code = err_get_code(real_kr);
+
+ if (kr == KERN_SUCCESS) {
+ return;
+ }
+
+ if (kr >= BOOTSTRAP_NOT_PRIVILEGED && kr <= BOOTSTRAP_NO_CHILDREN) {
+ err_string = bootstrap_strerror(kr);
+ snprintf(code_buff, sizeof(code_buff), "%d", kr);
+ err_type_string = "bootstrap";
+ } else {
+ err_string = mach_error_string(real_kr);
+ if (strcmp(err_string, "unknown error code") == 0) {
+ snprintf(err_buff, sizeof(err_buff), "[%#x|%#x|%#x]",
+ sys, sub, code);
+ err_string = err_buff;
+ err_type_string = "unrecognized";
+ } else {
+ err_type_string = "mach";
+ }
+
+ if (kr <= MIG_TYPE_ERROR && kr >= MIG_TRAILER_ERROR) {
+ snprintf(code_buff, sizeof(code_buff), "%d", kr);
+ } else {
+ snprintf(code_buff, sizeof(code_buff), "%#x", kr);
+ special_desc = os_flagset_copy_string(_mach_special_bits, extra);
+ }
+ }
+
+ if (special_desc) {
+ os_crash("%s failed: %s error = %s [%s], special bits = %s",
+ op, err_type_string, err_string, code_buff, special_desc);
+ } else {
+ os_crash("%s failed: %s error = %s [%s]",
+ op, err_type_string, err_string, code_buff);
+ }
+}
+
+void
+os_assert_mach_port_status(const char *desc, mach_port_t p,
+ mach_port_status_t *expected)
+{
+ kern_return_t kr = KERN_FAILURE;
+ mach_port_status_t status;
+ mach_msg_type_number_t status_cnt = MACH_PORT_RECEIVE_STATUS_COUNT;
+
+ kr = mach_port_get_attributes(mach_task_self(), p, MACH_PORT_RECEIVE_STATUS,
+ (mach_port_info_t)&status, &status_cnt);
+ os_assert_mach("get status", kr);
+
+ if (expected->mps_pset != UINT32_MAX) {
+ if (expected->mps_pset != status.mps_pset) {
+ os_crash("port set mismatch: actual = %u, expected = %u",
+ status.mps_pset, expected->mps_pset);
+ }
+ }
+ if (expected->mps_seqno != UINT32_MAX) {
+ if (expected->mps_seqno != status.mps_seqno) {
+ os_crash("sequence number mismatch: actual = %u, expected = %u",
+ status.mps_seqno, expected->mps_seqno);
+ }
+ }
+ if (expected->mps_mscount != UINT32_MAX) {
+ if (expected->mps_mscount != status.mps_mscount) {
+ os_crash("make-send count mismatch: actual = %u, expected = %u",
+ status.mps_mscount, expected->mps_mscount);
+ }
+ }
+ if (expected->mps_qlimit != UINT32_MAX) {
+ if (expected->mps_qlimit != status.mps_qlimit) {
+ os_crash("queue limit mismatch: actual = %u, expected = %u",
+ status.mps_qlimit, expected->mps_qlimit);
+ }
+ }
+ if (expected->mps_msgcount != UINT32_MAX) {
+ if (expected->mps_msgcount != status.mps_msgcount) {
+ os_crash("message count mismatch: actual = %u, expected = %u",
+ status.mps_msgcount, expected->mps_msgcount);
+ }
+ }
+ if (expected->mps_sorights != UINT32_MAX) {
+ if (expected->mps_sorights != status.mps_sorights) {
+ os_crash("send-once rights mismatch: actual = %u, expected = %u",
+ status.mps_sorights, expected->mps_sorights);
+ }
+ }
+ if (expected->mps_srights != INT32_MAX) {
+ if (expected->mps_srights != status.mps_srights) {
+ os_crash("send rights mismatch: actual = %d, expected = %d",
+ status.mps_srights, expected->mps_srights);
+ }
+ }
+ if (expected->mps_pdrequest != INT32_MAX) {
+ if (expected->mps_pdrequest != status.mps_pdrequest) {
+ os_crash("port-destroyed mismatch: actual = %d, expected = %d",
+ status.mps_pdrequest, expected->mps_pdrequest);
+ }
+ }
+ if (expected->mps_nsrequest != INT32_MAX) {
+ if (expected->mps_nsrequest != status.mps_nsrequest) {
+ os_crash("no-senders mismatch: actual = %d, expected = %d",
+ status.mps_nsrequest, expected->mps_nsrequest);
+ }
+ }
+ if (expected->mps_flags) {
+ if (expected->mps_flags != status.mps_flags) {
+ os_crash("flags mismatch: actual = %#x, expected = %#x",
+ status.mps_flags, expected->mps_flags);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark API
+size_t
+zsnprintf_np(char *buff, size_t len, const char *fmt, ...)
+{
+ int np = 0;
+ va_list ap;
+
+ va_start(ap, fmt);
+ np = vsnprintf(buff, len, fmt, ap);
+ va_end(ap);
+
+ if (np < 0) {
+ np = 0;
+ } else if ((size_t)np >= len) {
+ np = (int)len - 1;
+ }
+
+ return (size_t)np;
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark API
+void
+os_localtime_file(char buff[32])
+{
+ struct timeval tv;
+ struct tm curtime;
+
+ posix_assert_zero(gettimeofday(&tv, NULL));
+ (void)localtime_r(&tv.tv_sec, &curtime);
+
+ // Return a time representation that is ideal for use in filenames, so no
+ // spaces or things that need to be escaped.
+ snprintf(buff, 32, "%d-%02d-%02d_%02d.%02d.%02d.%06d",
+ curtime.tm_year + 1900, curtime.tm_mon + 1, curtime.tm_mday,
+ curtime.tm_hour, curtime.tm_min, curtime.tm_sec, tv.tv_usec);
+}
+
+// MurmurHash2 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+uint64_t
+os_simple_hash(const void *buff, size_t len)
+{
+ const uint64_t seed = 0;
+#ifdef __LP64__
+ // MurmurHash64A
+ const uint64_t m = 0xc6a4a7935bd1e995;
+ const int r = 47;
+ uint64_t h = seed ^ (len * m);
+ const uint64_t * data = (const uint64_t *)buff;
+ const uint64_t * end = data + (len / 8);
+ while(data != end) {
+ uint64_t k = *data++;
+ k *= m;
+ k ^= k >> r;
+ k *= m;
+ h ^= k;
+ h *= m;
+ }
+ const unsigned char * data2 = (const unsigned char *)data;
+ switch(len & 7) {
+ case 7: h ^= ((uint64_t)data2[6]) << 48;
+ case 6: h ^= ((uint64_t)data2[5]) << 40;
+ case 5: h ^= ((uint64_t)data2[4]) << 32;
+ case 4: h ^= ((uint64_t)data2[3]) << 24;
+ case 3: h ^= ((uint64_t)data2[2]) << 16;
+ case 2: h ^= ((uint64_t)data2[1]) << 8;
+ case 1: h ^= ((uint64_t)data2[0]);
+ h *= m;
+ };
+ h ^= h >> r;
+ h *= m;
+ h ^= h >> r;
+#else // __LP64__
+ // MurmurHash64B
+ const uint32_t m = 0x5bd1e995;
+ const int r = 24;
+
+ uint32_t h1 = (uint32_t)(seed) ^ len;
+ uint32_t h2 = (uint32_t)(seed >> 32);
+
+ const uint32_t * data = (const uint32_t *)buff;
+
+#define MIX(k, h) \
+ (k) *= m; (k) ^= (k) >> r; (k) *= m; (h) *= m; (h) ^= (k); len -= 4;
+
+ while(len >= 8) {
+ uint32_t k[2];
+ memcpy(k, (const char*)data, sizeof(k));
+ data += sizeof(k)/sizeof(k[0]);
+
+ MIX(k[0], h1)
+ MIX(k[1], h2)
+ }
+
+ if(len >= 4) {
+ uint32_t k[1];
+ memcpy(k, (const char *)data, sizeof(k));
+ data += sizeof(k)/sizeof(k[0]);
+
+ MIX(k[0], h1);
+ }
+
+#undef MIX
+
+ switch(len) {
+ case 3: h2 ^= ((unsigned char*)data)[2] << 16;
+ case 2: h2 ^= ((unsigned char*)data)[1] << 8;
+ case 1: h2 ^= ((unsigned char*)data)[0];
+ h2 *= m;
+ };
+
+ h1 ^= h2 >> 18; h1 *= m;
+ h2 ^= h1 >> 22; h2 *= m;
+ h1 ^= h2 >> 17; h1 *= m;
+ h2 ^= h1 >> 19; h2 *= m;
+
+ uint64_t h = h1;
+
+ h = (h << 32) | h2;
+#endif // __LP64__
+ return h;
+}
+
+uint64_t
+os_simple_hash_string(const char *string)
+{
+ size_t len = strlen(string);
+ return os_simple_hash(string, len);
+}
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+#include "internal.h"
+
+#pragma mark Definitions
+#define __ENEG_ONE (-1)
+#define __ENONE 0
+#define __EBOGUS (ELAST + 1)
+
+#pragma mark Types
+OS_ENUM(errno_flags, uint32_t,
+ EDF_INIT = 0,
+ EDF_NONPOSIX = (1 << 0),
+ EDF_SYSEXIT = (1 << 1),
+);
+
+typedef struct _errno_desc {
+ int ed_error;
+ int ed_sysexit;
+ errno_flags_t ed_flags;
+ const char *ed_sym;
+ const char *ed_str;
+} errno_desc_t;
+
+#pragma mark Initializers
+#define errno_init(__err, __sysexit, __str) \
+ [__err] = { \
+ .ed_error = (__err), \
+ .ed_sysexit = (__sysexit), \
+ .ed_flags = 0, \
+ .ed_sym = #__err, \
+ .ed_str = (__str), \
+ }
+
+#define errno_init_np(__err, __sysexit, __str) \
+ [__err - EBASE_NP] = { \
+ .ed_error = (__err), \
+ .ed_sysexit = (__sysexit), \
+ .ed_flags = EDF_NONPOSIX, \
+ .ed_sym = #__err, \
+ .ed_str = (__str), \
+ }
+
+#define sysexit_init(__code, __str) \
+ [__code - EX__BASE] = { \
+ .ed_error = (__code), \
+ .ed_sysexit = (__code), \
+ .ed_flags = EDF_SYSEXIT, \
+ .ed_sym = #__code, \
+ .ed_str = (__str), \
+ }
+
+#pragma mark Top-Level Statics
+static const errno_desc_t _negative_one = {
+ .ed_error = __ENEG_ONE,
+ .ed_sysexit = EXIT_FAILURE,
+ .ed_flags = 0,
+ .ed_sym = "-1",
+ .ed_str = "[return code instead of error]",
+};
+
+static const errno_desc_t _badreceipt = {
+ .ed_error = EX_BADRECEIPT_NP,
+ .ed_sysexit = EX_BADRECEIPT_NP,
+ .ed_flags = EDF_SYSEXIT,
+ .ed_sym = "EX_BADRECEIPT_NP",
+ .ed_str = "bad purchase receipt",
+};
+
+static const errno_desc_t _posix_errors[] = {
+ errno_init(__ENONE, EX_OK, "[no error]"),
+ errno_init(EPERM, EX_NOPERM, "Operation not permitted"),
+ errno_init(ENOENT, EX_NOINPUT, "No such file or directory"),
+ errno_init(ESRCH, EX_IOERR, "No such process"),
+ errno_init(EINTR, EX_OSERR, "Interrupted system call"),
+ errno_init(EIO, EX_IOERR, "Input/output error"),
+ errno_init(ENXIO, EX_NOINPUT, "Device not configured"),
+ errno_init(E2BIG, EX_IOERR, "Argument list too long"),
+ errno_init(ENOEXEC, EX_DATAERR, "Exec format error"),
+ errno_init(EBADF, EX_OSERR, "Bad file descriptor"),
+ errno_init(ECHILD, EX_IOERR, "No child processes"),
+ errno_init(EDEADLK, EX_UNAVAILABLE, "Resource deadlock avoided"),
+ errno_init(ENOMEM, EX_TEMPFAIL, "Cannot allocate memory"),
+ errno_init(EACCES, EX_NOINPUT, "Permission denied"),
+ errno_init(EFAULT, EX_OSERR, "Bad address"),
+#if defined(ENOTBLK)
+ errno_init(ENOTBLK, EX_IOERR, "Block device required"),
+#endif
+ errno_init(EBUSY, EX_TEMPFAIL, "Device / Resource busy"),
+ errno_init(EEXIST, EX_CANTCREAT, "File exists"),
+ errno_init(EXDEV, EX_UNAVAILABLE, "Cross-device link"),
+ errno_init(ENODEV, EX_IOERR, "Operation not supported by device"),
+ errno_init(ENOTDIR, EX_DATAERR, "Not a directory"),
+ errno_init(EISDIR, EX_DATAERR, "Is a directory"),
+ errno_init(EINVAL, EX_NOINPUT, "Invalid argument"),
+ errno_init(ENFILE, EX_OSERR, "Too many open files in system"),
+ errno_init(EMFILE, EX_OSERR, "Too many open files"),
+ errno_init(ENOTTY, EX_PROTOCOL, "Inappropriate ioctl for device"),
+ errno_init(ETXTBSY, EX_TEMPFAIL, "Text file busy"),
+ errno_init(EFBIG, EX_NOINPUT, "File too large"),
+ errno_init(ENOSPC, EX_CANTCREAT, "No space left on device"),
+ errno_init(ESPIPE, EX_IOERR, "Illegal seek"),
+ errno_init(EROFS, EX_NOPERM, "Read-only file system"),
+ errno_init(EMLINK, EX_OSERR, "Too many links"),
+ errno_init(EPIPE, EX_IOERR, "Broken pipe"),
+ errno_init(EDOM, EX_DATAERR, "Numerical argument out of domain"),
+ errno_init(ERANGE, EX_DATAERR, "Result too large"),
+ errno_init(EAGAIN, EX_TEMPFAIL, "Resource temporarily unavailable"),
+ errno_init(EINPROGRESS, EX_TEMPFAIL, "Operation now in progress"),
+ errno_init(EALREADY, EX_TEMPFAIL, "Operation already in progress"),
+ errno_init(ENOTSOCK, EX_PROTOCOL, "Socket operation on non-socket"),
+ errno_init(EDESTADDRREQ, EX_PROTOCOL, "Destination address required"),
+ errno_init(EMSGSIZE, EX_PROTOCOL, "Message too long"),
+ errno_init(EPROTOTYPE, EX_PROTOCOL, "Protocol wrong type for socket"),
+ errno_init(ENOPROTOOPT, EX_PROTOCOL, "Protocol not available"),
+ errno_init(EPROTONOSUPPORT, EX_PROTOCOL, "Protocol not supported"),
+#if defined(ESOCKTNOSUPPORT)
+ errno_init(ESOCKTNOSUPPORT, EX_PROTOCOL, "Socket type not supported"),
+#endif
+ errno_init(ENOTSUP, EX_UNAVAILABLE, "Operation not supported"),
+#if defined(EPFNOSUPPORT)
+ errno_init(EPFNOSUPPORT, EX_PROTOCOL, "Protocol family not supported"),
+#endif
+ errno_init(EAFNOSUPPORT, EX_PROTOCOL,
+ "Address family not supported by protocol family"
+ ),
+ errno_init(EADDRINUSE, EX_PROTOCOL, "Address already in use"),
+ errno_init(EADDRNOTAVAIL, EX_OSERR, "Can't assign requested address"),
+ errno_init(ENETDOWN, EX_NOHOST, "Network is down"),
+ errno_init(ENETUNREACH, EX_NOHOST, "Network is unreachable"),
+ errno_init(ENETRESET, EX_NOHOST, "Network dropped connection on reset"),
+ errno_init(ECONNABORTED, EX_OSERR, "Software caused connection abort"),
+ errno_init(ECONNRESET, EX_PROTOCOL, "Connection reset by peer"),
+ errno_init(ENOBUFS, EX_TEMPFAIL, "No buffer space available"),
+ errno_init(EISCONN, EX_PROTOCOL, "Socket is already connected"),
+ errno_init(ENOTCONN, EX_PROTOCOL, "Socket is not connected"),
+#if defined(ESHUTDOWN)
+ errno_init(ESHUTDOWN, EX_PROTOCOL, "Can't send after socket shutdown"),
+ errno_init(ETOOMANYREFS, EX_PROTOCOL, "Too many references: can't splice"),
+#endif
+ errno_init(ETIMEDOUT, EX_TEMPFAIL, "Operation timed out"),
+ errno_init(ECONNREFUSED, EX_PROTOCOL, "Connection refused"),
+ errno_init(ELOOP, EX_DATAERR, "Too many levels of symbolic links"),
+ errno_init(ENAMETOOLONG, EX_DATAERR, "File name too long"),
+#if defined(EHOSTDOWN)
+ errno_init(EHOSTDOWN, EX_NOHOST, "Host is down"),
+#endif
+ errno_init(EHOSTUNREACH, EX_NOHOST, "No route to host"),
+ errno_init(ENOTEMPTY, EX_DATAERR, "Directory not empty"),
+#if defined(EPROCLIM)
+ errno_init(EPROCLIM, EX_TEMPFAIL, "Too many processes"),
+ errno_init(EUSERS, EX_NOUSER, "Too many users"),
+#endif
+ errno_init(EDQUOT, EX_CANTCREAT, "Disc quota exceeded"),
+ errno_init(ESTALE, EX_NOINPUT, "Stale NFS file handle"),
+#if defined(EREMOTE)
+ errno_init(EREMOTE, EX_DATAERR, "Too many levels of remote in path"),
+ errno_init(EBADRPC, EX_PROTOCOL, "RPC struct is bad"),
+ errno_init(ERPCMISMATCH, EX_PROTOCOL, "RPC version wrong"),
+ errno_init(EPROGUNAVAIL, EX_PROTOCOL, "RPC prog. not avail"),
+ errno_init(EPROGMISMATCH, EX_PROTOCOL, "Program version wrong"),
+ errno_init(EPROCUNAVAIL, EX_PROTOCOL, "Bad procedure for program"),
+#endif
+ errno_init(ENOLCK, EX_OSERR, "No locks available"),
+ errno_init(ENOSYS, EX_UNAVAILABLE, "Function not implemented"),
+#if defined(EFTYPE)
+ errno_init(EFTYPE, EX_DATAERR, "Inappropriate file type or format"),
+ errno_init(EAUTH, EX_NOPERM, "Authentication error"),
+ errno_init(ENEEDAUTH, EX_NOPERM, "Need authenticator"),
+ errno_init(EPWROFF, EX_UNAVAILABLE, "Device power is off"),
+ errno_init(EDEVERR, EX_UNAVAILABLE, "Device error, e.g. paper out"),
+#endif
+ errno_init(EOVERFLOW, EX_DATAERR,
+ "Value too large to be stored in data type"
+ ),
+#if defined(EBADEXEC)
+ errno_init(EBADEXEC, EX_DATAERR, "Bad executable"),
+ errno_init(EBADARCH, EX_DATAERR, "Bad CPU type in executable"),
+ errno_init(ESHLIBVERS, EX_DATAERR, "Shared library version mismatch"),
+ errno_init(EBADMACHO, EX_DATAERR, "Malformed Macho file"),
+#endif
+ errno_init(ECANCELED, EX_UNAVAILABLE, "Operation canceled"),
+ errno_init(EIDRM, EX_UNAVAILABLE, "Identifier removed"),
+ errno_init(ENOMSG, EX_UNAVAILABLE, "No message of desired type"),
+ errno_init(EILSEQ, EX_DATAERR, "Illegal byte sequence"),
+#if defined(ENOATTR)
+ errno_init(ENOATTR, EX_UNAVAILABLE, "Attribute not found"),
+#endif
+ errno_init(EBADMSG, EX_PROTOCOL, "Bad message"),
+ errno_init(EMULTIHOP, EX_UNAVAILABLE, "Reserved"),
+ errno_init(ENODATA, EX_NOINPUT, "No message available on STREAM"),
+ errno_init(ENOLINK, EX_UNAVAILABLE, "Reserved"),
+ errno_init(ENOSR, EX_TEMPFAIL, "No STREAM resources"),
+ errno_init(ENOSTR, EX_PROTOCOL, "Not a STREAM"),
+ errno_init(EPROTO, EX_PROTOCOL, "Protocol error"),
+ errno_init(ETIME, EX_TEMPFAIL, "STREAM ioctl timeout"),
+#if defined(EOPNOTSUPP)
+ errno_init(EOPNOTSUPP, EX_PROTOCOL, "Operation not supported on socket"),
+#endif
+ errno_init(ENOPOLICY, EX_UNAVAILABLE, "No such policy registered"),
+#if defined(ENOTRECOVERABLE)
+ errno_init(ENOTRECOVERABLE, EX_CONFIG, "State not recoverable"),
+ errno_init(EOWNERDEAD, EX_NOHOST, "Previous owner died"),
+#endif
+#if defined(EQFULL)
+ errno_init(EQFULL, EX_CANTCREAT, "Interface output queue is full"),
+#endif
+ errno_init(__EBOGUS, EX_UNAVAILABLE, "[invalid]"),
+};
+
+static const errno_desc_t _darwin_errors[] = {
+ errno_init_np(ENOTENTITLED_NP, EX_NOPERM, "Requestor not entitled"),
+ errno_init_np(ENOTPLATFORM_NP, EX_NOPERM, "Requestor not platform binary"),
+ errno_init_np(EROOTLESS_NP, EX_NOPERM,
+ "Operation disallowed by System Integrity Protection"
+ ),
+ errno_init_np(ETAINTED_NP, EX_NOPERM,
+ "Requestor is tainted and untrusthworthy"
+ ),
+ errno_init_np(EQUARANTINE_NP, EX_NOPERM,
+ "Operation not permitted on quarantined file"
+ ),
+ errno_init_np(EBADUSER_NP, EX_NOINPUT, "Invalid username or identifier"),
+ errno_init_np(EBADGROUP_NP, EX_NOINPUT, "Invalid group name or identifier"),
+ errno_init_np(EOWNERSHIP_NP, EX_NOINPUT,
+ "Ownership and/or permissions insufficiently restrictive"
+ ),
+ errno_init_np(ENOOOO_NP, EX_PROTOCOL, "Out-of-order operation rejected"),
+ errno_init_np(ENOTBUNDLE_NP, EX_NOINPUT, "Entity not a bundle"),
+ errno_init_np(EBADBUNDLE_NP, EX_DATAERR, "Malformed bundle"),
+ errno_init_np(EBADPATH_NP, EX_DATAERR, "Malformed path"),
+ errno_init_np(EBADPLIST_NP, EX_DATAERR, "Malformed property list"),
+ errno_init_np(EBADKEY_NP, EX_DATAERR, "Unrecognized key"),
+ errno_init_np(EBADVAL_NP, EX_DATAERR, "Invalid or missing value for key"),
+ errno_init_np(EBADSUBSYS_NP, EX_DATAERR,
+ "Routine referenced an invalid subsystem"
+ ),
+ errno_init_np(E2BIMPL_NP, EX_UNAVAILABLE, "Routine not yet implemented"),
+ errno_init_np(EDEPRECATED_NP, EX_UNAVAILABLE, "Routine deprecated"),
+ errno_init_np(EREMOVED_NP, EX_UNAVAILABLE, "Routine removed"),
+ errno_init_np(EDROPPED_NP, EX_PROTOCOL, "Routine invocation dropped"),
+ errno_init_np(EDEFERRED_NP, EX_TEMPFAIL, "Routine invocation deferred"),
+ errno_init_np(EUSAGE_NP, EX_USAGE, "Bad command line usage"),
+ errno_init_np(EUNKNOWN_NP, EX_UNAVAILABLE,
+ "Unknown error from another subsystem"
+ ),
+};
+
+static const errno_desc_t _sysexits[] = {
+ sysexit_init(EX_USAGE, "command line usage error"),
+ sysexit_init(EX_DATAERR, "data format error"),
+ sysexit_init(EX_NOINPUT, "cannot open input"),
+ sysexit_init(EX_NOUSER, "addressee unknown"),
+ sysexit_init(EX_NOHOST, "host name unknown"),
+ sysexit_init(EX_UNAVAILABLE, "service unavailable"),
+ sysexit_init(EX_SOFTWARE, "internal software error"),
+ sysexit_init(EX_OSERR, "system error (e.g., can't fork)"),
+ sysexit_init(EX_OSFILE, "critical OS file missing"),
+ sysexit_init(EX_CANTCREAT, "can't create (user) output file"),
+ sysexit_init(EX_IOERR, "input/output error"),
+ sysexit_init(EX_TEMPFAIL, "temp failure"),
+ sysexit_init(EX_PROTOCOL, "remote error in protocol"),
+ sysexit_init(EX_NOPERM, "permission denied"),
+ sysexit_init(EX_CONFIG, "configuration error"),
+};
+
+#pragma mark Utilities
+static const errno_desc_t *
+_find_error(int code)
+{
+ if (code < 0) {
+ return &_negative_one;
+ }
+
+ if (code >= EBASE_NP && code <= __ELAST_NP) {
+ return &_darwin_errors[code - EBASE_NP];
+ }
+
+ if (code >= 0 && code <= ELAST) {
+ return &_posix_errors[code];
+ }
+
+ return &_posix_errors[__EBOGUS];
+}
+
+static const errno_desc_t *
+_find_sysexit(int code)
+{
+ if (code == EX_BADRECEIPT_NP) {
+ return &_badreceipt;
+ }
+
+ if (code < EX__BASE || code > EX__MAX) {
+ return &_sysexits[EX_UNAVAILABLE - EX__BASE];
+ }
+
+ return &_sysexits[code - EX__BASE];
+}
+
+static void
+_writeflag(const char *humanflag, const char *sep, char *buff, size_t len,
+ char **track_buff, size_t *track_sz)
+{
+ size_t offs = 0;
+
+ if (*track_buff != buff) {
+ offs = zsnprintf_np(*track_buff, *track_sz, "%s", sep);
+ *track_buff += offs;
+ *track_sz -= offs;
+ }
+
+ offs = zsnprintf_np(*track_buff, *track_sz, "%s", humanflag);
+ *track_buff += offs;
+ *track_sz -= offs;
+}
+
+#pragma mark API
+int
+sysexit_np(int code)
+{
+ const errno_desc_t *de = _find_error(code);
+ return de->ed_sysexit;
+}
+
+const char *
+strerror_np(int code)
+{
+ if (code >= 0 && code <= ELAST) {
+ return strerror(code);
+ }
+
+ return _find_error(code)->ed_str;
+}
+
+const char *
+symerror_np(int code)
+{
+ const errno_desc_t *de = _find_error(code);;
+ return de->ed_sym;
+}
+
+const char *
+symexit_np(int code)
+{
+ const errno_desc_t *de = _find_sysexit(code);
+ return de->ed_sym;
+}
+
+char *
+os_flagset_copy_string(const os_flagset_t flagset, uint64_t flags)
+{
+ size_t i = 0;
+ const os_flag_t *fi = NULL;
+ char buff[1024] = "[none]";
+ char *cursor = buff;
+ size_t left = sizeof(buff);
+
+ while (i < OS_FLAGSET_COUNT && (fi = &flagset[i]) && fi->ohf_flag) {
+ if (flags & fi->ohf_flag) {
+ _writeflag(fi->ohf_human_flag, "|", buff, sizeof(buff),
+ &cursor, &left);
+ }
+ i++;
+ }
+
+ return os_strdup(buff);
+}
+
/*
- * Copyright (c) 2016 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2016 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#else
-static bool _check_internal_diags_profile() {
- static enum check_status internal_diags_profile = S_UNKNOWN;
-
+static bool _check_internal_diags_profile(void)
+{
if (internal_diags_profile == S_UNKNOWN) {
xpc_object_t profile_settings = read_plist(INTERNAL_DIAGS_PROFILE_PATH);
if (profile_settings) {
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#ifndef RUNEOFF32
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93";
return (data);
}
#endif /* !RUNEOFF32 */
+#pragma clang diagnostic pop
#include <locale.h>
#include <libkern/OSAtomic.h>
#include <pthread.h>
+#include <pthread/tsd_private.h>
#include <limits.h>
#include <os/lock.h>
#include "setlocale.h"
return &__global_locale;
}
#endif
-
- locale_t __locale = (locale_t)pthread_getspecific(__locale_key);
- return (__locale ? __locale : &__global_locale);
+ void *__thread_locale;
+ if (_pthread_has_direct_tsd()) {
+ __thread_locale = _pthread_getspecific_direct(__locale_key);
+ } else {
+ __thread_locale = pthread_getspecific(__locale_key);
+ }
+ return (__thread_locale ? (locale_t)__thread_locale : &__global_locale);
}
static inline __attribute__((always_inline)) locale_t
atof.3 atof.3 atof_l.3
atoi.3 atoi.3 atoi_l.3
atol.3 atol.3 atol_l.3 atoll.3 atoll_l.3
-backtrace.3 backtrace.3 backtrace_symbols.3 backtrace_symbols_fd.3
+backtrace.3 backtrace.3 backtrace_symbols.3 backtrace_symbols_fd.3 backtrace_from_fp.3 backtrace_image_offsets.3
basename.3 basename.3 basename_r.3
bcmp.3 bcmp.3
bcopy.3 bcopy.3
strtol_l.3 strtol_l.3 strtoimax_l.3 strtoll_l.3 strtoq_l.3 strtoul_l.3 strtoull_l.3 strtoumax_l.3 strtouq_l.3
strtoul.3 strtoul.3 strtoull.3 strtoumax.3 strtouq.3
strxfrm.3 strxfrm.3 strxfrm_l.3
+style.3 style.3
swab.3 swab.3
sync_volume_np.3 sync_volume_np.3 fsync_volume_np.3
sysconf.3 sysconf.3
--- /dev/null
+.\" Copyright (c) 2017 Apple Inc. All rights reserved.
+.Dd 12 January, 2018
+.Dt style 3
+.Os Darwin
+.Sh NAME
+.Nm style
+.Nd C language style guide for Darwin low-level userspace projects
+.Sh DESCRIPTION
+This style's primary objective is to be as friendly to the code review process
+as possible. Therefore, the style aims to ensure that code changes to the
+project produce diffs that are
+.Pp
+.Bl -bullet -compact -offset indent
+.It
+small
+.It
+unambiguous
+.It
+viewable in side-by-side comparison tools
+.El
+.Pp
+As a secondary objective, this style also aims to make code as clear as possible
+for an uninitiated programmer reading it. "Clever" syntactic shortcuts are
+actively discouraged in favor of code that is easy to understand, even if it is
+less concise. Coincidentally, this practice also tends to lend itself to
+generating more readable diffs.
+.Pp
+Like any style, consistent adherence across a project is a virtue in and of
+itself, resulting in less distraction for the reader. However, these guidelines
+should be taken as exactly that: guidelines. No style can be completely adhered
+to all the time. When you have convinced yourself that a deviation from the
+style is called for, just make sure it is for the greater good and maintains the
+style's aims of minimizing diffs and code complexity.
+.Sh GENERAL PRINCIPLES
+.Ss Vertical space is a commodity
+Scrolling vertically has always been easier than scrolling horizontally.
+Computer mouse manufacturers went so far as to dedicate hardware to the task of
+scrolling vertically when they came up with scroll wheels. Even on modern
+trackpads, while it is possible to scroll horizontally, it is far easier to
+scroll vertically. You just flick upwards. Do not be afraid to introduce extra
+lines of code if it will result in clearer, more human-parseable diffs when
+those lines are changed.
+.Ss Horizontal space is precious
+Scrolling horizontally is typically awkward, imprecise, and does not lend itself
+well toward reading on computers or even in print. (Academic journals frequently
+publish with two narrow columns per page to make reading easier, for example.)
+Lines should be wrapped consciously; this should not be left to the editor. A
+soft-wrapping scheme that looks good in your editor may not look good in someone
+else's editor (or with a different configuration for the same editor).
+.Pp
+Just as natural language comments are difficult to read in one, long line,
+so too are lines of code. Both natural languages and programming languages
+deserve conscious, deliberate wrapping to improve readability.
+.Pp
+Wrap at a column width narrow enough to accommodate side-by-side patch
+review. 80 is more likely to accommodate this, but 120 might be fine too. Pick a
+reasonable column width and stick to it. Think about the lines you are wrapping.
+If you have to wrap a line, do so in a way that is clear, and be willing to make
+changes to accommodate that (e.g. don't be afraid to declare a variable
+separately if having the declaration and assignment on the same line causes it
+to wrap in an unclear way).
+.Ss Indentation is for scope indication and nothing else
+Indentation's sole purpose is to indicate scope. You should not use indentation
+to align characters on two lines of source code (beyond, of course, aligning
+the first characters of each line if they are both in the same scope).
+.Pp
+Given this aspect of the style, it does not particularly matter whether the
+author chooses spaces or tabs for indentation, and therefore the style makes no
+prescription (other than to pick one and stick with it).
+.Pp
+This style also has another implication: tabs and spaces should never appear
+in sequence. Each line will be a series of tabs followed by the first character
+of code. Tabs will never appear after the initial indentation of the line.
+.Ss Don't require leaving the source to understand it
+Always think of future maintainers and document your thought process for them.
+Remember, a "future maintainer" might be you after you've forgotten why you did
+something. For non-trivial changes, you should not rely on linking to a
+ticket-tracking system to provide context and explanation for a piece of code.
+You should strive to ensure the reader of your code does not have to
+context-switch out of reading it in order to understand it.
+.Pp
+This is not to say that linking to external resources in code is bad, but
+if a change's purpose can be reasonably expressed without interrupting how the
+code reads and flows, just do it. You don't need to publish a whitepaper in
+comments, but don't just give a link or ticket number with no context.
+.Ss Each line of code should minimize entropy
+It is actually very difficult to construct a hash comparison scheme that humans
+can use without error consistently, and there have been successful social
+engineering attacks on getting humans to read two hashes that are "close enough"
+as identical. This means that humans need a lot of help telling the difference
+between two lines of text.
+.Pp
+For any expression, divide it up into fundamental atoms (variable declarations,
+conditionals, etc.) and then assign each of those atoms to its own line of code.
+If you do this, when you change a single atom, it is immediately obvious that
+.Em only
+that atom changed and nothing else did. The more atoms share lines of code, the
+more likely it is that changes to them will generate complex diffs that humans
+will have difficulty understanding.
+.Ss Don't assume a specific editor
+Assume people will be reading your code in a tool that you do not control and
+cannot influence. Try viewing your code in such a tool and make sure that it is
+understandable. If you follow the guidelines of this style, your code may appear
+different in another viewer (in terms of how many columns are required to
+display a single line), but its structure will appear identical.
+.Sh SPECIFIC GUIDELINES
+.Ss Column Width and Line Wrap
+80 columns opens the door for a three-way, side-by-side comparison, but it could
+be impractical for a number of reasons. 120 columns should provide a nice
+balance, but really all that matters is that you pick a width and stick to it.
+.Pp
+When indenting a continuation line, indent over by two additional tabs. This
+visually separates the indented line from the next line, which may itself be
+indented. If there is an operator in the middle of the line, the operator should
+.Em not
+be wrapped to the continuation line.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+if (some_condition && some_other_condition &&
+ yet_another_condition) {
+ exit(0);
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if (some_condition && some_other_condition &&
+ yet_another_condition) {
+ exit(0);
+}
+
+if (some_condition && some_other_condition
+ && yet_another_condition) {
+ exit(0);
+}
+.Ed
+.Pp
+Notice on the good example that the
+.Ic exit(0)
+line is made obviously distinct from the indented conditions above it. It's very
+clear on quick visual inspection that it's not a part of the conditional checks.
+The
+.Ic &&
+is left on the first line because, when reviewing a patch to this area, it will
+be immediately clear to the reviewer that that line continues to the next one.
+.Pp
+.Ss Avoid prettifying alignment
+Indentation is used only for indicating scope, so no consideration is given to
+visual alignment of equal signs, colons, etc. across multiple lines.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+typedef enum {
+ THING0 = 0,
+ THING1 = 1,
+ THING_THAT_IS_REALLY_LONG = 2,
+} thing_t;
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+enum {
+ THING0 = 0,
+ THING1 = 1,
+ THING_THAT_IS_REALLY_LONG = 2,
+};
+.Ed
+.Pp
+This creates bloated diffs. If you have to re-align a ton of lines after you've
+added something longer, you get a bunch of whitespace diffs. So for variable
+declarations, enumerations, assignments, etc. just keep every line independent.
+.Pp
+There is one exception to this rule, and that is if you choose to define a
+flagset in terms of its raw hexadecimal values and wish to align them. In this
+case, it is a significant benefit to have these values aligned, and you may do
+so with spaces.
+.Pp
+.Em Example
+.Bd -literal -offset indent
+typedef enum {
+ F_INIT = 0x00,
+ F_FOO = 0x01,
+ F_BARBAZ = 0x02,
+ F_CAD = 0x04,
+ F_FAD = 0x08,
+ F_FUD = 0x10,
+ F_FLAME = 0x20,
+ F_FOOD = 0x40,
+} flag_t;
+.Ed
+.Ss Only one blank line at a time
+Use blank lines to separate logical chunks of code. Do not use more than one.
+.Ss Initialization
+C99 has named initializers for structures. Prefer those to initializing members
+one-by-one later on. Both structures and arrays should be initialized in the
+same style, with each element of the initializer being on its own line. This is
+so that when an element is added to or removed from the initialization list,
+that change gets its own line of diff.
+.Pp
+The exception to this is the string literal.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+struct my_struct baz = {
+ .ms_foo = 1,
+ .ms_bar = NULL,
+};
+
+char *strings[] = {
+ "string",
+ "other string",
+};
+.Ed
+.Em Bad
+.Bd -literal -offset indent
+struct my_struct baz = { 1, NULL };
+
+struct my_struct baz = {
+ 1,
+ NULL
+};
+
+struct my_struct baz = { .ms_foo = 1, .ms_bar = NULL, };
+.Ed
+.Pp
+The last element of an initializer list should be followed by a comma. This is
+so that when you add a new element to that list, it's a one-line diff rather
+rather than a two-line diff (one line of diff to add the
+.Ic ,
+to the previous-last element, and another line of diff to add the new-last
+element).
+.Pp
+.Em Good
+.Bd -literal -offset indent
+enum {
+ THING0,
+ THING1,
+};
+
+struct my_point p = {
+ .x = 1,
+ .y = 0,
+ .z = 1,
+};
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+enum {
+ THING0, THING1,
+};
+
+enum {
+ THING0,
+ THING1
+};
+
+struct my_point p = { .x = 1, .y = 0, .z = 1 };
+.Ed
+.Pp
+Note that, if your project requires ANSI C compliance, you should disregard this
+guideline, as it will not work under C89.
+.Ss Avoid function name overloading
+The
+.Xr clang 1
+compiler supports extensions to the C language which allow for function name
+overloading. Name overloading generally leads to code which is difficult to
+read and introspect and should be avoided.
+.Ss Prefix `struct` members
+Any
+.Ic struct
+which is shared or exported should have a common prefix for each member. This
+helps avoid collisions with preprocessor macros.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+struct foobar {
+ int64_t fb_baz;
+ char *fb_string;
+};
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+struct foobar {
+ int64_t baz;
+ char *string;
+};
+.Ed
+.Pp
+.Ss Types end with `_t`
+A type is indicated with
+.Ic _t
+at the end of the
+.Ic typedef ,
+whether the type refers to a
+.Ic struct ,
+.Ic union ,
+.Ic enum ,
+etc. All types are indicated this way. Types are in all lower-case letters.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+typedef uint64_t handle_t;
+typedef enum foo foo_t;
+typedef union bar bar_t;
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+typedef uint64_t Handle;
+typedef enum foo foo_e;
+typedef union bar bar_u;
+.Ed
+.Ss Use explicitly-sized integer types
+Avoid integer types whose names do not indicate size, such as
+.Ic int
+or
+.Ic long .
+Instead, use the types from
+.Ic stdint.h
+(e.g.
+.Ic int64_t ,
+.Ic uint32_t ,
+etc.), which explicitly indicate size. You may use size-ambiguous integer types
+if an API requires it.
+.Ss Use `sizeof()` on variables rather than types where appropriate
+The
+.Ic sizeof()
+operator can take both types and variables as arguments. Where possible and
+relevant, always pass a variable. This ensures that if the variable's type
+changes, the proper size is used automatically.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+uuid_t ident;
+memcpy(ident, buff, sizeof(ident));
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+uuid_t ident;
+memcpy(ident, buff, sizeof(uuid_t));
+.Ed
+.Pp
+.Em IMPORTANT :
+When applied to a
+.Ic char * ,
+.Ic sizeof()
+will return the width of a pointer,
+.Em not
+the size of the string literal it points to, so take care to only use
+.Xr strlen 3
+for such cases.
+.Pp
+Relatedly, when applied to an array variable that is a parameter in a function's
+parameter list,
+.Ic sizeof()
+will return the width of a pointer,
+.Em not
+the size of the type.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+char *string = "the quick brown fox";
+size_t len = strlen(string);
+
+void
+foo(uuid_t u)
+{
+ uuid_t u2;
+ memcpy(u2, u, sizeof(uuid_t));
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+char *string = "the quick brown fox";
+size_t len = sizeof(string) - 1;
+
+void
+foo(uuid_t u)
+{
+ uuid_t u2;
+
+ // sizeof(u) == sizeof(void *) in this context.
+ memcpy(u2, u, sizeof(u));
+}
+.Ed
+.Ss Functions which take no parameters have a parameter list of `void`
+In C, an empty function parameter list means that
+.Em any
+set of parameters is acceptable. In virtually all cases where you do this, you
+mean to have a parameter list of
+.Ic void .
+.Pp
+.Em Good
+.Bd -literal -offset indent
+void
+foo(void)
+{
+ do_a_thing_without_arguments();
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+void
+foo()
+{
+ do_a_thing_without_arguments();
+}
+.Ed
+.Ss Preprocessor macros
+Preprocessor definitions are written in all-caps. Macros which are function-like
+may be lower-case provided they do not double-evaluate their arguments.
+Function-like macros that do double-evaluate their arguments should be in
+all-caps.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+#define FOO 1
+#define halt() abort()
+
+// Does not double-evaluate _a and _b such that max(i++, j) is safe.
+#define max(_a, _b) ({ \\
+ typeof(_a) a1 = (_a); \\
+ typeof(_b) b1 = (_b); \\
+ (a1 < b1 ? b1 : a1); \\
+})
+
+// Double-evaluates _a and _b, so MAX(i++, j) is not safe.
+#define MAX(_a, _b) ((_a) < (_b) ? (_b) : (_a))
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+#define kFoo 1
+
+// Double-evaluates _a and _b.
+#define max(_a, _b) ((_a) < (_b) ? (_b) : (_a))
+.Ed
+.Pp
+Where possible, you should prefer inline functions to preprocessor macros, or
+split a macro into a preprocessor piece and an inline function piece.
+.Pp
+.Em Example
+.Bd -literal -offset indent
+static inline void
+_debug_uint64_impl(const char *name, uint64_t val)
+{
+ fprintf(stderr, "%s = %llu\\n", name, val);
+}
+
+#define debug_uint64(_v) do { \\
+ _debug_uint64_impl(#_v, _v); \\
+} while (0)
+.Ed
+.Pp
+In this example, the preprocessor is used to do something that only the
+preprocessor can do: stringify the input variable's name. But once that work is
+done, the actual logging of the value is done by an inline function. This keeps
+the code much more readable.
+.Ss Preprocessor macro parameters should be distinguished
+Preprocessor macro expansion can run afoul of naming collisions with other
+variables that are in the same scope as the macro being expanded. To help avoid
+such collisions, parameters to preprocessor macros should have a prefix, suffix
+or both. Another good option is to use a
+.Ic _[A-Z]
+prefix, since it is reserved by the C standard and will not collide with
+preprocessor evaluation.
+.Pp
+.Em Example
+.Bd -literal -offset indent
+#define foo2(_x_) ((_x_) * 2)
+#define foo4(_x) ((_x) * 4)
+#define foo8(_X) ((_X) * 8)
+.Ed
+.Ss Preprocessor macro parameters should always be evaluated
+When passing a parameter to a preprocessor macro, it should always be referred
+to within parentheses to force evaluation. The exception is for parameters
+intended to be string literals.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+#define add2(__x) ((__x) + 2)
+#define println(__fmt, ...) printf(__fmt "\\n", ## __VA_ARGS__)
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+#define add2(__x) x + 2
+.Ed
+.Ss Preprocessor directives always start at column 0
+Preprocessor directives do not have scope, and therefore they always start at
+column zero.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+if (do_loop) {
+ for (i = 0; i < 10; i++) {
+#if CONFIG_FOOBAR
+ foobar(i);
+#else
+ foobaz(i);
+#endif
+ }
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if (do_loop) {
+ for (i = 0; i < 10; i++) {
+ #if CONFIG_FOOBAR
+ foobar(i);
+ #else
+ foobaz(i);
+ #endif
+ }
+}
+.Ed
+.Ss Always reference string length directly
+Do not hard-code the size of a string. Use either
+.Ic sizeof(str) - 1
+or
+.Ic strlen(str) .
+In the latter case,
+.Xr clang 1
+is smart enough to recognize when a constant string is being passed to
+.Xr strlen(3)
+and replace the function call with the string's actual length.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+char str[] = "string";
+frob_string(str, sizeof(str) - 1);
+frob_string(str, strlen(str));
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+char str[] = "string";
+frob_string(str, 6);
+.Ed
+.Ss Don't pointlessly validate inputs
+If you control all call sites for a function, then there is no point to
+validating the inputs to that function. If none of your call sites pass
+.Ic NULL ,
+to a pointer parameter, for example, then the a
+.Ic NULL
+input indicates that there is state corruption in your address space. You may
+think that it's good to catch such corruption, but
+.Ic NULL
+is just
+.Em one
+possible invalid pointer value. What if the invalid input is
+.Ic 0x1 ?
+What if it is
+.Ic 0x2 ?
+Should you also check for those?
+.Pp
+This kind of input checking complicates code. Because it indicates state
+corruption, the only sensible thing to do in that situation would be to abort.
+But the operating system has mechanisms in place to detect the reference of an
+invalid resource, such as virtual memory and use-after-free detection. There is
+no point to you duplicating these mechanisms.
+.Pp
+Of course, you should always validate inputs
+.Em when they come from untrusted external sources
+(such as a file or IPC message), but if the inputs only ever comes from your
+program, you should trust them.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+static foo_t *
+get_item(foo_t *arr, size_t idx)
+{
+ return &arr[idx];
+}
+
+int
+only_call_site(foo_t *f)
+{
+ foo_t *arr = calloc(10, sizeof(arr[0]));
+ if (!arr) {
+ return errno;
+ }
+
+ *f = get_item(arr, 0);
+ return 0;
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+static foo_t *
+get_item(foo_t *arr, size_t idx)
+{
+ if (!arr) {
+ // No point to this check since we'll abort immediately below when we
+ // try to dereference `arr`. The crash report will have more than enough
+ // information to diagnose the NULL pointer dereference if it ever
+ // happens.
+ abort();
+ }
+ return &arr[idx];
+}
+
+int
+only_call_site(foo_t *f)
+{
+ foo_t *arr = calloc(10, sizeof(arr[0]));
+ if (!arr) {
+ return errno;
+ }
+
+ *f = get_item(arr, 0);
+ return 0;
+}
+.Ed
+.Ss Abort on bad API inputs
+The C language provides precious few compile-time validation mechanisms, and so
+in many cases it is not possible to fully describe to the compiler the range of
+expected inputs for an API. So your API should validate input from its caller
+and abort on invalid input. Returning an error in such a case is pointless,
+since the caller probably isn't checking the return code anyway. The only sure
+way to get the programmer's attention is to abort the calling process with a
+helpful message. The
+.Ic os_crash
+routine allows you to supply such a message that the crash reporter on Darwin
+will display in its crash report.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+uint8_t
+foo_a_bar(uint8_t number)
+{
+ if (number > (UINT8_MAX / 2)) {
+ os_crash("number given to foo_a_bar() too large");
+ }
+ return (number * 2);
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+int
+foo_a_bar(uint8_t number, uint8_t *new_number)
+{
+ if (number > (UINT8_MAX / 2)) {
+ return EINVAL;
+ }
+ *new_number = (number * 2);
+ return 0;
+}
+.Ed
+.Ss Don't mingle POSIX return codes and errors
+Some POSIX routines have return values that indicate whether you should check
+.Ic errno ,
+and others just return the error directly. While POSIX generally documents what
+does what pretty well, there are lots of SPIs scattered around the system that
+use both conventions and aren't documented at all, leaving you to spelunk
+through the implementation to find out what's what.
+.Pp
+To avoid confusion, do not re-use the same variable for the return codes from
+these functions. If an API returns a code indicating that you should check
+.Ic errno ,
+name it
+.Ic ret
+or similar. If it returns the error directly, name it
+.Ic error
+or similar and make it of type
+.Ic errno_t .
+This makes it very clear to the person reading the code that you did the work to
+find out how the API worked. By naming the variable you store the return value
+in appropriately, a reader of your code (possibly Future You) can immediately
+know what's going on.
+.Pp
+If you are making new API or SPI that returns an error code, make it return
+.Ic errno_t
+and do not use the global
+.Ic errno
+for communicating error information.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+#include <sys/types.h>
+
+errno_t error = posix_spawn(NULL, "ls", NULL, NULL, argv, envp);
+switch (error) {
+case 0:
+ // Handle success.
+ break;
+case EACCES:
+ // Handle "permission denied".
+ break;
+}
+
+int ret = reboot(RB_AUTOBOOT);
+if (ret == -1) {
+ switch (errno) {
+ case EPERM:
+ // Handle "permission denied".
+ break;
+ case EBUSY:
+ // Handle "reboot already in progress".
+ break;
+ }
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+int ret = posix_spawn(NULL, "ls", NULL, NULL, argv, envp);
+switch (error) {
+case 0:
+ // Handle success.
+ break;
+case EACCES:
+ // Handle "permission denied".
+ break;
+}
+
+int error = reboot(RB_AUTOBOOT);
+if (error == -1) {
+ switch (errno) {
+ case EPERM:
+ // Handle "permission denied".
+ break;
+ case EBUSY:
+ // Handle "reboot already in progress".
+ break;
+ }
+}
+.Ed
+.Ss Avoid complex `if` statements and return distinct error codes
+Breaking up a single complex
+.Ic if
+statement
+into multiple distinct checks is both more readable and makes it possible to be
+more granular about handling failure cases. It also leads to smaller diffs if
+one of those conditions turns out to require special handling.
+.Pp
+Complex
+.Ic if
+statements are often associated with input validation and just returning an
+error code (usually
+.Ic EINVAL )
+if any input is invalid. While deciding which error to return in which case is
+more of an art than a science, that doesn't mean you should just give up and
+return a single error every time there isn't an immediately obvious fit to the
+case you've encountered.
+.Pp
+Ideally, every case where your routine may fail should be represented by a
+distinct error code, but this is often not practical. Still, you should attempt
+to distinguish each
+.Em likely
+failure case with its own error code. The POSIX error space is fairly rich, and
+error descriptions are brief enough that they can be liberally interpreted. For
+example,
+.Ic ESRCH
+can be used to apply to any situation where a resource could not be located, not
+just conditions where there is literally "No such process".
+.Pp
+This isn't to say that you should never have compound conditions in an
+.Ic if
+statement, but the groupings should almost always be small, and the grouped
+checks should be highly likely to require change as a group when change is
+needed.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+if (foo->f_int > 10 || foo->f_int < 5)
+ return ERANGE;
+}
+
+if (!foo->f_uaddr) {
+ return EFAULT;
+}
+
+if (foo->f_has_idx && foo->f_idx > 100) {
+ return ERANGE;
+}
+
+if (foo->f_state != FS_INITIALIZED) {
+ return EBUSY;
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if (foo->f_int > 10 || foo->f_int < 5 || !foo->f_uaddr || (foo->f_has_idx && foo->f_idx > 100) ||
+ foo->f_state != FS_INITIALIZED) {
+ return EINVAL;
+}
+.Ed
+.Pp
+See
+.Xr intro 2 ,
+.Ic <sys/errno.h> ,
+and
+.Ic <os/error.h>
+for the error codes supported on Darwin.
+.Ss Don't NULL-check when calling `free(3)`
+.Ic NULL
+is valid input to
+.Xr free 3 .
+It's part of the API contract. Armed with this knowledge, you can do things like
+avoid conditional memory calls, which are always weird.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+char buff[1024];
+char *ptr = buff;
+char *what2free = NULL;
+
+if (condition) {
+ ptr = malloc(8);
+ what2free = ptr;
+}
+
+free(what2free);
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+char buff[1024];
+char *ptr = buff;
+bool did_malloc = false;
+
+if (condition) {
+ ptr = malloc(8);
+ did_malloc = true;
+}
+
+if (did_malloc) {
+ free(ptr);
+}
+.Ed
+.Ss Distinguish exported and non-exported symbols
+Any non-exported symbols should be prefixed with a
+.Ic _ .
+Thus any
+.Ic static
+functions, project-local interfaces, etc. should have this prefix. Exported
+symbols (API or SPI) should
+.Em not
+have such a prefix.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+static const char *_thing = "thing";
+static void _foo(void);
+
+void
+_project_local_interface(void);
+.Ed
+.Em Bad
+.Bd -literal -offset indent
+static const char *thing = "thing";
+static void foo(void);
+
+void
+project_local_interface(void);
+.Ed
+.Pp
+Global variables should have a sensible prefix, preferably related to the
+project name -- e.g. globals in the
+.Xr libxpc 3
+project are prefixed with
+.Ic xpc_ .
+.Pp
+You may also consider declaring a global structure which contains all of your
+project's shared, unexported global state. This makes it very clear when code is
+referencing that state. Also, if your project is a library at the libSystem
+layer, this is required if you are ever to adopt
+.Xr os_alloc_once 3 .
+.Pp
+.Em Example
+.Bd -literal -offset indent
+typedef struct _foobar_globals {
+ uint64_t fg_global_int;
+ char *fg_global_string;
+} foobar_globals_t;
+
+foobar_globals_t _g;
+foobar_globals_t *g = &_g;
+.Ed
+.Ss Distinguish SPIs meant for one caller
+Sometimes projects must create bespoke SPIs for one particular caller, and these
+SPIs are not considered suitable for general use. Append a suffix to these SPIs
+to indicate their bespokeness and the intended caller with
+.Ic _4caller .
+For example, if you add an SPI specifically for IOKit, your suffix would likely
+be
+.Ic _4IOKit .
+.Ss Use `#if` instead of `#ifdef` where appropriate
+.Ic #ifdef
+is to check if a token is
+.Em defined at all to anything.
+.Ic #if
+is to check the token's value. The C standard specifies that when a token is
+undefined,
+.Ic #if
+will evaluate it as
+.Ic 0 .
+When checking for features, it's almost always more appropriate to use
+.Ic #if
+since the lack of a feature could still be communicated by setting the token's
+value to
+.Ic 0 ,
+which would pass the
+.Ic #ifdef
+check.
+.Ss Use Function Attributes from `<os/base.h>`
+If you're on Darwin,
+.Ic libplatform
+defines a lot of nice macros for compiler attributes. Use them to decorate your
+functions. This gives the compiler lots more information so it can do fancy
+optimizations. Things like
+.Ic OS_NONNULL
+let the compiler know that a parameter should never be
+.Ic NULL .
+.Ic OS_WARN_RESULT
+is great for enforcing that a caller always check the return value of a
+function.
+.Pp
+.Ic OS_MALLOC
+lets the compiler know that the function returns a heap allocation, and
+.Ic OS_OBJECT_RETURNS_RETAINED
+lets ARC know that the function returns an object with a reference that the
+caller is responsible for releasing.
+.Pp
+You can avoid having to decorate all your pointer parameters by using
+.Ic OS_ASSUME_NONNULL_BEGIN
+and
+.Ic OS_ASSUME_NONNULL_END
+and specifically annotating variables which
+.Em can
+be
+.Ic NULL
+with the
+.Ic _Nullable
+keyword. Either approach is acceptable.
+.Pp
+Generally, use these attributes on functions which will have callers who cannot
+view the implementation. Putting many of these attributes on (for example) an
+inline function is harmless, but the compiler can reason about things like
+.Ic OS_NONNULL
+and infer it when it can view the implementation at all call sites.
+.Pp
+So as a rule of thumb, if it's in a header, decorate it appropriately. These
+attributes can also serve as nice implicit documentation around API and SPI. For
+example, if you have a decoration of
+.Ic OS_NONNULL1 ,
+you don't have to spell out in the HeaderDoc that you can't pass
+.Ic NULL
+for that parameter; it'll be right there in the declaration, and the compiler
+will catch attempts to do so.
+.Ss Distinguish C function definitions from declarations
+In C, make the definition of a function findable and distinguishable from its
+declaration (if any) through regular expressions. This way, you can find the
+implementation of
+.Ic foo
+by doing a regex search for
+.Ic ^foo ,
+and you won't get the declaration as a result.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+static int foo(int bar);
+
+int
+foo(int bar)
+{
+ return bar;
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+static int foo(int bar);
+
+int foo(int bar)
+{
+ return bar;
+}
+.Ed
+.Pp
+This has the additional benefit of allowing you to change the name/parameter
+list of a function independently of the return type. A diff of either will not
+be confused with the rest of the function signature.
+.Ss Use HeaderDoc for API declarations
+Make them look nice. Include the appropriate decorations (including an explicit
+export attribute such as
+.Ic OS_EXPORT
+so it's very, very clear that it's intended to be API), availability attributes,
+and HeaderDoc. Put this stuff before the function.
+.Pp
+.Em Example
+.Bd -literal -offset indent
+/*!
+ * @function foo
+ * Returns `bar` and ignores another parameter.
+ *
+ * @param bar
+ * The value to return.
+ *
+ * @param baz
+ * The value to ignore.
+ *
+ * @result
+ * The value of `bar`. This routine cannot fail.
+ */
+__API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT OS_WARN_RESULT OS_NONNULL2
+int
+foo(int bar, char *baz);
+.Ed
+.Ss Comments
+In general, use C++/C99-style comments. But there may be good reasons to use the
+classic C-style comments, such as for HeaderDoc, which requires them, e.g.
+.Bd -literal -offset indent
+/*!
+ * Documentation
+ */
+.Ed
+.Pp
+Long, top-level comments may also use classic C-style comments.
+.Pp
+C++/C99-style comments may directly follow code on the same line only if they
+are extremely brief. Otherwise, in general, comments and code should not share
+a line.
+.Pp
+Also, do not get cute with
+.Ic /* */
+comments and embed them within code.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+// Comment on what the loop does.
+for (i = 0; i < cnt; i++) {
+ // some code...
+}
+
+/*
+ * A top-level or very long comment.
+ */
+
+int ret = esoteric_spi(); // returns -1 on failure, does not set errno
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+//Comment
+
+int ret = esoteric_spi(); // This SPI returns -1 on failure but does not set
+ // errno, so here is a comment explaining that that really should be above
+ // the line of code rather than immediately following it.
+
+foo(arg1, /* first argument */, arg2 /* second argument */);
+.Ed
+.Ss `case` and `switch` are indented at the same level
+.Ic case
+and
+.Ic switch
+belong at the same column indent because indentation indicates scope, and due to
+case fall-through, all cases are in the same scope -- one lower than the
+previous. (Unless you scope them explicitly with braces, but you should avoid
+doing that if at all possible.)
+.Pp
+.Em Good
+.Bd -literal -offset indent
+switch (thing) {
+case THING1:
+ exit(0);
+ break;
+case THING2:
+ exit(1);
+ break;
+default:
+ __builtin_unreachable();
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+switch (thing) {
+case THING1: {
+ exit(0);
+ break;
+}
+case THING2: {
+ exit(1);
+ break;
+}
+default:
+ __builtin_unreachable();
+}
+
+switch (thing) {
+ case THING1:
+ exit(0);
+ break;
+ case THING2:
+ exit(1);
+ break;
+ default: {
+ __builtin_unreachable();
+ }
+}
+.Ed
+.Ss Use typed `enum`s
+If you're declaring an
+.Ic enum ,
+you should
+.Ic typedef
+it so the compiler can reason about valid values and know the width of the
+.Ic enum
+type if possible. The
+.Ic OS_ENUM
+macro provides the correct behavior for C, C++, and Objective-C.
+.Ss Initialize all variables and fail closed
+If you pre-declare a variable before using it, initialize it to a sane value. If
+this value is something like the return value of the function, initialize it to
+a value which indicates failure of the operation. You should
+.Em always
+do this even if there are no code paths which fail to initialize the variable
+later. It's just good practice, and it gives the person reading your code an
+indication of what ranges of values the variable is expected to hold.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+int result = -1;
+
+if (success) {
+ result = 0;
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+int result;
+
+if (success) {
+ result = 0;
+}
+.Ed
+.Pp
+Any error variable should always be initialized to a non-success condition. In
+general, consider success as something that your code must
+.Em explicitly declare
+and that the absence of such a declaration indicates failure.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+int error = -1;
+
+if (is_root()) {
+ error = 0;
+} else {
+ error = EPERM;
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+int error = 0;
+
+if (!is_root()) {
+ error = EPERM;
+}
+.Ed
+.Pp
+Note that you may omit an initializer for a complex
+.Ic struct
+type (such as the
+.Xr stat 2
+.Ic struct )
+but then it is incumbent upon you to ensure that that variable is not used
+uninitialized except to populate it. For many
+.Ic struct
+types, you can initialize them with
+.Ic {0} .
+This will not work for structures with nested structures though. For those you
+can use
+.Xr bzero 3
+or similar.
+.Ss Using `goto` is fine
+.Ic goto
+has gotten a bad rap, but it's probably the best way in C to do lots of
+sequential error handling. You don't
+.Em have
+to use
+.Ic goto
+if you don't want to, but if you do, just keep a a couple things in mind.
+.Pp
+.Bl -bullet -compact -offset indent
+.It
+Compile with
+.Ic -Wsometimes-uninitialized .
+With this warning,
+.Xr clang 1
+will catch cases where a variable may be used uninitialized because a
+.Ic goto
+skipped the initialization.
+.It
+Never use
+.Ic goto
+as a looping construct. The C language has a few different control statements
+for looping and iteration. Use one of those; it's not the 70's anymore.
+.El
+.Pp
+These guidelines make it simple to use
+.Ic goto
+effectively while avoiding the
+most common pitfalls.
+.Ss Avoid magic Booleans
+Sometimes you have to pass a parameter to a function to trigger some sort of
+behavior. Avoid using a magic Boolean for these cases. Instead, use an invariant
+that describes the behavior you are triggering.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+replace_spaces(string, REPLACE_TABS_TOO);
+replace_spaces(string, REPLACE_ONLY_SPACES);
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+replace_spaces(string, true);
+replace_spaces(string, false);
+.Ed
+.Pp
+If you find yourself creating many such Boolean values for function parameters,
+you should seriously considering defining a set of flags and passing that as one
+parameter instead.
+.Ss Spaces around binary operators
+In general, avoid code that looks crunched together, especially around
+operators. Specifically:
+.Bl -bullet -compact -offset indent
+.It
+Unary operators should
+.Em not
+have spaces around them.
+.It
+Binary operators
+.Em should
+have spaces around them.
+.It
+The ternary operator
+.Em should
+have spacing around it.
+.El
+.Pp
+.Em Good
+.Bd -literal -offset indent
+i++;
+j = i + k;
+k += condition ? i : j;
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+i ++;
+j=i+k
+k+=condition?i:j;
+.Ed
+.Ss Reserve the ternary operator for trivial cases
+Don't use the ternary operator to choose between complex or long expressions.
+Reserve it for very trivial cases that are highly unlikely to change. In general
+if you've found yourself putting the expressions in your usage of ternary
+operator on multiple lines, you should just be using an
+.Ic if
+statement.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+i += condition ? j : k;
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+i += (i < j && j > k || i == j) ? foo(bar, baz, 0, NULL) : frob(bar, 0, NULL, baz);
+.Ed
+.Ss Spaces around parentheses
+.Bl -bullet -compact -offset indent
+.It
+Put a space between the control statement and the parenthesis indicating its
+condition.
+.It
+Do
+.Em not
+put a space between the end of a function name and the parenthesis
+indicating its argument list.
+.It
+Do
+.Em not
+put spaces between any parenthesis and its following content.
+.El
+.Pp
+.Em Good
+.Bd -literal -offset indent
+if (condition) {
+ do_thing();
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if(condition) {
+ do_thing ();
+}
+
+if ( condition ) {
+ do_thing ( argument );
+}
+.Ed
+.Pp
+.Em Worse
+.Bd -literal -offset indent
+while( condition) {
+ do_thing( );
+}
+.Ed
+.Ss Braces and statements
+Always, always, always use braces for your control statements. Lack of braces
+can and has led to serious security issues that were missed during code review,
+and putting the braces there from the start means that adding new statements to
+that clause does not require you to also add the braces.
+.Pp
+The clause should be indented on the next line with no blank lines in between.
+.Pp
+.Em Good
+.Bd -literal -offset indent
+if (condition) {
+ do_thing();
+}
+
+while (condition) {
+ do_thing();
+}
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if (condition) do_thing();
+
+if (condition)
+ do_thing();
+
+while (condition) do_thing();
+
+while (condition) {
+
+ do_thing();
+}
+.Ed
+.Pp
+Even trivial uses of braceless
+.Ic if
+statements are problematic. Consider the following:
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if (error) i++,
+i++;
+.Ed
+.Pp
+This is admittedly contrived, but it would be likely to escape code review
+because it's very easy to miss that the first line ends with a
+.Ic ,
+rather than a
+.Ic ; .
+Braces in
+.Ic if
+statements are sensitive enough to security that the best policy is to simply
+always use them, without exception.
+.Pp
+Specific rules for braces:
+.Bl -bullet -compact -offset indent
+.It
+.Ic else
+goes between two braces on the same line.
+.It
+The brace which indicates the expression associated with a control flow
+statement goes on the same line as that statement or the same line as the last
+continuation line of the statement.
+.It
+The brace which begins the definition of a
+.Ic struct ,
+.Ic union ,
+.Ic enum ,
+etc. goes on the same line as the declaration.
+.It
+The brace concluding the expression associated with a control flow statement
+is aligned with the same column as that control flow statement.
+.It
+The opening brace of a function definition goes on its own line and is
+immediately followed by a new line.
+.It
+Control statements with empty bodies should have empty braces.
+.El
+.Pp
+.Em Good
+.Bd -literal -offset indent
+if (condition) {
+ do_thing();
+} else {
+ do_other_thing();
+}
+
+void
+function(void)
+{
+ return;
+}
+
+struct my_struct {
+ uint32_t thing;
+};
+
+for (cur; cur; cur = cur->next) { }
+.Ed
+.Pp
+.Em Bad
+.Bd -literal -offset indent
+if (condition)
+{
+ do_thing();
+}
+else
+{
+ do_other_thing();
+}
+
+if (condition)
+{
+ do_thing();
+}
+else
+ do_other_thing();
+
+void
+function(void) {
+ return;
+}
+
+struct my_struct
+{
+ uint32_t thing;
+};
+
+for (cur; cur; cur = cur->next)
+.Ed
+.Pp
+.Em Worse
+.Bd -literal -offset indent
+if (condition)
+ {
+ do_thing();
+ }
+
+void
+function(void)
+{ return;
+}
+.Ed
+.Sh SEE ALSO
+.Xr style 9 ,
+.Xr intro 2 ,
+.Xr errno 3 ,
+.Xr types 5
+.Sh HISTORY
+This style was largely derived from the style that evolved through the
+.Xr launchd 8 ,
+.Xr libdispatch 3 ,
+and
+.Xr libxpc 3
+projects.
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
static const char rcsid[] = "$Id: inet_addr.c,v 1.4.18.1 2005/04/27 05:00:52 sra Exp $";
#undef inet_aton
__weak_reference(__inet_aton, inet_aton);
+#pragma clang diagnostic pop
/*! \file */
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)inet_network.c 8.1 (Berkeley) 6/4/93";
#undef inet_network
__weak_reference(__inet_network, inet_network);
+#pragma clang diagnostic pop
/*! \file */
#include <errno.h>
#include <sys/socket.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+#pragma clang diagnostic ignored "-Wint-conversion"
+
#define MAX_V4_ADDR_LEN 16
#define MAX_V6_ADDR_LEN 64
memcpy(dst, tmp, len);
return dst;
}
+#pragma clang diagnostic pop
******************************************************************/
+#include <_stdio.h>
+#include <sys/_types/_off_t.h>
+
/*
* Magic definitions
*/
--- /dev/null
+/*
+ * Copyright (c) 2018 Apple Inc. All rights reserved.
+ *
+ * @APPLE_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. 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_LICENSE_HEADER_END@
+ */
+
+/*!
+ * @header
+ * API macros. libdarwin provides APIs for low-level userspace projects in the
+ * Darwin operating system.
+ *
+ * - C language additions
+ * - POSIX and BSD API additions
+ * - POSIX and BSD convenience wrappers
+ * - Mach API additions and wrappers with clearer semantics
+ *
+ * Additions which extend the C language are not prefixed and are therefore not
+ * included by default when including this header.
+ *
+ * Additions to API families conforming to ANSI C carry the "os_" prefix.
+ *
+ * Additions to API families conforming to POSIX carry the "_np" ("Not POSIX")
+ * suffix.
+ *
+ * Additions to API families conforming to both POSIX and ANSI C carry the "_np"
+ * suffix.
+ *
+ * Convenience wrappers for POSIX and BSD APIs carry the "os_" prefix.
+ *
+ * New APIs formalizing Darwin workflows carry the "os_" prefix.
+ */
+#ifndef __DARWIN_API_H
+#define __DARWIN_API_H
+
+#include <os/availability.h>
+
+/*!
+ * @const DARWIN_API_VERSION
+ * The API version of the library. This version will be changed in accordance
+ * with new API introductions so that callers may submit code to the build that
+ * adopts those new APIs before the APIs land by using the following pattern:
+ *
+ * #if DARWIN_API_VERSION >= 20180424
+ * darwin_new_api();
+ * #endif
+ *
+ * In this example, the libdarwin maintainer and API adopter agree on an API
+ * version of 20180424 ahead of time for the introduction of
+ * darwin_new_api_call(). When a libdarwin with that API version is submitted,
+ * the project is rebuilt, and the new API becomes active.
+ *
+ * Breaking API changes will be both covered under this mechanism as well as
+ * individual preprocessor macros in this header that declare new behavior as
+ * required.
+ */
+#define DARWIN_API_VERSION 20170407lu
+
+#define DARWIN_API_AVAILABLE_20170407 \
+ API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+
+#endif // __DARWIN_API_H
if (!__os_log_default) return false;
char *composed = _os_log_pack_send_and_compose(pack, __os_log_default,
- OS_LOG_TYPE_FAULT, NULL, 0);
+ OS_LOG_TYPE_ERROR, NULL, 0);
abort_with_payload(OS_REASON_LIBSYSTEM, OS_REASON_LIBSYSTEM_CODE_FAULT, pack, pack_size, composed, 0);
}
#include <_simple.h>
#include <errno.h>
#include <os/base_private.h>
+#include <stdint.h>
#if __GNUC__
#define os_constant(x) __builtin_constant_p((x))
extern void
_os_crash_fmt(os_log_pack_t, size_t);
+/*!
+ * @function os_assert_sprintf
+ * A routine to assert the result of a call to snprintf(3) or vsnprintf(3).
+ *
+ * @param ret
+ * The return value from {v}snprintf(3).
+ *
+ * @param buff_size
+ * The size of the buffer given to {v}snprintf(3).
+ *
+ * @discussion
+ * If ret is less than zero or greater than size, the routine will abort the
+ * caller with a message indicating the nature of the failure in the Application
+ * Specific Information section of the resulting crash log.
+ *
+ * This routine is useful for printing paths that are expected to succeed with a
+ * statically-sized buffer.
+ */
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_ALWAYS_INLINE
+static inline void
+os_assert_sprintf(int ret, size_t buff_size)
+{
+ union {
+ size_t size;
+ int ret;
+ } myret = {
+ .ret = ret,
+ };
+
+ if (ret < 0) {
+ os_crash("error printing buffer: %s", strerror(errno));
+ }
+
+ if (myret.size > buff_size) {
+ os_crash("buffer too small: needed = %d, actual = %lu",
+ ret, buff_size);
+ }
+}
+
+/*!
+ * @function os_assert_malloc
+ * A routine to assert the result of allocations which may fail.
+ *
+ * @param desc
+ * A string describing the object whose allocation was attempted.
+ *
+ * @param p
+ * The result of a call to malloc(3), calloc(3), et al.
+ *
+ * @param alloc_size
+ * The size of the attempted allocation.
+ *
+ * @discussion
+ * If {@link p} is NULL, the routine will abort the caller with a message
+ * indicating the nature of the failure in the Application Specific Information
+ * section of the resulting crash log.
+ */
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_ALWAYS_INLINE
+static inline void
+os_assert_malloc(const char *desc, const void *const p, size_t alloc_size)
+{
+ if (!p) {
+ os_crash("allocation failed: obj = %s, size = %lu, error = %s",
+ desc, alloc_size, strerror(errno));
+ }
+}
+
+/*!
+ * @function os_assert_mach
+ * A routine to assert the result of a Mach kernel routine.
+ *
+ * @param op
+ * A human-readable description of the operation.
+ *
+ * @param kr
+ * The return code.
+ *
+ * @discsussion
+ * If {@link kr} is non-zero, this routine will abort the caller with a message
+ * indicating the nature of the failure in the Application Specific Information
+ * section of the resulting crash log.
+ */
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT OS_NONNULL1
+void
+os_assert_mach(const char *op, kern_return_t kr);
+
+/*!
+ * @function os_assert_mach_port_status
+ * A routine to assert the status of a Mach port.
+ *
+ * @param desc
+ * A human-readable description of the port's purpose.
+ *
+ * @param p
+ * The port.
+ *
+ * @param expected
+ * A pointer to a mach_port_status_t describing the expected attributes of the
+ * port. If no particular value is expected for a given field in the structure,
+ * a sentinel value may be provided for each expected field to indicate that its
+ * check should be elided. The sentival values are:
+ *
+ * mps_pset => UINT32_MAX
+ * mps_seqno => UINT32_MAX
+ * mps_mscount => UINT32_MAX
+ * mps_qlimit => UINT32_MAX
+ * mps_msgcount => UINT32_MAX
+ * mps_sorights => UINT32_MAX
+ * mps_srights => INT32_MAX
+ * mps_pdrequest => INT32_MAX
+ * mps_nsrequest => INT32_MAX
+ * mps_flags => 0
+ *
+ * @discussion
+ * If there are any mismatches in the expected and actual status of the port,
+ * the implementation will abort the caller. If status cannot be obtained for
+ * the given port, the implementation will abort the caller.
+ */
+API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))
+OS_EXPORT
+void
+os_assert_mach_port_status(const char *desc, mach_port_t p,
+ mach_port_status_t *expected);
+
#else // OS_CRASH_ENABLE_EXPERIMENTAL_LIBTRACE
#define os_crash(msg) __os_crash_simple(msg)
#include "tre-last-matched.h"
#include "xmalloc.h"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+
/*
The bit_ffs() macro in bitstring.h is flawed. Replace it with a working one.
*/
}
#endif /* !__LIBC__ */
-
+#pragma clang diagnostic push
/* EOF */
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)findfp.c 8.2 (Berkeley) 1/4/94";
#endif /* LIBC_SCCS and not lint */
}
#endif
}
+#pragma clang diagnostic pop
argument). Buffers opened in text-mode make sure that writes are terminated with
a NULL byte, if the last write hasn't filled up the whole buffer. Buffers
opened in binary-mode never append a NULL byte.
+.Pp
+Input and output against the opened stream will be fully buffered, unless
+it refers to an interactive terminal device, or a different kind of buffering
+is specified in the environment.
+See
+.Xr setvbuf 3
+for additional details.
.Sh RETURN VALUES
Upon successful completion
.Fn fopen ,
/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* 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.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. 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.
*
static char sccsid[] = "@(#)makebuf.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/stdio/makebuf.c,v 1.6 2007/01/09 00:28:07 imp Exp $");
+__FBSDID("$FreeBSD$");
#include "namespace.h"
#include <sys/types.h>
#include "libc_private.h"
#include "local.h"
+#include <xlocale/_stdio.h>
+#include <xlocale/_stdlib.h>
+#include <os/once_private.h>
#ifdef FEATURE_SMALL_STDIOBUF
# define MAXBUFSIZE (1 << 12)
#endif
#define TTYBUFSIZE 4096
+#define MAXEVPSIZE 16
+
+static char __fallback_evp[MAXEVPSIZE];
+static char __stdout_evp[MAXEVPSIZE];
+
+static void
+__loadevp(const char* key, char destination[MAXEVPSIZE])
+{
+ char* evp = getenv(key);
+ if (evp != NULL) {
+ strlcpy(destination, evp, MAXEVPSIZE);
+ } else {
+ destination[0] = '\0';
+ }
+}
+
+static void
+__evpinit(void* __unused unused)
+{
+ __loadevp("STDBUF", __fallback_evp);
+ __loadevp("STDBUF1", __stdout_evp);
+}
+
+static char*
+__getevp(int fd)
+{
+ static os_once_t predicate;
+ os_once(&predicate, NULL, __evpinit);
+
+ if (fd == STDOUT_FILENO && __stdout_evp[0] != '\0') {
+ return __stdout_evp;
+ } else if (__fallback_evp[0] != '\0') {
+ return __fallback_evp;
+ } else {
+ return NULL;
+ }
+
+}
+
+/*
+ * Internal routine to determine environment override buffering for a file.
+ *
+ * Sections of the below taken from NetBSD's version of this file under the same license.
+ */
+static int
+__senvbuf(FILE *fp, size_t *bufsize, int *couldbetty)
+{
+ char* evp;
+ char* end;
+ int flags;
+ long size;
+
+ flags = 0; // Default to fully buffered
+
+ if ((evp = __getevp(fp->_file)) == NULL) {
+ return flags;
+ }
+
+ // Look at the first character only to determine buffering mode
+ switch (*evp) {
+ case 'u':
+ case 'U':
+ flags |= __SNBF;
+ break;
+ case 'l':
+ case 'L':
+ flags |= __SLBF;
+ break;
+ case 'f':
+ case 'F':
+ // Default flags is fully buffered
+ break;
+ default:
+ // Unexpected buffering mode, use default fully buffered
+ return flags;
+ }
+ // User specified envrionment defaults have higher priority than tty defaults
+ *couldbetty = 0;
+
+ // Advance the envrionment variable pointer, so we can attempt to parse the number
+ evp++;
+ if (!isdigit(*evp)) {
+ return flags; // No number found, this protects us from negative size values
+ }
+
+ size = strtol_l(evp, &end, 10, NULL); // No locale
+ if (*end != '\0') {
+ return flags;
+ }
+
+ if (size <= 0) {
+ return __SNBF; // Override with unbuffered if the buffer size is 0
+ }
+
+ // We had a non zero buffer, cap it and return the flags;
+ *bufsize = size > MAXBUFSIZE ? MAXBUFSIZE : size;
+ return flags;
+}
/*
* Allocate a file buffer, or switch to unbuffered I/O.
* optimisation) right after the _fstat() that finds the buffer size.
*/
void
-__smakebuf(fp)
- FILE *fp;
+__smakebuf(FILE *fp)
{
void *p;
int flags;
return;
}
flags = __swhatbuf(fp, &size, &couldbetty);
+ if (fp->_file >= 0) {
+ flags |= __senvbuf(fp, &size, &couldbetty);
+
+ if (flags & __SNBF) {
+ fp->_flags |= __SNBF;
+ fp->_bf._base = fp->_p = fp->_nbuf;
+ fp->_bf._size = 1;
+ return;
+ }
+ }
+
if (couldbetty && isatty(fp->_file)) {
flags |= __SLBF;
/* st_blksize for ttys is 128K, so make it more reasonable */
* Internal routine to determine `proper' buffering for a file.
*/
int
-__swhatbuf(fp, bufsize, couldbetty)
- FILE *fp;
- size_t *bufsize;
- int *couldbetty;
+__swhatbuf(FILE *fp, size_t *bufsize, int *couldbetty)
{
struct stat st;
#include <assert.h>
#include <errno.h>
#include <limits.h>
+#include <os/overflow.h>
#ifdef DEBUG
#include <stdint.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/param.h>
#include <wchar.h>
/* XXX: There is no FPOS_MAX. This assumes fpos_t is an off_t. */
else
newsize = newoff;
if (newsize > ms->len) {
+ /*
+ * Grow by 1.5x (15 / 10).
+ */
+ ssize_t growsize;
+ bool ovf = os_mul_overflow(ms->len, 15, &growsize);
+ if (ovf) {
+ growsize = SSIZE_MAX - 1;
+ } else {
+ growsize /= 10;
+ }
+ newsize = MAX(growsize, newsize);
+
buf = realloc(*ms->bufp, newsize + 1);
if (buf != NULL) {
#ifdef DEBUG
static void
memstream_update(struct memstream *ms)
{
-
assert(ms->len >= 0 && ms->offset >= 0);
*ms->sizep = ms->len < ms->offset ? ms->len : ms->offset;
}
or input is read from any stream attached to a terminal device
(typically
.Dv stdin ) .
+.Pp
+The default buffer settings can be overwritten for stdout
+.Dv ( STDBUF1 )
+or for all descriptors
+.Dv ( STDBUF ) .
+The environment variable value is a letter followed by an optional numeric
+value indicating the size of the buffer.
+Valid sizes range from 0B to 64KB.
+Valid letters are:
+.Bl -tag -width X -indent
+.It Dv Li U
+Unbuffered.
+.It Dv Li L
+Line-buffered.
+.It Dv Li F
+Fully-buffered.
+.El
+.Pp
The function
.Xr fflush 3
may be used to force the block out early.
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wint-conversion"
+
#define OS_CRASH_ENABLE_EXPERIMENTAL_LIBTRACE 1
#if defined(LIBC_SCCS) && !defined(lint)
return (ret < 0 || ret >= INT_MAX) ? -1 : (int)ret;
/* NOTREACHED */
}
-
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)vfscanf.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
return (commit - b);
}
#endif
+#pragma clang diagnostic push
#include "xprintf_domain.h"
#include "xprintf_private.h"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpointer-bool-conversion"
+
void
free_printf_comp(printf_comp_t pc)
{
}
return pc;
}
+#pragma clang diagnostic pop
+
#include "xprintf_domain.h"
#include "xprintf_private.h"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpointer-bool-conversion"
+
/* These are flag characters and can never be used as conversion specifiers */
static const char _printf_tbl_flags[] = "#$'*+,-.0123456789:;L_hjlqtvz";
}
return (0);
}
+#pragma clang diagnostic pop
+
#include <local.h>
#include <xprintf_private.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpointer-bool-conversion"
+
int
asxprintf_exec(char ** __restrict ret,
printf_comp_t __restrict pc, ...)
return __xvprintf(pc, NULL, stdout, NULL, NULL, ap);
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)abort.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
CRSetCrashLogMessage(fmt); /* the format string is better than nothing */
abort();
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-function-declaration"
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+#pragma clang diagnostic ignored "-Winvalid-pp-token"
+#pragma clang diagnostic ignored "-Wint-conversion"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)atexit.c 8.2 (Berkeley) 7/3/94";
#endif /* LIBC_SCCS and not lint */
_tlv_atexit(f, arg);
}
#endif
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)exit.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
(*__cleanup)();
__exit(status);
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)heapsort.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
free(k);
return (0);
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)heapsort.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
free(k);
return (0);
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)merge.c 8.2 (Berkeley) 2/14/94";
#endif /* LIBC_SCCS and not lint */
swap(u, t);
}
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcomma"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)merge.c 8.2 (Berkeley) 2/14/94";
#endif /* LIBC_SCCS and not lint */
swap(u, t);
}
}
+#pragma clang diagnostic push
*
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/stdlib/strhash.c,v 1.10 2002/03/22 21:53:10 obrien Exp $");
}
return;
}
+#pragma clang diagnostic pop
* SUCH DAMAGE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)system.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
__weak_reference(__system, system);
__weak_reference(__system, _system);
+
+#pragma clang diagnostic pop
#include <stdlib.h>
#include <Block_private.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wimplicit-function-declaration"
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+#pragma clang diagnostic ignored "-Wint-conversion"
+
typedef int cmp_t(const void *, const void *);
void
qsort_b(void *base, size_t nel, size_t width, cmp_t ^cmp_b)
{
- void *cmp_f = ((struct Block_layout *)cmp_b)->invoke;
+ void *cmp_f = ((struct Block_layout *)cmp_b)->invoke;
qsort_r(base, nel, width, cmp_b, (void*)cmp_f);
}
+#pragma clang diagnostic pop
** 1996-06-05 by Arthur David Olson.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+
#include <sys/cdefs.h>
#ifndef lint
#ifndef NOID
return -(double) ((unsigned long) time0 +
(unsigned long) (-(time1 + 1)) + 1);
}
+#pragma clang diagnostic pop
** 1996-06-05 by Arthur David Olson.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+
#include <sys/cdefs.h>
#ifndef lint
#ifndef NOID
typedef struct {
int token;
int is_set;
+ int null_bootstrap;
} notify_tz_t;
#define NOTIFY_TZ_NAME "com.apple.system.timezone"
}
#endif /* NOTIFY_TZ_LOG */
-static notify_tz_t gmt_notify = {-1, 0};
-static notify_tz_t lcl_notify = {-1, 0};
+static notify_tz_t gmt_notify = {-1, 0, 0};
+static notify_tz_t lcl_notify = {-1, 0, 0};
static const char notify_tz_name[] = NOTIFY_TZ_NAME;
#endif /* NOTIFY_TZ */
}
#ifdef NOTIFY_TZ
+static int
+do_null_bootstrap_check(notify_tz_t *p)
+{
+ /*
+ * If we're running in a null bootstrap context (e.g. the bootstrap server),
+ * we will not be able to contact the notify server. In this case we want to
+ * avoid opening /etc/localtime every time the process does a asctime_r(3)
+ * or similar. But we have to do this once to get the right time zone.
+ *
+ * So first time through, we set a bit to indicate that we're in the null
+ * bootstrap context. The second time through, we force the "set" bit in the
+ * notify_tz_t structure to -1 and avoid the path where it can be set to
+ * zero (which would trigger opening and reloading the timezone file).
+ */
+ if (bootstrap_port != MACH_PORT_NULL) {
+ return -1;
+ }
+
+ if (!p->null_bootstrap) {
+ p->null_bootstrap = 1;
+ p->is_set = 0;
+ return -1;
+ }
+
+ p->is_set = -1;
+ return 0;
+}
+
static void
notify_check_tz(notify_tz_t *p)
{
if (p->token < 0)
return;
+ if (do_null_bootstrap_check(p) == 0) {
+ return;
+ }
nstat = notify_check(p->token, &ncheck);
if (nstat || ncheck) {
p->is_set = 0;
unsigned int nstat;
int ncheck;
+ if (do_null_bootstrap_check(p) == 0) {
+ return;
+ }
+
/*----------------------------------------------------------------
* Since we don't record the last time zone filename, just cancel
* (which should remove the file monitor) and setup from scratch
#endif /* defined STD_INSPIRED */
#endif /* !BUILDING_VARIANT */
+#pragma clang diagnostic pop
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+
#if 0
static const char elsieid[] = "@(#)strftime.3 8.3";
/*
return pt;
}
#endif /* !BUILDING_VARIANT */
+#pragma clang diagnostic pop
+++ /dev/null
-/*-
- * Copyright (c) 1990, 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.
- * 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)index.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/string/index.c,v 1.8 2007/01/09 00:28:12 imp Exp $");
-
-#include <stddef.h>
-
-#ifdef STRCHR
-#include <string.h>
-
-char *
-strchr
-#else
-#include <strings.h>
-
-char *
-index
-#endif
-(const char *p, int ch)
-{
- char c;
-
- c = ch;
- for (;; ++p) {
- if (*p == c)
- return ((char *)p);
- if (*p == '\0')
- return (NULL);
- }
- /* NOTREACHED */
-}
+++ /dev/null
-/*-
- * Copyright (c) 2009 Xin LI <delphij@FreeBSD.org>
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/string/strlen.c,v 1.7 2009/01/26 07:31:28 delphij Exp $");
-
-#include <limits.h>
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Portable strlen() for 32-bit and 64-bit systems.
- *
- * Rationale: it is generally much more efficient to do word length
- * operations and avoid branches on modern computer systems, as
- * compared to byte-length operations with a lot of branches.
- *
- * The expression:
- *
- * ((x - 0x01....01) & ~x & 0x80....80)
- *
- * would evaluate to a non-zero value iff any of the bytes in the
- * original word is zero. However, we can further reduce ~1/3 of
- * time if we consider that strlen() usually operate on 7-bit ASCII
- * by employing the following expression, which allows false positive
- * when high bit of 1 and use the tail case to catch these case:
- *
- * ((x - 0x01....01) & 0x80....80)
- *
- * This is more than 5.2 times as fast as the raw implementation on
- * Intel T7300 under long mode for strings longer than word length.
- */
-
-/* Magic numbers for the algorithm */
-#if LONG_BIT == 32
-static const unsigned long mask01 = 0x01010101;
-static const unsigned long mask80 = 0x80808080;
-#elif LONG_BIT == 64
-static const unsigned long mask01 = 0x0101010101010101;
-static const unsigned long mask80 = 0x8080808080808080;
-#else
-#error Unsupported word size
-#endif
-
-#define LONGPTR_MASK (sizeof(long) - 1)
-
-/*
- * Helper macro to return string length if we caught the zero
- * byte.
- */
-#define testbyte(x) \
- do { \
- if (p[x] == '\0') \
- return (p - str + x); \
- } while (0)
-
-size_t
-strlen(const char *str)
-{
- const char *p;
- const unsigned long *lp;
-
- /* Skip the first few bytes until we have an aligned p */
- for (p = str; (uintptr_t)p & LONGPTR_MASK; p++)
- if (*p == '\0')
- return (p - str);
-
- /* Scan the rest of the string using word sized operation */
- for (lp = (const unsigned long *)p; ; lp++)
- if ((*lp - mask01) & mask80) {
- p = (const char *)(lp);
- testbyte(0);
- testbyte(1);
- testbyte(2);
- testbyte(3);
-#if (LONG_BIT >= 64)
- testbyte(4);
- testbyte(5);
- testbyte(6);
- testbyte(7);
-#endif
- }
-
- /* NOTREACHED */
- return (0);
-}
-
+++ /dev/null
-/*-
- * Copyright (c) 2009 David Schultz <das@FreeBSD.org>
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/string/strnlen.c,v 1.1 2009/02/28 06:00:58 das Exp $");
-
-#include <string.h>
-
-size_t
-strnlen(const char *s, size_t maxlen)
-{
- size_t len;
-
- for (len = 0; len < maxlen; len++, s++) {
- if (!*s)
- break;
- }
- return (len);
-}
+++ /dev/null
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * 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.
- * 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.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)strstr.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/string/strstr.c,v 1.6 2009/02/03 17:58:20 danger Exp $");
-
-#include <string.h>
-
-/*
- * Find the first occurrence of find in s.
- */
-char *
-strstr(const char *s, const char *find)
-{
- char c, sc;
- size_t len;
-
- if ((c = *find++) != '\0') {
- len = strlen(find);
- do {
- do {
- if ((sc = *s++) == '\0')
- return (NULL);
- } while (sc != c);
- } while (strncmp(s, find, len) != 0);
- s--;
- }
- return ((char *)s);
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Apple, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <string.h>
-
-char *
-strcpy(char * restrict dst, const char * restrict src) {
- const size_t length = strlen(src);
- // The stpcpy() and strcpy() functions copy the string src to dst
- // (including the terminating '\0' character).
- memcpy(dst, src, length+1);
- // The strcpy() and strncpy() functions return dst.
- return dst;
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Apple, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <strings.h>
-
-size_t
-strlcat(char * restrict dst, const char * restrict src, size_t maxlen) {
- const size_t srclen = strlen(src);
- const size_t dstlen = strnlen(dst, maxlen);
- if (dstlen == maxlen) return maxlen+srclen;
- if (srclen < maxlen-dstlen) {
- memcpy(dst+dstlen, src, srclen+1);
- } else {
- memcpy(dst+dstlen, src, maxlen-dstlen-1);
- dst[maxlen-1] = '\0';
- }
- return dstlen + srclen;
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Apple, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <strings.h>
-
-size_t
-strlcpy(char * restrict dst, const char * restrict src, size_t maxlen) {
- const size_t srclen = strlen(src);
- if (srclen < maxlen) {
- memcpy(dst, src, srclen+1);
- } else if (maxlen != 0) {
- memcpy(dst, src, maxlen-1);
- dst[maxlen-1] = '\0';
- }
- return srclen;
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Apple, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <string.h>
-
-char *
-strncpy(char * restrict dst, const char * restrict src, size_t maxlen) {
- const size_t srclen = strnlen(src, maxlen);
- if (srclen < maxlen) {
- // The stpncpy() and strncpy() functions copy at most maxlen
- // characters from src into dst.
- memcpy(dst, src, srclen);
- // If src is less than maxlen characters long, the remainder
- // of dst is filled with '\0' characters.
- memset(dst+srclen, 0, maxlen-srclen);
- } else {
- // Otherwise, dst is not terminated.
- memcpy(dst, src, maxlen);
- }
- // The strcpy() and strncpy() functions return dst.
- return dst;
-}
#include <TargetConditionals.h>
#include <CrashReporterClient.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
extern void _arc4_fork_child();
extern void _init_clock_port(void);
extern void __environ_lock_fork_child();
_init_clock_port();
__environ_lock_fork_child();
}
+#pragma clang diagnostic pop
/*
- * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1999-2017 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
*
* @APPLE_LICENSE_HEADER_END@
*/
-/*
- * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
- *
- * @(#)sigaction.c 1.0
- */
#include <CrashReporterClient.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <errno.h>
-/*
- * Intercept the sigaction syscall and use our signal trampoline
- * as the signal handler instead. The code here is derived
- * from sigvec in sys/kern_sig.c.
- */
-extern int __sigaction (int, struct __sigaction * __restrict, struct sigaction * __restrict);
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
+extern int __platform_sigaction (int sig,
+ const struct sigaction * __restrict nsv,
+ struct sigaction * __restrict osv);
int
-sigaction (int sig, const struct sigaction * __restrict nsv, struct sigaction * __restrict osv)
+sigaction (int sig, const struct sigaction * __restrict nsv,
+ struct sigaction * __restrict osv)
{
- extern void _sigtramp();
- struct __sigaction sa;
- struct __sigaction *sap;
- int ret;
-
- if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
- errno = EINVAL;
- return (-1);
- }
- sap = (struct __sigaction *)0;
- if (nsv) {
- sa.sa_handler = nsv->sa_handler;
- sa.sa_tramp = _sigtramp;
- sa.sa_mask = nsv->sa_mask;
- sa.sa_flags = nsv->sa_flags;
- sap = &sa;
- }
- ret = __sigaction(sig, sap, osv);
+ int ret = __platform_sigaction(sig, nsv, osv);
#ifdef FEATURE_SIGNAL_RESTRICTION
// Note: The "sig != 0" here is to force the compiler to maintain that "sig"
// is live, and in a register, after __sigaction so it is visible in the
}
#endif
+#pragma clang diagnostic pop
}
}
-T_DECL(os_crash_sanity, "sanity check for os_crash")
+T_DECL(os_crash_sanity_legacy, "sanity check for os_crash")
{
expected_message = "My AWESOME assertion message.";
os_crash(expected_message);
--- /dev/null
+#include <darwintest.h>
+#include <dlfcn.h>
+#include <execinfo.h>
+#include <mach-o/dyld_priv.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <uuid/uuid.h>
+
+
+#define MAX_FRAMES 32
+static const int expected_nframes = 20;
+
+static void *observed_bt[MAX_FRAMES] = {};
+static int observed_nframes = 0;
+static unsigned int save_fp_at_nframes = 0;
+static void *save_fp = NULL;
+
+static int __attribute__((noinline,not_tail_called,disable_tail_calls))
+recurse_a(unsigned int frames);
+static int __attribute__((noinline,not_tail_called,disable_tail_calls))
+recurse_b(unsigned int frames);
+
+static int __attribute__((noinline,not_tail_called,disable_tail_calls))
+recurse_a(unsigned int frames)
+{
+ if (frames == 1) {
+ if (save_fp_at_nframes > 0) {
+ observed_nframes = backtrace_from_fp(save_fp, observed_bt,
+ MAX_FRAMES);
+ } else {
+ observed_nframes = backtrace(observed_bt, MAX_FRAMES);
+ }
+ return 0;
+ } else if (frames == save_fp_at_nframes) {
+ save_fp = __builtin_frame_address(0);
+ }
+
+ return recurse_b(frames - 1);
+}
+
+static int __attribute__((noinline,not_tail_called,disable_tail_calls))
+recurse_b(unsigned int frames)
+{
+ if (frames == 1) {
+ if (save_fp_at_nframes > 0) {
+ observed_nframes = backtrace_from_fp(save_fp, observed_bt,
+ MAX_FRAMES);
+ } else {
+ observed_nframes = backtrace(observed_bt, MAX_FRAMES);
+ }
+ return 0;
+ } else if (frames == save_fp_at_nframes) {
+ save_fp = __builtin_frame_address(0);
+ }
+
+ return recurse_a(frames - 1);
+}
+
+static void __attribute__((noinline,not_tail_called,disable_tail_calls))
+setup_and_backtrace(unsigned int nframes, unsigned int skip_nframes)
+{
+ save_fp_at_nframes = skip_nframes ? skip_nframes - 1 : 0;
+ recurse_a(nframes - 1);
+}
+
+static bool
+check_for_setup(int i, struct dl_info *info)
+{
+ int ret = dladdr(observed_bt[i], info);
+ T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "dladdr(%p)", observed_bt[i]);
+ void *setup_fp = (void *)&setup_and_backtrace;
+ return info->dli_saddr == setup_fp;
+}
+
+static void __attribute__((noinline))
+expect_backtrace(void)
+{
+ void *recurse_a_fp = (void *)&recurse_a;
+ void *recurse_b_fp = (void *)&recurse_b;
+
+ void *tmp_backtrace[MAX_FRAMES];
+ const int observed_existing_nframes = backtrace(tmp_backtrace, MAX_FRAMES);
+
+ T_EXPECT_EQ(expected_nframes,
+ observed_nframes - observed_existing_nframes,
+ "number of frames traced matches");
+ bool expect_a = true;
+ bool found_setup = false;
+
+ for (int i = 0; i < observed_nframes; i++) {
+ struct dl_info info;
+ if (check_for_setup(i, &info)) {
+ found_setup = true;
+ break;
+ }
+
+ void *expected_saddr = expect_a ? recurse_a_fp : recurse_b_fp;
+ void *observed_saddr = info.dli_saddr;
+ T_EXPECT_GE(observed_saddr, expected_saddr,
+ "frame %d (%p) matches", i, observed_bt[i]);
+ expect_a = !expect_a;
+ }
+
+ T_EXPECT_TRUE(found_setup, "should have found the setup frame");
+}
+
+T_DECL(backtrace, "ensure backtrace(3) gives the correct backtrace")
+{
+ setup_and_backtrace(expected_nframes, 0);
+ expect_backtrace();
+}
+
+T_DECL(backtrace_from_fp,
+ "ensure backtrace_from_fp(3) starts from the correct frame")
+{
+ const int skip_nframes = 5;
+ setup_and_backtrace(expected_nframes + skip_nframes, skip_nframes);
+ expect_backtrace();
+}
+
+T_DECL(backtrace_image_offsets,
+ "ensure backtrace_image_offsets(3) provides valid UUIDs and offsets")
+{
+ setup_and_backtrace(expected_nframes, 0);
+ struct image_offset imgoffs[observed_nframes];
+ backtrace_image_offsets(observed_bt, imgoffs, observed_nframes);
+
+ bool found_setup = false;
+
+ for (int i = 0; i < observed_nframes; i++) {
+ struct dl_info info;
+ if (check_for_setup(i, &info)) {
+ found_setup = true;
+ break;
+ }
+
+ const struct mach_header *mh =
+ dyld_image_header_containing_address(observed_bt[i]);
+
+ uuid_t expected_uuid;
+ bool got_uuid = _dyld_get_image_uuid(mh, expected_uuid);
+ T_QUIET; T_ASSERT_TRUE(got_uuid, "got UUID for Mach-O header");
+
+ T_EXPECT_EQ(uuid_compare(expected_uuid, imgoffs[i].uuid), 0,
+ "frame %d's UUID matches", i);
+ T_EXPECT_EQ((uintptr_t)observed_bt[i] - (uintptr_t)info.dli_fbase,
+ (uintptr_t)imgoffs[i].offset, "frame %d's offset matches", i);
+ }
+
+ T_EXPECT_TRUE(found_setup, "should have found the setup frame");
+}
--- /dev/null
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <darwintest.h>
+#include "darwintest_utils.h"
+
+#define IS_FLAG_SET(fp, flag) ((fp)->_flags & (flag))
+#define BUFFER_SIZE(fp) ((fp)->_bf._size)
+
+static FILE* test_setup(void)
+{
+ char* temp_dir;
+ temp_dir = dt_tmpdir();
+ T_LOG("Temp Dir: %s\n", temp_dir);
+
+ char temp_path[128];
+ snprintf(temp_path, sizeof(temp_path), "%s/%s", temp_dir, "test_file");
+ T_LOG("Using Temporary File: %s\n", temp_path);
+ FILE* fp = fopen(temp_path, "w");
+ T_LOG("File opened: %d\n", fileno(fp));
+ T_ASSERT_EQ(fileno(fp), 3, "file descriptor matches");
+ // Need to prime the buffer
+ fprintf(fp, "Test\n");
+
+ return fp;
+}
+
+T_DECL(envbuf_PR_38637477_unbuf_all, "Forcing unbuffered through environment variable", T_META_ENVVAR("STDBUF=U"))
+{
+ FILE* fp = test_setup();
+
+ T_EXPECT_TRUE(IS_FLAG_SET(fp, __SNBF), "unbuffered");
+ T_EXPECT_FALSE(IS_FLAG_SET(fp, __SLBF), "not line buffered");
+ T_EXPECT_EQ(BUFFER_SIZE(fp), 1, "buffer size 1");
+}
+
+
+T_DECL(envbuf_PR_38637477_line_all, "Forcing line buffering through environment variable", T_META_ENVVAR("STDBUF=L16"))
+{
+ FILE* fp = test_setup();
+
+ T_EXPECT_FALSE(IS_FLAG_SET(fp, __SNBF), "not unbuffered");
+ T_EXPECT_TRUE(IS_FLAG_SET(fp, __SLBF), "line buffered");
+ T_EXPECT_EQ(BUFFER_SIZE(fp), 16, "buffer size 16");
+}
+
+T_DECL(envbuf_PR_38637477_full_all, "Forcing full buffering through environment variable", T_META_ENVVAR("STDBUF=F16"))
+{
+ FILE* fp = test_setup();
+
+ T_EXPECT_FALSE(IS_FLAG_SET(fp, __SNBF), "not unbuffered");
+ T_EXPECT_FALSE(IS_FLAG_SET(fp, __SLBF), "not line buffered");
+ T_EXPECT_EQ(BUFFER_SIZE(fp), 16, "buffer size 16");
+}
+
+T_DECL(envbuf_PR_38637477_unbuf_stdout, "Forcing unbuffered through environment variable for stdout", T_META_ENVVAR("STDBUF1=U"))
+{
+
+ fprintf(stdout, "Test\n");
+
+ T_EXPECT_TRUE(IS_FLAG_SET(stdout, __SNBF), "unbuffered");
+ T_EXPECT_FALSE(IS_FLAG_SET(stdout, __SLBF), "not linebuffered");
+ T_EXPECT_EQ(BUFFER_SIZE(stdout), 1, "buffer size 1");
+}
+
+T_DECL(envbuf_PR_38637477_line_stdout, "Forcing line buffering through environment variable for stdout", T_META_ENVVAR("STDBUF1=L32"))
+{
+
+ fprintf(stdout, "Test\n");
+
+ T_EXPECT_FALSE(IS_FLAG_SET(stdout, __SNBF), "not unbuffered");
+ T_EXPECT_TRUE(IS_FLAG_SET(stdout, __SLBF), "line buffered");
+ T_EXPECT_EQ(BUFFER_SIZE(stdout), 32, "buffer size 32");
+}
+
+T_DECL(envbuf_PR_38637477_full_stdout, "Forcing full buffering through environment variable for stdout", T_META_ENVVAR("STDBUF1=F16"))
+{
+
+ fprintf(stdout, "Test\n");
+
+ T_EXPECT_FALSE(IS_FLAG_SET(stdout, __SNBF), "not unbuffered");
+ T_EXPECT_FALSE(IS_FLAG_SET(stdout, __SLBF), "not line buffered");
+ T_EXPECT_EQ(BUFFER_SIZE(stdout), 16, "buffer size 16");
+}
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
+#if __has_feature(ptrauth_calls) && !defined(__OPEN_SOURCE)
+#include <ptrauth.h>
+#endif
#include <darwintest.h>
T_QUIET; T_ASSERT_NOTNULL((heap = malloc(1)), NULL);
*heap = (char)0xc3; // retq
+#if __has_feature(ptrauth_calls) && !defined(__OPEN_SOURCE)
+ heap = ptrauth_sign_unauthenticated(heap, ptrauth_key_function_pointer, 0);
+#endif
((void (*)(void))heap)(); // call *%eax
T_FAIL("SIGBUS");
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <darwintest.h>
+#include <darwintest_perf.h>
+
+static void
+perf_fixed_size(size_t size_per_write)
+{
+ dt_stat_time_t latency = dt_stat_time_create("write_latency",
+ "adding %zu bytes to a memstream", size_per_write);
+ dt_stat_set_variable_d(latency, "bytes", (double)size_per_write);
+ char *src = calloc(1, size_per_write);
+ T_QUIET; T_ASSERT_NOTNULL(src, "allocated source buffer");
+
+ while (!dt_stat_stable(latency)) {
+ char *buf = NULL;
+ size_t size = 0;
+
+ FILE *victim = open_memstream(&buf, &size);
+ T_QUIET; T_WITH_ERRNO; T_ASSERT_NOTNULL(victim, "opened memstream");
+
+ T_STAT_MEASURE_BATCH(latency) {
+ (void)fwrite(src, size_per_write, 1, victim);
+ }
+
+ fclose(victim);
+ T_QUIET; T_ASSERT_NOTNULL(buf, "buffer was set by open_memstream");
+ T_QUIET; T_ASSERT_GE(size, size_per_write,
+ "memstream added non-zero bytes");
+
+ free(buf);
+ }
+
+ free(src);
+ dt_stat_finalize(latency);
+}
+
+T_DECL(perf_open_memstream, "measure the performance of open_memstream")
+{
+ size_t sizes[] = { 1, 8, 16, 64, 1024, 2048, 4096, 16 * 1024 };
+ for (size_t i = 0; i < sizeof(sizes) / sizeof(sizes[0]); i++) {
+ perf_fixed_size(sizes[i]);
+ }
+}
--- /dev/null
+#include <darwintest.h>
+#include <stdlib.h>
+#include <os/stdlib.h>
+
+T_DECL(os_simple_hash, "sanity check of os_simple_hash",
+ T_META_ALL_VALID_ARCHS(true))
+{
+ const char * string =
+ "We made the buttons on the screen look so good you'll want to lick them.";
+ uint64_t hashval = os_simple_hash_string(string);
+ T_EXPECT_NE(hashval, 0ULL, "usually should get a non-0 hash value");
+
+ char buf[1024];
+ arc4random_buf(buf, sizeof(buf));
+ hashval = os_simple_hash(buf, sizeof(buf));
+ T_EXPECT_NE(hashval, 0ULL, "usually should get a non-0 hash value");
+}
#include <sys/param.h>
#include <sys/ioctl.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wstrict-prototypes"
+
int login_tty(fd)
int fd;
{
(void) close(fd);
return (0);
}
+#pragma clang diagnostic pop
#include <unistd.h>
#include <string.h>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconstant-conversion"
+
int
logout(char *line)
{
UTMPX_UNLOCK(def_utx);
return 1;
}
+#pragma clang diagnostic pop
+++ /dev/null
-/*
- * Copyright (c) 2012 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@
- *
- * This file implements strcpy( ) for the x86_64 architecture.
- */
-
-.globl _strcpy
-
-/*****************************************************************************
- * Macros *
- *****************************************************************************/
-
-.macro EstablishFrame
- push %rbp
- mov %rsp, %rbp
-.endm
-
-.macro ClearFrameAndReturn
- pop %rbp
- ret
-.endm
-
-/*****************************************************************************
- * Entrypoint *
- *****************************************************************************/
-
-.text
-.align 5
-_strcpy:
-// char *strcpy(char * restrict d, const char * restrict s);
-//
-// copies the string s to d, and returns d. We look for NUL bytes using
-// pcmpeqb on 16-byte aligned blocks. Although this may read past the
-// end of the string, because all access is aligned, it will never
-// read past the end of the string across a page boundary, or even
-// accross a cacheline.
- EstablishFrame
- mov %rsi, %rcx
-
-// Load the 16-byte block containing the first byte of the string, and
-// compare each byte to zero. If any NUL bytes are present in this
-// block, the corresponding *bit* in esi will be set to 1.
- and $-16, %rsi
- pxor %xmm0, %xmm0
- pcmpeqb (%rsi), %xmm0
- pmovmskb %xmm0, %eax
-
-// The 16 bytes that we checked for NUL included some bytes preceeding
-// the start of the string, if s is not 16-byte aligned. We create a
-// mask based on the alignment of s which covers only those bits
-// corresponding to bytes that do not preceed s, and check for NULs
-// only in those bits. If we find one, the string is too small to use
-// a vector copy, so jump to dedicated small-buffer implementation.
- and $0xf, %rcx
- or $-1, %rdx
- shl %cl, %rdx
- and %edx, %eax
- jnz L_strcpyGPR
-
-// Check the next 16-byte block for NUL. If none are found, that guarantees
-// that the string is at least 16 bytes long, which means that we can use a
-// single unaligned vector copy to handle any edging at the start of the
-// string. If instead a NUL is found, fall into the byte-by-byte copy loop.
- movdqa 16(%rsi), %xmm1
- pxor %xmm0, %xmm0
- pcmpeqb %xmm1, %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jz L_strcpySSE
-
-/*****************************************************************************
- * GPR copy implementation *
- *****************************************************************************/
-
-// There is at least one NUL in the 32 aligned bytes containing the start
-// of the string being copied. We assemble a bitmap for those 32 bytes from
-// eax and edx, then shift it right by cl to throw out any bits preceeding
-// the start of the string. We can then identify the position of the
-// first NUL byte using BSF.
- shl $16, %edx
- or %edx, %eax
-L_strcpyGPR:
- shr %cl, %eax
- bsf %eax, %edx
-// Restore the original source pointer, and copy the destination pointer
-// to rax so that it is returned on exit.
- add %rcx, %rsi
- mov %rdi, %rax
- add $1, %rdx
- call _memcpy
- ClearFrameAndReturn
-/*
-// At this point we simply need to copy rdx + 1 bytes from rsi to rdi. If
-// the length is >= 8, start by doing a word-by-word copy; otherwise, use
-// a byte-by-byte copy loop.
- sub $7, %rdx // 7 instead of 8 to account for NUL
- jb 1f
-0: mov (%rsi,%rdx),%rcx
- mov %rcx, (%rdi,%rdx)
- sub $8, %rdx
- jae 0b
-1: add $8, %rdx
- jz 3f
-2: movzb -1(%rsi,%rdx),%rcx
- movb %cl, -1(%rdi,%rdx)
- sub $1, %rdx
- jnz 2b
-3: ClearFrameAndReturn
- */
-
-/*****************************************************************************
- * SSE copy implementation *
- *****************************************************************************/
-
-L_strcpySSE:
-// Begin by doing a single unaligned vector copy for edging. We no longer
-// have the original source pointer, but we can reconstruct it as rsi + rcx.
- movdqu (%rsi,%rcx),%xmm0
- movdqu %xmm0, (%rdi)
-// Next copy the original destination pointer to rax so that it is returned
-// on exit, and adjust the destination pointer to correspond to rsi.
- mov %rdi, %rax
- sub %rcx, %rdi
- xor %rcx, %rcx
-// Main copy loop: store the 16 bytes loaded in the previous iteration of the
-// loop, as they are already known to not contain a NUL. The load the next
-// 16 bytes and check for NUL.
-0: movdqu %xmm1, 16(%rdi,%rcx)
- add $16, %rcx
- movdqa 16(%rsi,%rcx),%xmm1
- pxor %xmm0, %xmm0
- pcmpeqb %xmm1, %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jz 0b
-
-// Cleanup: at least one of the bytes in the last 16 that were loaded was
-// NUL. The corresponding bits of dx are set, and all other bits are zero.
-// Thus, we can use BSF to find the position of the first NUL. Once we have
-// this information, we use an unaligned copy that runs precisely up to this
-// position to handle edging.
- bsf %edx, %edx
- add %rdx, %rcx
- movdqu 1(%rsi,%rcx),%xmm0 // offset is 1 so that we copy the trailing
- movdqu %xmm0, 1(%rdi,%rcx) // NUL byte as well.
- ClearFrameAndReturn
-
+++ /dev/null
-/*
- * Copyright (c) 2005-2012 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@
- *
- * This file implements strlen( ) for the x86_64 architecture.
- */
-
-.globl _strlen
-
-/*****************************************************************************
- * Macros *
- *****************************************************************************/
-
-.macro EstablishFrame
- push %rbp
- mov %rsp, %rbp
-.endm
-
-.macro ClearFrameAndReturn
- pop %rbp
- ret
-.endm
-
-/*****************************************************************************
- * Entrypoint *
- *****************************************************************************/
-
-.text
-.align 5
-_strlen:
-// size_t strlen(const char *s);
-//
-// returns the length of the string s (i.e. the distance in bytes from
-// s to the first NUL byte following s). We look for NUL bytes using
-// pcmpeqb on 16-byte aligned blocks. Although this may read past the
-// end of the string, because all access is aligned, it will never
-// read past the end of the string across a page boundary, or even
-// accross a cacheline.
- EstablishFrame
- mov %rdi, %rcx
- mov %rdi, %rdx
-
-// Load the 16-byte block containing the first byte of the string, and
-// compare each byte to zero. If any NUL bytes are present in this
-// block, the corresponding *bit* in esi will be set to 1.
- and $-16, %rdi
- pxor %xmm0, %xmm0
- pcmpeqb (%rdi), %xmm0
- pmovmskb %xmm0, %esi
-
-// The 16 bytes that we checked for NUL included some bytes preceeding
-// the start of the string, if s is not 16-byte aligned. We create a
-// mask based on the alignment of s which covers only those bits
-// corresponding to bytes that do not preceed s, and check for NULs
-// only in those bits. If we do not find one, we jump to our main
-// search loop.
- and $0xf, %rcx
- or $-1, %rax
- shl %cl, %rax
- and %eax, %esi
- jz L_loop
-
-L_foundNUL:
-// The last 16-byte block that we searched contained at least one NUL.
-// We use bsf to identify the first NUL, and compute the distance from
-// that byte to the start of the string.
- bsf %esi, %eax
- sub %rdx, %rdi
- add %rdi, %rax
- ClearFrameAndReturn
-
-.align 4
-L_loop:
-// Main search loop: check for NUL in a 16-byte block, continuing
-// loop until one is found.
- add $16, %rdi
- pxor %xmm0, %xmm0
- pcmpeqb (%rdi), %xmm0
- pmovmskb %xmm0, %esi
- test %esi, %esi
- jz L_loop
- jmp L_foundNUL
+++ /dev/null
-/*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_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. 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_LICENSE_HEADER_END@
- */
-
-#include <machine/cpu_capabilities.h>
-
-
-// *****************
-// * S T R N C P Y *
-// *****************
-//
-// char *strncpy(const char *dst, const char *src, size_t n);
-//
-// We optimize the move by doing it vector parallel. This introduces
-// a complication: if we blindly did vector load/stores until finding
-// a 0, we might get a spurious page fault by touching bytes past it.
-// To avoid this, we never do a load that crosses a page boundary,
-// and never store a byte we don't have to.
-//
-// We align the destination, because unaligned vector stores are slow.
-//
-// Recall that strncpy() zero fills the remainder of the dest buffer,
-// and does not terminate the string if its length is greater than or
-// equal to n.
-
-#define kShort 31 // too short to bother with vector loop
-
- .text
- .globl _strncpy
-
- .align 4
-_strncpy: // char *strncpy(const char *dst, const char *src, size_t n);
- movq %rdi,%r8 // preserve destination pointer so we can return it
- movl %edi,%ecx // copy low 4 bytes of dest ptr
- negl %ecx
- andl $15,%ecx // how many bytes to align dest ptr?
- jnz LCheckShortCopy // align destination first
-
-
-// In order to avoid spurious page faults, we loop until nearing the source page
-// end. Then we revert to a byte-by-byte loop for 16 bytes until the page is crossed,
-// then resume the vector loop.
-// %rsi = source ptr (unaligned)
-// %rdi = dest ptr (aligned)
-// %rdx = buffer length remaining
-
-LNextChunk: // NB: can drop down to here
- movl %esi,%eax // copy the low 4 bytes of the source ptr
- movl $4096,%ecx
- andl $4095,%eax // get offset into source page
- subl %eax,%ecx // get #bytes remaining in source page
- cmpq %rdx,%rcx // will buffer run out before the page end?
- cmova %rdx,%rcx // get min(length remaining, bytes to page end)
- shrl $4,%ecx // get #chunks till end of page
- jnz LLoopOverChunks // enter vector loop
-
-// We can't use the chunk loop yet. Check for short and empty buffers, then use byte loop.
-
-LCrossPage: // if buffer is large enough, cross source page
- movl $16,%ecx // move 16 bytes to cross page but keep dest aligned
-LCheckShortCopy: // we propose to copy %ecx bytes in byte loop
- cmpq $(kShort),%rdx // much left?
- ja LLoopOverBytes // yes, loop over bytes then more chunks
- movl %edx,%ecx // no, use the byte loop for everything
- testl %edx,%edx // have we filled buffer?
- jnz LLoopOverBytes // no
- jmp LDone
-
-
-// Loop over bytes.
-// %rsi = source ptr
-// %rdi = dest ptr
-// %rdx = buffer length remaining
-// %rcx = count of bytes to loop over (<= buffer length)
-
- .align 4,0x90 // align inner loops to optimize I-fetch
-LLoopOverBytes:
- movzb (%rsi),%eax // get source byte
- addq $1,%rsi
- subq $1,%rdx // decrement length
- movb %al,(%rdi) // pack into dest
- addq $1,%rdi
- testl %eax,%eax // 0?
- jz LZeroBuffer // yes, we're done copying string
- subq $1,%rcx // more to go?
- jnz LLoopOverBytes
-
- testq %rdx,%rdx // at end of buffer?
- jnz LNextChunk // no, xfer chunks
- jmp LDone // yes
-
-
-// Loop over 16-byte chunks.
-// %rsi = source ptr (unaligned)
-// %rdi = dest ptr (aligned)
-// %rdx = buffer length remaining
-// %ecx = chunk count
-
- .align 4,0x90 // align inner loops to optimize I-fetch
-LLoopOverChunks:
- movdqu (%rsi),%xmm1 // get source
- pxor %xmm0,%xmm0 // get some 0s
- addq $16,%rsi
- pcmpeqb %xmm1,%xmm0 // compare source to 0s
- pmovmskb %xmm0,%eax // get result mask for 0 check
- testl %eax,%eax // any 0s?
- jnz LFound0 // yes, exit loop
- movdqa %xmm1,(%rdi) // no 0s so do aligned store into destination
- addq $16,%rdi
- subq $16,%rdx // decrement length remaining
- subl $1,%ecx // more to go?
- jnz LLoopOverChunks
-
- jmp LCrossPage // cross page but keep dest aligned
-
-
-// Found a zero in the vector. Figure out where it is, and store the bytes
-// up to it. It is possible that we should check to be sure (%rdx >= 16), and
-// just do an aligned store of %xmm1 if so. But if we did, we'd be doing byte
-// stores into the same double quadword in bzero(), which might hit a hazard.
-// Experimentation needed.
-// %rdi = dest ptr (aligned)
-// %eax = result mask
-// %rdx = buffer length remaining
-// %xmm1 = source vector
-
-LFound0:
- bsf %eax,%ecx // find first 0
- subq %rcx,%rdx // decrement remaining buffer length
- test $8,%cl // 8-byte store required?
- jz 4f // no
- movq %xmm1,(%rdi) // pack in 8 low bytes
- psrldq $8,%xmm1 // then shift vector down 8 bytes
- addq $8,%rdi
-4:
- test $4,%cl // 4-byte store required?
- jz 3f // no
- movd %xmm1,(%rdi) // pack in 4 low bytes
- psrldq $4,%xmm1 // then shift vector down 4 bytes
- addq $4,%rdi
-3:
- andl $3,%ecx // more to go?
- jz LZeroBuffer // no
- movd %xmm1,%eax // move remainders out of vector into %eax
-1: // loop on up to three bytes
- movb %al,(%rdi) // pack in next byte
- shrl $8,%eax // shift next byte into position
- addq $1,%rdi
- subl $1,%ecx
- jnz 1b
-
-// We've copied the string. Now zero the rest of the buffer, using commpage bzero().
-// %rdi = dest ptr
-// %rcx = buffer length remaining
-
-LZeroBuffer:
- movq %rdx,%rsi // remaining buffer size (2nd argument)
- pushq %r8 // save r8 and align stack to 16B
- call _bzero
- popq %r8
-
-LDone:
- movq %r8,%rax // original dest ptr is return value
- ret
+++ /dev/null
-/*
- * Copyright (c) 2012 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@
- *
- * This file implements strnlen( ) for the x86_64 architecture.
- */
-
-.globl _strnlen
-
-/*****************************************************************************
- * Macros *
- *****************************************************************************/
-
-.macro EstablishFrame
- push %rbp
- mov %rsp, %rbp
-.endm
-
-.macro ClearFrameAndReturn
- pop %rbp
- ret
-.endm
-
-/*****************************************************************************
- * Entrypoint *
- *****************************************************************************/
-
-.text
-.align 4
-_strnlen:
-// size_t strnlen(char *s, size_t maxlen);
-
-// If maxlen is larger than any object that can be allocated, we know a priori
-// that it does not effect the operation of the function in any way; we can
-// simply call strlen instead, which is more efficient and makes handling the
-// edge cases here much cleaner.
- test %rsi, %rsi
- js _strlen
-
-// The strnlen() function attempts to compute the length of s, but never
-// scans beyond the first maxlen bytes of s.
-//
-// Thus, we need to early-out without doing any reads at all if maxlen == 0.
- EstablishFrame
- mov %rsi, %rax
- jz L_maxlenExhausted
-
-// We are going to check the string in aligned 16-byte blocks. The first such
-// block may contain characters that preceed the start of the string, so we
-// construct a mask based on the string's alignment to use in processing this
-// initial block. We also need to account for these characters in maxlen.
- mov %rdi, %rcx
- and $0xf, %rcx
- or $-1, %rdx
- shl %cl, %rdx // mask
- add %rcx, %rsi // adjust maxlen
-
-// Load the 16-byte block containing the start of the string. If any NUL
-// bytes are present in this block, the corresponding *bit* in ecx will be 1.
-// We check only the bits that are set in the mask, to avoid detecting NULs
-// that preceed the start of the string.
- and $-16, %rdi
- pxor %xmm0, %xmm0
- pcmpeqb (%rdi), %xmm0
- pmovmskb %xmm0, %ecx
- and %rdx, %rcx
- jnz L_foundNUL
-
-// Now subtract 16 from maxlen. If this causes a borrow, then we exhausted
-// maxlen somewhere in this 16-byte block (formally, we have read past maxlen
-// bytes, but that is not a problem; because the accesses are all aligned, we
-// cannot read accross a page--or even cacheline--boundary, so the observable
-// behavior is not different from if we had stopped at maxlen). If the result
-// is exactly zero, we need to stop before reading the *next* 16 bytes.
- sub $16, %rsi
- jbe L_maxlenExhausted
-
-L_loop:
- add $16, %rdi
- pxor %xmm0, %xmm0
- pcmpeqb (%rdi), %xmm0
- pmovmskb %xmm0, %ecx
- test %rcx, %rcx
- jnz L_foundNUL
- sub $16, %rsi
- ja L_loop
-
-L_maxlenExhausted:
-// If we exhaust maxlen bytes without finding a NUL, we return maxlen.
- ClearFrameAndReturn
-
-L_foundNUL:
-// The last 16-byte block that we searched contained at least one NUL.
-// We use bsf to identify the first NUL.
- bsf %rcx, %rdx
-// Handle the case where the NUL that we found is preceeded by the maxlen'th
-// byte of the string, returning maxlen.
- cmp %rdx, %rsi
- jb L_maxlenExhausted
-// Otherwise, return the length of the string.
- sub %rsi, %rax
- add %rdx, %rax
- ClearFrameAndReturn
__platform_memset_pattern4 _memset_pattern4
__platform_memset_pattern8 _memset_pattern8
__platform_strchr _strchr
+__platform_strchr _index
__platform_strcmp _strcmp
+__platform_strcpy _strcpy
+__platform_strlcat _strlcat
+__platform_strlcpy _strlcpy
+__platform_strlen _strlen
__platform_strncmp _strncmp
+__platform_strncpy _strncpy
+__platform_strnlen _strnlen
+__platform_strstr _strstr
# set ENV{"CURRENT_ARCH"} so we can predicate on it
$ENV{"CURRENT_ARCH"} = $arch;
- # BridgeOS shares the same platform name than the watch so
- # we need to fix it and pick the right configuration.
- my $platformName = $ENV{"PLATFORM_NAME"};
- if ($ENV{"RC_BRIDGE"} eq "YES") {
- $platformName = "bridgeos";
- }
-
+ my $platformName = $ENV{"VARIANT_PLATFORM_NAME"};
$platformName =~ s/simulator/os/;
my $platformPath = $ENV{"SRCROOT"} . "/Platforms/" . $platformName . "/Makefile.inc";
$shortarch =~ s/armv\d+[a-z]?/arm/g;
# map all arm64 subtypes to arm64
- $shortarch =~ s/arm64[_a-z0-9]?/arm64/g;
+ $shortarch =~ s/arm64[_a-z0-9]*/arm64/g;
printf HEADER "#if !defined(__".$shortarch."__)\n";
printf HEADER "#error Mismatched libc-features.h architecture\n";
#!/bin/bash
set -x
-# Skip installing headers during Xcode build (buildit uses installhdrs+install)
-if [ "$ACTION" == build ]; then exit 0; fi
-
# Installs Libc header files
MKDIR="mkdir -p"
eval $(${SRCROOT}/xcodescripts/generate_features.pl --bash)
UNIFDEFARGS=$(${SRCROOT}/xcodescripts/generate_features.pl --unifdef)
-INCDIR=${DSTROOT}/${PUBLIC_HEADERS_FOLDER_PATH}
-LOCINCDIR=${DSTROOT}/${PRIVATE_HEADERS_FOLDER_PATH}
-SYSTEMFRAMEWORK=${DSTROOT}/System/Library/Frameworks/System.framework
-KERNELFRAMEWORK=${DSTROOT}/System/Library/Frameworks/Kernel.framework
+if [[ "${DEPLOYMENT_LOCATION}" == "NO" ]] ; then
+ HDRROOT=${BUILT_PRODUCTS_DIR}
+else
+ HDRROOT=${DSTROOT}
+fi
+
+INCDIR=${HDRROOT}/${PUBLIC_HEADERS_FOLDER_PATH}
+LOCINCDIR=${HDRROOT}/${PRIVATE_HEADERS_FOLDER_PATH}
+SYSTEMFRAMEWORK=${HDRROOT}/System/Library/Frameworks/System.framework
+KERNELFRAMEWORK=${HDRROOT}/System/Library/Frameworks/Kernel.framework
PRIVHDRS=${SYSTEMFRAMEWORK}/Versions/B/PrivateHeaders
PRIVKERNELHDRS=${KERNELFRAMEWORK}/Versions/A/PrivateHeaders
${SRCROOT}/darwin/libc_private.h
${SRCROOT}/gen/utmpx_thread.h
${SRCROOT}/nls/FreeBSD/msgcat.h
- ${SRCROOT}/libdarwin/dirstat.h
+ ${SRCROOT}/gen/thread_stack_pcs.h
+ ${SRCROOT}/libdarwin/h/dirstat.h
)
OS_LOCALHDRS=( ${SRCROOT}/os/assumes.h ${SRCROOT}/os/debug_private.h )
${INSTALL} -m ${INSTALLMODE} ${PRIVUUID_INSTHDRS[@]} ${PRIVHDRS}/uuid
${INSTALL} -m ${INSTALLMODE} ${PRIVUUID_INSTHDRS[@]} ${PRIVKERNELHDRS}/uuid
-for i in `${FIND} "${DSTROOT}" -name \*.h -print0 | ${XARGS} -0 ${GREP} -l '^//Begin-Libc'`; do
+for i in `${FIND} "${HDRROOT}" -name \*.h -print0 | ${XARGS} -0 ${GREP} -l '^//Begin-Libc'`; do
${CHMOD} u+w $i &&
${ECHO} ${ED} - $i \< ${SRCROOT}/xcodescripts/strip-header.ed &&
${ED} - $i < ${SRCROOT}/xcodescripts/strip-header.ed &&
${CHMOD} u-w $i || exit 1;
done
-for i in `${FIND} "${DSTROOT}" -name \*.h -print0 | ${XARGS} -0 ${FGREP} -l -e UNIFDEF -e OPEN_SOURCE`; do
+for i in `${FIND} "${HDRROOT}" -name \*.h -print0 | ${XARGS} -0 ${FGREP} -l -e UNIFDEF -e OPEN_SOURCE`; do
${CHMOD} u+w $i &&
${CP} $i $i.orig &&
${ECHO} ${UNIFDEF} ${UNIFDEFARGS} $i.orig \> $i &&
COPY_PHASE_STRIP = NO
SKIP_INSTALL = YES
INSTALLHDRS_SCRIPT_PHASE = YES
+INSTALLHDRS_COPY_PHASE = YES
VERSIONING_SYSTEM =
+VERSION_INFO_PREFIX = __attribute__((visibility("hidden")))
COPY_PHASE_STRIP = NO
STRIP_INSTALLED_PRODUCT = NO
LD_DYLIB_INSTALL_NAME = /usr/lib/system/$(EXECUTABLE_NAME)
+IS_ZIPPERED = YES
BUILD_VARIANTS = normal debug
BUILD_ARCHIVES = Platform Base FreeBSD NetBSD TRE vCancelable vDarwinExtsn vDarwinExtsnCancelable vPre1050 vLegacy vInode32 FortifySource
ARCH_FAMILY_armv7f = arm
ARCH_FAMILY_armv7k = arm
ARCH_FAMILY_arm64 = arm64
-ARCH_FAMILY_arm64_32 = arm64
// Platform target
-Platform_INCLUDED_SOURCE_FILE_NAMES = $(Platform_INCLUDED_SOURCE_FILE_NAMES_gen) $(Platform_INCLUDED_SOURCE_FILE_NAMES_stdlib) $(Platform_INCLUDED_SOURCE_FILE_NAMES_string)
+Platform_INCLUDED_SOURCE_FILE_NAMES = forceLibcToBuild.c $(Platform_INCLUDED_SOURCE_FILE_NAMES_gen)
Platform_INCLUDED_SOURCE_FILE_NAMES_gen = $(ARCH_FAMILY)/gen/*.c $(ARCH_FAMILY)/gen/*.s $(ARCH_FAMILY)/gen/*.S
-Platform_INCLUDED_SOURCE_FILE_NAMES_stdlib = $(ARCH_FAMILY)/stdlib/*.c $(ARCH_FAMILY)/stdlib/*.s $(ARCH_FAMILY)/stdlib/*.S
-Platform_INCLUDED_SOURCE_FILE_NAMES_string = $(ARCH_FAMILY)/string/*.c $(ARCH_FAMILY)/string/*.s $(ARCH_FAMILY)/string/*.S
// FreeBSD target
FreeBSD_CFLAGS = -include $(SRCROOT)/fbsdcompat/_fbsd_compat_.h
FreeBSD_SEARCH_PATHS = $(SRCROOT)/fbsdcompat $(SRCROOT)/gdtoa $(SRCROOT)/gdtoa/FreeBSD
FreeBSD_EXCLUDED_SOURCE_GDTOA = gdtoa/FreeBSD/machdep* gdtoa-strtopx.c
// Include the correct parts of gdtoa per-arch
+FreeBSD_INCLUDED_SOURCE_FILE_NAMES = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_$(ARCH_FAMILY))
FreeBSD_INCLUDED_SOURCE_FILE_NAMES_x86_64 = gdtoa-strtopx.c machdep_ldisx.c
FreeBSD_INCLUDED_SOURCE_FILE_NAMES_i386 = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_x86_64)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7 = machdep_ldisd.c
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7s = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7k = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7f = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv6 = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_arm64 = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_arm64_32 = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
-FreeBSD_INCLUDED_SOURCE_FILE_NAMES_arm64e = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_armv7)
+FreeBSD_INCLUDED_SOURCE_FILE_NAMES_arm = machdep_ldisd.c
+FreeBSD_INCLUDED_SOURCE_FILE_NAMES_arm64 = $(FreeBSD_INCLUDED_SOURCE_FILE_NAMES_arm)
// NetBSD target
NetBSD_CFLAGS = -include $(SRCROOT)/nbsdcompat/_nbsd_compat_.h
TRE_SEARCH_PATHS = $(SRCROOT)/regex/TRE $(SRCROOT)/regex/FreeBSD
// Files per architecture to exclude from the non-platform builds (because optimised versions exist in Platform)
-BASE_EXCLUDED_SOURCE_FILE_NAMES = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH)) $(BASE_EXCLUDED_SOURCE_FILE_NAMES_$(PLATFORM_NAME))
-BASE_EXCLUDED_SOURCE_FILE_NAMES_x86_64 = kvm.c nlist.c strcpy.c strlen.c strncpy.c strnlen.c
-BASE_EXCLUDED_SOURCE_FILE_NAMES_i386 = strcpy.c strlcat.c strlcpy.c strlen.c strncpy.c
-BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7 = strlen.c strnlen.c strstr.c
-BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7s = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7)
-BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7k = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7)
-BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7f = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7)
-BASE_EXCLUDED_SOURCE_FILE_NAMES_armv6 = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_armv7)
-BASE_EXCLUDED_SOURCE_FILE_NAMES_arm64 = strlen.c strnlen.c kvm.c nlist.c
-BASE_EXCLUDED_SOURCE_FILE_NAMES_arm64_32 = strlen.c strnlen.c kvm.c nlist.c
-BASE_EXCLUDED_SOURCE_FILE_NAMES_arm64e = strlen.c strnlen.c kvm.c nlist.c
+BASE_INCLUDED_SOURCE_FILE_NAMES = $(BASE_INCLUDED_SOURCE_FILE_NAMES_$(ARCH_FAMILY))
+BASE_EXCLUDED_SOURCE_FILE_NAMES = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_$(ARCH_FAMILY)) $(BASE_EXCLUDED_SOURCE_FILE_NAMES_$(VARIANT_PLATFORM_NAME))
+BASE_EXCLUDED_SOURCE_FILE_NAMES_x86_64 = kvm.c nlist.c
+BASE_EXCLUDED_SOURCE_FILE_NAMES_arm64 = kvm.c nlist.c
// Rune support isn't included on iOS but there's no better way to exclude their complication
BASE_EXCLUDED_SOURCE_FILE_NAMES_macosx = OSMemoryNotification.c
BASE_EXCLUDED_SOURCE_FILE_NAMES_iphoneosnano = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_watchos)
BASE_EXCLUDED_SOURCE_FILE_NAMES_iphonesimulatornano = $(BASE_EXCLUDED_SOURCE_FILE_NAMES_watchsimulator)
-// <rdar://problem/9513665> - collate.c crashes llvm-gcc on armv6 with -Os + -gdwarf-2
-COLLATE_C_CFLAGS_macosx_armv6 = -O1
-
-// ARMv6 thumb doesn't support all the instructions needed for OSAtomics
-OSATOMIC_C_CFLAGS_macosx_armv6 = -mno-thumb
-OSATOMIC_C_CFLAGS_iphoneos_armv6 = -mno-thumb
-
-// Make sure that OSAtomic isn't build unoptimised, otherwise the inlines
-// don't do what they are designed to do.
-OSATOMIC_C_CFLAGS = -Os -momit-leaf-frame-pointer $(OSATOMIC_C_CFLAGS_$(PLATFORM_NAME)_$(CURRENT_ARCH))
+// Enable installapi
+SUPPORTS_TEXT_BASED_API = YES
+TAPI_VERIFY_MODE = Pedantic
+OTHER_TAPI_FLAGS = --no-infer-include-paths -umbrella System -extra-public-header $(TAPI_PUBLIC_HEADER_PATH) -extra-private-header $(TAPI_PRIVATE_HEADER_PATH)
+TAPI_PUBLIC_HEADER_PATH = $(TAPI_PUBLIC_HEADER_PATH_$(DEPLOYMENT_LOCATION))
+TAPI_PUBLIC_HEADER_PATH_NO = $(BUILT_PRODUCTS_DIR)$(PUBLIC_HEADERS_FOLDER_PATH)
+TAPI_PUBLIC_HEADER_PATH_YES = $(DSTROOT)$(PUBLIC_HEADERS_FOLDER_PATH)
+TAPI_PRIVATE_HEADER_PATH = $(TAPI_PRIVATE_HEADER_PATH_$(DEPLOYMENT_LOCATION))
+TAPI_PRIVATE_HEADER_PATH_NO = $(BUILT_PRODUCTS_DIR)$(PRIVATE_HEADERS_FOLDER_PATH)
+TAPI_PRIVATE_HEADER_PATH_YES = $(DSTROOT)$(PRIVATE_HEADERS_FOLDER_PATH)
+TAPI_HEADER_SEARCH_PATHS =
+
+// TODO: Remove this hack once Marzipan bringup is done
+VARIANT_PLATFORM_NAME = $(VARIANT_PLATFORM_NAME_$(RC_MARZIPAN))
+VARIANT_PLATFORM_NAME_ = $(PLATFORM_NAME)
+VARIANT_PLATFORM_NAME_YES = macosx
exit 0
fi
+if [[ "x${ACTION}" == "xinstallapi" ]]; then
+ exit 0
+fi
+
$@
// Pre-1050 symbols
-VARIANT_PRE1050_MACROS = $(VARIANT_PRE1050_MACROS_$(PLATFORM_NAME))
+VARIANT_PRE1050_MACROS = $(VARIANT_PRE1050_MACROS_$(VARIANT_PLATFORM_NAME))
VARIANT_PRE1050_MACROS_macosx = -U__DARWIN_VERS_1050 -D__DARWIN_VERS_1050=0 -DVARIANT_PRE1050
-VARIANT_PRE1050_INCLUDE = $(VARIANT_PRE1050_INCLUDE_$(PLATFORM_NAME))
-VARIANT_PRE1050_INCLUDE_macosx = daemon.c $(VARIANT_PRE1050_INCLUDE_$(PLATFORM_NAME)_$(CURRENT_ARCH))
+VARIANT_PRE1050_INCLUDE = $(VARIANT_PRE1050_INCLUDE_$(VARIANT_PLATFORM_NAME))
+VARIANT_PRE1050_INCLUDE_macosx = daemon.c $(VARIANT_PRE1050_INCLUDE_$(VARIANT_PLATFORM_NAME)_$(CURRENT_ARCH))
// Legacy symbols
VARIANT_LEGACY_MACROS = -U__DARWIN_UNIX03 -D__DARWIN_UNIX03=0 -U__DARWIN_64_BIT_INO_T -D__DARWIN_64_BIT_INO_T=0 -DVARIANT_LEGACY
-VARIANT_LEGACY_INCLUDE = $(VARIANT_LEGACY_INCLUDE_$(PLATFORM_NAME))
-VARIANT_LEGACY_INCLUDE_macosx = $(VARIANT_LEGACY_INCLUDE_$(PLATFORM_NAME)_$(CURRENT_ARCH))
+VARIANT_LEGACY_INCLUDE = $(VARIANT_LEGACY_INCLUDE_$(VARIANT_PLATFORM_NAME))
+VARIANT_LEGACY_INCLUDE_macosx = $(VARIANT_LEGACY_INCLUDE_$(VARIANT_PLATFORM_NAME)_$(CURRENT_ARCH))
VARIANT_LEGACY_INCLUDE_macosx_i386 = $(VARIANT_LEGACY_INCLUDE_compat) $(VARIANT_LEGACY_INCLUDE_gdtoa) $(VARIANT_LEGACY_INCLUDE_gen) $(VARIANT_LEGACY_INCLUDE_locale) $(VARIANT_LEGACY_INCLUDE_net) $(VARIANT_LEGACY_INCLUDE_regex) $(VARIANT_LEGACY_INCLUDE_stdio) $(VARIANT_LEGACY_INCLUDE_stdlib) $(VARIANT_LEGACY_INCLUDE_stdtime) $(VARIANT_LEGACY_INCLUDE_sys)
VARIANT_LEGACY_INCLUDE_compat = creat.c setregid.c setreuid.c sigcompat.c killpg.c
VARIANT_INODE32_MACROS = -U__DARWIN_64_BIT_INO_T -D__DARWIN_64_BIT_INO_T=0 -DVARIANT_INODE32
-VARIANT_INODE32_INCLUDE = $(VARIANT_INODE32_INCLUDE_$(PLATFORM_NAME))
-VARIANT_INODE32_INCLUDE_macosx = $(VARIANT_INODE32_INCLUDE_$(PLATFORM_NAME)_$(CURRENT_ARCH))
+VARIANT_INODE32_INCLUDE = $(VARIANT_INODE32_INCLUDE_$(VARIANT_PLATFORM_NAME))
+VARIANT_INODE32_INCLUDE_macosx = $(VARIANT_INODE32_INCLUDE_$(VARIANT_PLATFORM_NAME)_$(CURRENT_ARCH))
VARIANT_INODE32_INCLUDE_macosx_i386 = $(VARIANT_INODE32_INCLUDE_gen) $(VARIANT_INODE32_INCLUDE_sys)
VARIANT_INODE32_INCLUDE_macosx_x86_64 = $(VARIANT_INODE32_INCLUDE_gen) $(VARIANT_INODE32_INCLUDE_sys)
VARIANT_DYLD_INCLUDE_generic = $(VARIANT_DYLD_INCLUDE_gen) $(VARIANT_DYLD_INCLUDE_stdlib) $(VARIANT_DYLD_INCLUDE_string) $(VARIANT_DYLD_INCLUDE_sys)
VARIANT_DYLD_INCLUDE_gen = arc4random.c closedir.c dirfd.c getcwd.c getpagesize.c nanosleep.c opendir.c readdir.c scandir.c sysctl.c sysctlbyname.c telldir.c usleep.c
VARIANT_DYLD_INCLUDE_stdlib = atexit.c exit.c gettimeofday.c heapsort.c merge.c qsort.c reallocf.c realpath.c
-VARIANT_DYLD_INCLUDE_string = bcopy.c libplatform.s strcat.c strchr.c strcpy.c strdup.c strlcat.c strlcpy.c strncmp.c strnlen.c strrchr.c strstr.c
+VARIANT_DYLD_INCLUDE_string = bcopy.c strcat.c strdup.c strrchr.c
VARIANT_DYLD_INCLUDE_sys = _libc_init.c
-
-VARIANT_DYLD_INCLUDE_x86_64 = x86_64/string/strcpy.s x86_64/string/strlen.s x86_64/string/strncpy.s x86_64/string/strnlen.s strstr.c
-VARIANT_DYLD_INCLUDE_i386 = i386/string/strcpy.s i386/string/strlen.s i386/string/strncpy.s strnlen.c strstr.c
-VARIANT_DYLD_INCLUDE_armv7 = strcpy.c arm/string/strlen.s strncpy.c arm/string/strnlen.s arm/string/strstr.s
-VARIANT_DYLD_INCLUDE_arm64 = strcpy.c strncpy.c arm64/string/strnlen.s strstr.c
-VARIANT_DYLD_INCLUDE_arm64_32 = strcpy.c strncpy.c arm64/string/strnlen.s strstr.c
-
-VARIANT_DYLD_INCLUDE_armv7s = $(VARIANT_DYLD_INCLUDE_armv7)
-VARIANT_DYLD_INCLUDE_armv7k = $(VARIANT_DYLD_INCLUDE_armv7)
-VARIANT_DYLD_INCLUDE_armv7f = $(VARIANT_DYLD_INCLUDE_armv7)
-