--- ./erts/etc/unix/run_erl.c.orig Wed Oct 2 22:18:00 2002 +++ ./erts/etc/unix/run_erl.c Fri Nov 29 20:38:05 2002 @@ -601,7 +601,11 @@ */ static int create_fifo(char *name, int perm) { - if ((mknod(name, S_IFIFO | perm, 0) < 0) && (errno != EEXIST)) +#ifdef HAVE_MACH_O_DYLD_H + if ((mkfifo(name, perm) < 0) && (errno != EEXIST)) +#else + if ((mknod(name, S_IFIFO | perm, 0) < 0) && (errno != EEXIST)) +#endif return -1; return 0; } --- ./lib/asn1/c_src/Makefile.in.orig Wed Oct 2 23:36:48 2002 +++ ./lib/asn1/c_src/Makefile.in Fri Nov 29 18:42:29 2002 @@ -111,7 +111,7 @@ $(CC) -c $(CFLAGS) -o $(OBJ_FILES) $(C_FILES) $(SHARED_OBJ_FILES): $(OBJ_FILES) $(LIBDIR) - $(LD) $(LDFLAGS) -o $(SHARED_OBJ_FILES) $(OBJ_FILES) -lc $(LIBS) + $(CC) $(LDFLAGS) -o $(SHARED_OBJ_FILES) $(OBJ_FILES) -lc $(LIBS) $(LIBDIR): -mkdir -p $(LIBDIR) --- ./lib/crypto/c_src/crypto_drv.c.orig Fri Nov 29 15:38:07 2002 +++ ./lib/crypto/c_src/crypto_drv.c Fri Nov 29 15:38:35 2002 @@ -33,6 +33,10 @@ #include "md5.h" #include "sha.h" +#if defined(HAVE_MACH_O_DYLD_H) +#include +#endif + #define get_int32(s) ((((unsigned char*) (s))[0] << 24) | \ (((unsigned char*) (s))[1] << 16) | \ (((unsigned char*) (s))[2] << 8) | \ @@ -40,10 +44,15 @@ /* shared libs & dlls */ EXTERN void *driver_dl_open(char *); -EXTERN void *driver_dl_sym(void *, char *); EXTERN int driver_dl_close(void *); EXTERN char *driver_dl_error(void); +#if defined(HAVE_MACH_O_DYLD_H) +void *driver_dl_sym(void *, char *); +#else +EXTERN void *driver_dl_sym(void *, char *); +#endif + /* Driver interface declarations */ static ErlDrvData start(ErlDrvPort port, char *command); static void stop(ErlDrvData drv_data); @@ -91,8 +100,10 @@ #define DRV_SHA_MAC_96 12 #define DRV_CBC_DES_ENCRYPT 13 #define DRV_CBC_DES_DECRYPT 14 +#define DRV_EDE3_CBC_DES_ENCRYPT 15 +#define DRV_EDE3_CBC_DES_DECRYPT 16 -#define NUM_CRYPTO_FUNCS 14 +#define NUM_CRYPTO_FUNCS 16 #define MD5_CTX_LEN (sizeof(MD5_CTX)) #define MD5_LEN 16 @@ -121,10 +132,27 @@ void (*SHA1_Final)(char *, SHA_CTX *); int (*des_set_key)(char *, void *); void (*des_ncbc_encrypt)(char *, char *, int, void *, char *, int); + void (*des_ede3_cbc_encrypt)(char *, char *, int, void *, void *, + void *, char *, int); } crypto_funcs; static crypto_funcs cfs; +/* We need our own OS X driver_dl_sym because the mechanism used in unix_ddll_drv.c + cannot find symbols except those specifically defined IN the module - not those in a + linked library */ + +#if defined(HAVE_MACH_O_DYLD_H) +void *driver_dl_sym(void *handle, char *symbol) { + NSSymbol nssymbol; + static char undersym[65]; /* enough for all the symbols we will find here anyway */ + int sym_len = strlen(symbol); + snprintf(undersym,64,"_%s",symbol); + nssymbol = NSLookupAndBindSymbol(undersym); + return nssymbol != NULL ? NSAddressOfSymbol(nssymbol) : NULL; +} +#endif + /* INITIALIZATION AFTER LOADING */ /* @@ -181,6 +209,7 @@ cfs.SHA1_Final = driver_dl_sym(lib_handle, "SHA1_Final"); cfs.des_set_key = driver_dl_sym(lib_handle, "des_set_key"); cfs.des_ncbc_encrypt = driver_dl_sym(lib_handle, "des_ncbc_encrypt"); + cfs.des_ede3_cbc_encrypt = driver_dl_sym(lib_handle, "des_ede3_cbc_encrypt"); /* Check that all pointer where initialized */ for (i = 0; i < sizeof(crypto_funcs)/sizeof(void*); i++) { @@ -221,9 +250,9 @@ int len, char **rbuf, int rlen) { int klen, dlen, i, macsize; - char *key, *dbuf, *ivec; + char *key, *key2, *key3, *dbuf, *ivec; ErlDrvBinary *b; - des_key_schedule schedule; + des_key_schedule schedule, schedule2, schedule3; char hmacbuf[SHA_LEN]; MD5_CTX md5_ctx; SHA_CTX sha_ctx; @@ -341,6 +370,23 @@ (*cfs.des_set_key)(key, (void *)schedule); (*cfs.des_ncbc_encrypt)(dbuf, b->orig_bytes, dlen, schedule, ivec, (command == DRV_CBC_DES_ENCRYPT)); + return dlen; + break; + + case DRV_EDE3_CBC_DES_ENCRYPT: + case DRV_EDE3_CBC_DES_DECRYPT: + dlen = len - 32; + if (dlen < 0) + return -1; + key = buf; key2 = buf + 8; key3 = buf + 16; + ivec = buf + 24; dbuf = buf + 32; + *rbuf = (char *)(b = driver_alloc_binary(dlen)); + (*cfs.des_set_key)(key, (void *)schedule); + (*cfs.des_set_key)(key2, (void *)schedule2); + (*cfs.des_set_key)(key3, (void *)schedule3); + (*cfs.des_ede3_cbc_encrypt)(dbuf, b->orig_bytes, dlen, schedule, + schedule2, schedule3, ivec, + (command == DRV_EDE3_CBC_DES_ENCRYPT)); return dlen; break; --- ./lib/crypto/c_src/Makefile.in.orig Fri Nov 29 15:39:36 2002 +++ ./lib/crypto/c_src/Makefile.in Fri Nov 29 17:50:40 2002 @@ -83,17 +83,18 @@ endif ELIBCRYPTO_UNDEFS = \ - -u CRYPTO_set_mem_functions \ - -u MD5 \ - -u MD5_Init \ - -u MD5_Update \ - -u MD5_Final \ - -u SHA1 \ - -u SHA1_Init \ - -u SHA1_Update \ - -u SHA1_Final \ - -u des_set_key \ - -u des_ncbc_encrypt + -u _CRYPTO_set_mem_functions \ + -u _MD5 \ + -u _MD5_Init \ + -u _MD5_Update \ + -u _MD5_Final \ + -u _SHA1 \ + -u _SHA1_Init \ + -u _SHA1_Update \ + -u _SHA1_Final \ + -u _des_set_key \ + -u _des_ncbc_encrypt \ + -u _des_ede3_cbc_encrypt # ---------------------------------------------------- # Targets @@ -123,11 +124,11 @@ $(LIBDIR)/crypto_drv.so: $(CRYPTO_DRV_OBJS) $(INSTALL_DIR) $(LIBDIR) - $(LD) $(LDFLAGS) -o $@ $^ -lc $(LIBS) + $(CC) $(LDFLAGS) -o $@ $^ -lc $(LIBS) $(LIBDIR)/elibcrypto.so: $(ELIBCRYPTO_OBJS) $(INSTALL_DIR) $(LIBDIR) - $(LD) $(LDFLAGS) -o $@ $^ -lc $(LIBS) + $(CC) $(LDFLAGS) -o $@ $^ -lc $(LIBS) clean: rm -f $(SOLIBS) $(OBJS) --- ./lib/crypto/src/crypto.erl.orig Fri Nov 29 15:42:21 2002 +++ ./lib/crypto/src/crypto.erl Fri Nov 29 15:42:47 2002 @@ -25,6 +25,7 @@ -export([sha/1, sha_init/0, sha_update/2, sha_final/1]). -export([md5_mac/2, md5_mac_96/2, sha_mac/2, sha_mac_96/2]). -export([des_cbc_encrypt/3, des_cbc_decrypt/3, des_cbc_ivec/1]). +-export([des_ede3_cbc_encrypt/5, des_ede3_cbc_decrypt/5]). -define(INFO, 0). -define(MD5, 1). @@ -41,6 +42,8 @@ -define(SHA_MAC_96, 12). -define(DES_CBC_ENCRYPT, 13). -define(DES_CBC_DECRYPT, 14). +-define(DES_EDE3_CBC_ENCRYPT, 15). +-define(DES_EDE3_CBC_DECRYPT, 16). -define(FUNC_LIST, [md5, md5_init, @@ -55,7 +58,9 @@ sha_mac, sha_mac_96, des_cbc_encrypt, - des_cbc_decrypt]). + des_cbc_decrypt, + des_ede3_cbc_encrypt, + des_ede3_cbc_decrypt]). start() -> application:start(crypto). @@ -150,6 +155,16 @@ IVec; des_cbc_ivec(Data) when list(Data) -> des_cbc_ivec(list_to_binary(Data)). + +%% +%% DES - in cipher block chaining mode (CBC) +%% +des_ede3_cbc_encrypt(Key1, Key2, Key3, IVec, Data) -> + control(?DES_EDE3_CBC_ENCRYPT, [Key1, Key2, Key3, IVec, Data]). + +des_ede3_cbc_decrypt(Key1, Key2, Key3, IVec, Data) -> + control(?DES_EDE3_CBC_DECRYPT, [Key1, Key2, Key3, IVec, Data]). + %% %% LOCAL FUNCTIONS --- ./lib/inets/src/httpd_request_handler.erl.orig Wed Oct 2 22:51:11 2002 +++ ./lib/inets/src/httpd_request_handler.erl Fri Nov 29 16:36:22 2002 @@ -488,7 +488,7 @@ {ok, BodyPart}; read_entity_body(SocketType, Socket, Timeout, Max, Len, BodyPart) -> - case httpd_socket:recv(SocketType, Socket, Len, Timeout) of + case httpd_socket:recv(SocketType, Socket, Len - length(BodyPart), Timeout) of {ok,Body} -> read_entity_body(SocketType, Socket, Timeout, Max, Len, BodyPart ++ Body); --- ./lib/kernel/src/group.erl.orig Fri Nov 29 15:45:07 2002 +++ ./lib/kernel/src/group.erl Fri Nov 29 15:45:26 2002 @@ -190,7 +190,8 @@ send_drv_reqs(Drv, Rs), put(line_buffer, [Line|lists:delete(Line, get(line_buffer))]), {done,Line,Rest}; -get_line1({undefined,{A,none,$\^P},Cs,Cont,Rs}, Drv, Ls0) -> +get_line1({undefined,{A,Mode,Char},Cs,Cont,Rs}, Drv, Ls0) when ((Mode == none) and (Char == $\^P)) + or ((Mode == meta_left_sq_bracket) and (Char == $A)) -> send_drv_reqs(Drv, Rs), case up_stack(Ls0) of {none,Ls} -> @@ -205,7 +206,8 @@ Drv, Ls) end; -get_line1({undefined,{A,none,$\^N},Cs,Cont,Rs}, Drv, Ls0) -> +get_line1({undefined,{A,Mode,Char},Cs,Cont,Rs}, Drv, Ls0) when ((Mode == none) and (Char == $\^N)) + or ((Mode == meta_left_sq_bracket) and (Char == $B)) -> send_drv_reqs(Drv, Rs), case down_stack(Ls0) of {none,Ls} -> --- ./lib/os_mon/src/cpu_sup.erl.orig Fri Oct 11 09:55:57 2002 +++ ./lib/os_mon/src/cpu_sup.erl Wed Nov 27 01:04:23 2002 @@ -119,7 +119,8 @@ {stop, proc_file_system_not_accessible} end; {unix, Flavor} = OsType when Flavor == freebsd; - Flavor == openbsd -> + Flavor == openbsd; + Flavor == darwin -> {ok,#state{os_type = OsType}}; OsType -> {stop, {os_type_not_supported,OsType}} @@ -261,6 +262,19 @@ get_int_measurement(Request, #state{os_type = {unix, openbsd}}) -> D = os:cmd("/sbin/sysctl -n vm.loadavg") -- "\n", {ok, [L1, L5, L15], _} = io_lib:fread("~f ~f ~f", D), + case Request of + ?avg1 -> sunify(L1); + ?avg5 -> sunify(L5); + ?avg15 -> sunify(L15); + ?ping -> 4711; + ?nprocs -> + Ps = os:cmd("/bin/ps -ax | /usr/bin/wc -l"), + {ok, [N], _} = io_lib:fread("~d", Ps), + N-1 + end; +get_int_measurement(Request, #state{os_type = {unix, darwin}}) -> + D = os:cmd("uptime") -- "\n", + {ok, [L1, L5, L15], _} = io_lib:fread("~*s~*s~*s~*s~*s~*s~*s~f,~f,~f", D), case Request of ?avg1 -> sunify(L1); ?avg5 -> sunify(L5); --- ./lib/os_mon/src/disksup.erl.orig Wed Oct 2 22:16:31 2002 +++ ./lib/os_mon/src/disksup.erl Wed Nov 27 02:11:02 2002 @@ -100,6 +100,9 @@ check_disks_solaris(skip_to_eol(Result), State#state.threshold); check_disk_space(State) when State#state.os == {unix, sunos4} -> Result = my_cmd("df",State#state.port), + check_disks_solaris(skip_to_eol(Result), State#state.threshold); +check_disk_space(State) when State#state.os == {unix, darwin} -> + Result = my_cmd("/bin/df -lk -t ufs,hfs",State#state.port), check_disks_solaris(skip_to_eol(Result), State#state.threshold). % This code works for Linux and FreeBSD as well @@ -186,6 +189,8 @@ {unix, freebsd}; {unix, openbsd} -> {unix, openbsd}; + {unix, darwin} -> + {unix, darwin}; {win32,W} -> {win32,W}; Type -> --- ./lib/os_mon/src/memsup_helper.erl.orig Wed Oct 2 22:37:10 2002 +++ ./lib/os_mon/src/memsup_helper.erl Wed Nov 27 02:11:39 2002 @@ -72,6 +72,7 @@ {win32,_} -> not_used; {unix,linux} -> not_used; {unix,freebsd} -> not_used; + {unix, darwin} -> not_used; _ -> start_portprogram() end, process_flag(priority, low), @@ -95,6 +96,8 @@ get_memory_usage_linux(Port); {unix,freebsd} -> get_memory_usage_freebsd(Port); + {unix,darwin} -> + get_memory_usage_darwin(Port); _ -> get_memory_usage(Port) end, @@ -234,6 +237,31 @@ list_to_integer(os:cmd("/sbin/sysctl -n " ++ Def) -- "\n"). %%----------------------------------------------------------------- +%% get_memory_usage_darwin(_Port) +%% +%% Uses vm_stat command. This appears to lie about the page size in +%% Mac OS X 10.2.2 - the pages given are based on 4000 bytes, but +%% the vm_stat command tells us that it is 4096.. +%% Returns {Allocated,Total} +%%----------------------------------------------------------------- +get_memory_usage_darwin(_) -> + Str = os:cmd("/usr/bin/vm_stat"), + {ok, [Free],Str2} = io_lib:fread("Pages free:~d.", skip_to_eol(Str)), + {ok, [Active],Str3} = io_lib:fread("Pages active:~d.", skip_to_eol(Str2)), + {ok, [Inactive],Str4} = io_lib:fread("Pages inactive:~d.", skip_to_eol(Str3)), + {ok, [Wired],_} = io_lib:fread("Pages wired down:~d.", skip_to_eol(Str4)), + NMemUsed = (Wired + Active + Inactive) * 4000, + NMemTotal = NMemUsed + Free * 4000, + {NMemUsed,NMemTotal}. + +skip_to_eol([]) -> + []; +skip_to_eol([$\n | T]) -> + T; +skip_to_eol([_ | T]) -> + skip_to_eol(T). + +%%----------------------------------------------------------------- %% Return the extended memory data as a tagged list %% The (current) possible tag values are: %% total_memory: The total memory available to erlang. @@ -256,6 +284,10 @@ {system_total_memory,Tot}]; % correct unless setrlimit() set {unix,freebsd} -> {Alloced,Tot} = get_memory_usage_freebsd([]), + [{total_memory,Tot},{free_memory, Tot-Alloced}, + {system_total_memory,Tot}]; + {unix,darwin} -> + {Alloced,Tot} = get_memory_usage_darwin([]), [{total_memory,Tot},{free_memory, Tot-Alloced}, {system_total_memory,Tot}]; _ -> --- ./lib/ssl/c_src/Makefile.dist.orig Fri Nov 29 16:15:24 2002 +++ ./lib/ssl/c_src/Makefile.dist Fri Nov 29 16:15:43 2002 @@ -12,6 +12,6 @@ LIBDIR = `pwd`/../bin $(BINDIR)/ssl_esock: ssl_base.o esock_ssleay.o - $(CC) $(LDFLAGS) -L$(LIBDIR) -Wl,-R$(LIBDIR) -o $@ $? \ + $(CC) $(LDFLAGS) -L$(LIBDIR) -o $@ $? \ $(LDLIBS) -lssl -lcrypto --- ./lib/stdlib/src/edlin.erl.orig Fri Nov 29 15:44:15 2002 +++ ./lib/stdlib/src/edlin.erl Fri Nov 29 15:44:40 2002 @@ -69,6 +69,8 @@ case key_map(C, Prefix) of meta -> edit(Cs, P, {Bef,Aft}, meta, Rs0); + meta_left_sq_bracket -> + edit(Cs, P, {Bef,Aft}, meta_left_sq_bracket, Rs0); ctlx -> edit(Cs, P, {Bef,Aft}, ctlx, Rs0); new_line -> @@ -171,6 +173,9 @@ key_map($y, meta) -> yank_pop; key_map($\177, none) -> backward_delete_char; key_map($\177, meta) -> backward_kill_word; +key_map($[, meta) -> meta_left_sq_bracket; +key_map($D, meta_left_sq_bracket) -> backward_char; +key_map($C, meta_left_sq_bracket) -> forward_char; key_map(C, none) when C >= $\s -> {insert,C}; key_map(C, _) -> {undefined,C}.