From c3a615aa2da09bc3a0575e973959f800460a63de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Fri, 17 Jun 2011 12:54:20 +0200 Subject: Use epoch seconds instead of datetime() First stage in utc-time for prim_file. --- erts/preloaded/src/prim_file.erl | 116 +++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 53 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 7316e0be99..2fe7797e54 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -736,6 +736,7 @@ read_file_info(Port, File) when is_port(Port) -> read_file_info_int(Port, File) -> drv_command(Port, [?FILE_FSTAT, pathname(File)]). + %% altname/{1,2} altname(File) -> @@ -760,22 +761,24 @@ write_file_info_int(Port, #file_info{mode=Mode, uid=Uid, gid=Gid, - atime=Atime0, - mtime=Mtime0, - ctime=Ctime}) -> - {Atime, Mtime} = - case {Atime0, Mtime0} of - {undefined, Mtime0} -> {erlang:localtime(), Mtime0}; - {Atime0, undefined} -> {Atime0, Atime0}; - Complete -> Complete - end, + atime=Atime, + mtime=Mtime, + ctime=Ctime}) when + (is_integer(Atime) orelse Atime =:= undefined) andalso + (is_integer(Mtime) orelse Mtime =:= undefined) andalso + (is_integer(Ctime) orelse Ctime =:= undefined) -> + + %% todo: set atime to localtime() (seconds since epoch) if undefined + %% set mtime to atime if undefined + %% if both undefined ? + drv_command(Port, [?FILE_WRITE_INFO, - int_to_bytes(Mode), - int_to_bytes(Uid), - int_to_bytes(Gid), - date_to_bytes(Atime), - date_to_bytes(Mtime), - date_to_bytes(Ctime), + int_to_int32bytes(Mode), + int_to_int32bytes(Uid), + int_to_int32bytes(Gid), + int_to_int64bytes(Atime), + int_to_int64bytes(Mtime), + int_to_int64bytes(Ctime), pathname(File)]). @@ -1075,7 +1078,8 @@ translate_response(?FILE_RESP_DATA, List) -> {_N, _Data} = ND = get_uint64(List), {ok, ND}; translate_response(?FILE_RESP_INFO, List) when is_list(List) -> - {ok, transform_info_ints(get_uint32s(List))}; + {ok, transform_info(List)}; + %{ok, transform_info_ints(get_uint32s(List))}; translate_response(?FILE_RESP_NUMERR, L0) -> {N, L1} = get_uint64(L0), {error, {N, list_to_atom(L1)}}; @@ -1129,27 +1133,38 @@ translate_response(?FILE_RESP_ALL_DATA, Data) -> translate_response(X, Data) -> {error, {bad_response_from_port, [X | Data]}}. -transform_info_ints(Ints) -> - [HighSize, LowSize, Type|Tail0] = Ints, - Size = HighSize * 16#100000000 + LowSize, - [Ay, Am, Ad, Ah, Ami, As|Tail1] = Tail0, - [My, Mm, Md, Mh, Mmi, Ms|Tail2] = Tail1, - [Cy, Cm, Cd, Ch, Cmi, Cs|Tail3] = Tail2, - [Mode, Links, Major, Minor, Inode, Uid, Gid, Access] = Tail3, + +transform_info([ + Hsize1, Hsize2, Hsize3, Hsize4, + Lsize1, Lsize2, Lsize3, Lsize4, + Type1, Type2, Type3, Type4, + Atime1, Atime2, Atime3, Atime4, Atime5, Atime6, Atime7, Atime8, + Mtime1, Mtime2, Mtime3, Mtime4, Mtime5, Mtime6, Mtime7, Mtime8, + Ctime1, Ctime2, Ctime3, Ctime4, Ctime5, Ctime6, Ctime7, Ctime8, + Mode1, Mode2, Mode3, Mode4, + Links1, Links2, Links3, Links4, + Major1, Major2, Major3, Major4, + Minor1, Minor2, Minor3, Minor4, + Inode1, Inode2, Inode3, Inode4, + Uid1, Uid2, Uid3, Uid4, + Gid1, Gid2, Gid3, Gid4, + Access1,Access2,Access3,Access4]) -> #file_info { - size = Size, - type = file_type(Type), - access = file_access(Access), - atime = {{Ay, Am, Ad}, {Ah, Ami, As}}, - mtime = {{My, Mm, Md}, {Mh, Mmi, Ms}}, - ctime = {{Cy, Cm, Cd}, {Ch, Cmi, Cs}}, - mode = Mode, - links = Links, - major_device = Major, - minor_device = Minor, - inode = Inode, - uid = Uid, - gid = Gid}. + size = uint32(Hsize1,Hsize2,Hsize3,Hsize4)*16#100000000 + uint32(Lsize1,Lsize2,Lsize3,Lsize4), + type = file_type(uint32(Type1,Type2,Type3,Type4)), + access = file_access(uint32(Access1,Access2,Access3,Access4)), + atime = sint64(Atime1, Atime2, Atime3, Atime4, Atime5, Atime6, Atime7, Atime8), + mtime = sint64(Mtime1, Mtime2, Mtime3, Mtime4, Mtime5, Mtime6, Mtime7, Mtime8), + ctime = sint64(Ctime1, Ctime2, Ctime3, Ctime4, Ctime5, Ctime6, Ctime7, Ctime8), + mode = uint32(Mode1,Mode2,Mode3,Mode4), + links = uint32(Links1,Links2,Links3,Links4), + major_device = uint32(Major1,Major2,Major3,Major4), + minor_device = uint32(Minor1,Minor2,Minor3,Minor4), + inode = uint32(Inode1,Inode2,Inode3,Inode4), + uid = uint32(Uid1,Uid2,Uid3,Uid4), + gid = uint32(Gid1,Gid2,Gid3,Gid4) + }. + file_type(1) -> device; file_type(2) -> directory; @@ -1162,24 +1177,24 @@ file_access(1) -> write; file_access(2) -> read; file_access(3) -> read_write. -int_to_bytes(Int) when is_integer(Int) -> +int_to_int32bytes(Int) when is_integer(Int) -> <>; -int_to_bytes(undefined) -> +int_to_int32bytes(undefined) -> <<-1:32>>. -date_to_bytes(undefined) -> - <<-1:32, -1:32, -1:32, -1:32, -1:32, -1:32>>; -date_to_bytes({{Y, Mon, D}, {H, Min, S}}) -> - <>. +int_to_int64bytes(Int) when is_integer(Int) -> + <>; +int_to_int64bytes(undefined) -> + <<-1:64>>. -%% uint64([[X1, X2, X3, X4] = Y1 | [X5, X6, X7, X8] = Y2]) -> -%% (uint32(Y1) bsl 32) bor uint32(Y2). -%% uint64(X1, X2, X3, X4, X5, X6, X7, X8) -> -%% (uint32(X1, X2, X3, X4) bsl 32) bor uint32(X5, X6, X7, X8). +sint64(I1,I2,I3,I4,I5,I6,I7,I8) when I1 > 127 -> + ((I1 bsl 56) bor (I2 bsl 48) bor (I3 bsl 40) bor (I4 bsl 32) bor + (I5 bsl 24) bor (I6 bsl 16) bor (I7 bsl 8) bor I8) - (1 bsl 64); +sint64(I1,I2,I3,I4,I5,I6,I7,I8) -> + ((I1 bsl 56) bor (I2 bsl 48) bor (I3 bsl 40) bor (I4 bsl 32) bor + (I5 bsl 24) bor (I6 bsl 16) bor (I7 bsl 8) bor I8). -%% uint32([X1,X2,X3,X4]) -> -%% (X1 bsl 24) bor (X2 bsl 16) bor (X3 bsl 8) bor X4. uint32(X1,X2,X3,X4) -> (X1 bsl 24) bor (X2 bsl 16) bor (X3 bsl 8) bor X4. @@ -1192,11 +1207,6 @@ get_uint64(L0) -> get_uint32([X1,X2,X3,X4|List]) -> {(((((X1 bsl 8) bor X2) bsl 8) bor X3) bsl 8) bor X4, List}. -get_uint32s([X1,X2,X3,X4|Tail]) -> - [uint32(X1,X2,X3,X4) | get_uint32s(Tail)]; -get_uint32s([]) -> []. - - %% Binary mode transform_ldata(<<0:32, 0:32>>) -> -- cgit v1.2.3 From f356bb25df7fe4d6a20d7427b4b4249e9219157c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Fri, 18 Nov 2011 18:02:12 +0100 Subject: Move datetime into prim_file --- erts/preloaded/src/prim_file.erl | 236 ++++++++++++++++++++++++++++++++++----- 1 file changed, 208 insertions(+), 28 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 2fe7797e54..69ef0b9d54 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -45,9 +45,9 @@ rename/2, rename/3, make_dir/1, make_dir/2, del_dir/1, del_dir/2, - read_file_info/1, read_file_info/2, + read_file_info/1, read_file_info/2, read_file_info/3, altname/1, altname/2, - write_file_info/2, write_file_info/3, + write_file_info/2, write_file_info/3, write_file_info/4, make_link/2, make_link/3, make_symlink/2, make_symlink/3, read_link/1, read_link/2, @@ -728,13 +728,23 @@ del_dir_int(Port, Dir) -> %% read_file_info/{1,2} read_file_info(File) -> - read_file_info_int({?DRV, [binary]}, File). + read_file_info_int({?DRV, [binary]}, File, local). read_file_info(Port, File) when is_port(Port) -> - read_file_info_int(Port, File). - -read_file_info_int(Port, File) -> - drv_command(Port, [?FILE_FSTAT, pathname(File)]). + read_file_info_int(Port, File, local). + +read_file_info(Port, File, Opts) when is_port(Port) -> + read_file_info_int(Port, File, plgv(time, Opts)). + +read_file_info_int(Port, File, TimeType) -> + case drv_command(Port, [?FILE_FSTAT, pathname(File)]) of + {ok, FI} -> {ok, FI#file_info{ + ctime = from_seconds(FI#file_info.ctime, TimeType), + mtime = from_seconds(FI#file_info.mtime, TimeType), + atime = from_seconds(FI#file_info.atime, TimeType) + }}; + Error -> Error + end. %% altname/{1,2} @@ -748,37 +758,44 @@ altname(Port, File) when is_port(Port) -> altname_int(Port, File) -> drv_command(Port, [?FILE_ALTNAME, pathname(File)]). -%% write_file_info/{2,3} +%% write_file_info/{2,3,4} write_file_info(File, Info) -> - write_file_info_int({?DRV, [binary]}, File, Info). + write_file_info_int({?DRV, [binary]}, File, Info, local). write_file_info(Port, File, Info) when is_port(Port) -> - write_file_info_int(Port, File, Info). + write_file_info_int(Port, File, Info, local); + +write_file_info(File, Info, Opts) -> + write_file_info_int({?DRV, [binary]}, File, Info, plgv(time, Opts)). + +write_file_info(Port, File, Info, Opts) when is_port(Port) -> + write_file_info_int(Port, File, Info, plgv(time, Opts)). write_file_info_int(Port, File, #file_info{mode=Mode, uid=Uid, gid=Gid, - atime=Atime, - mtime=Mtime, - ctime=Ctime}) when - (is_integer(Atime) orelse Atime =:= undefined) andalso - (is_integer(Mtime) orelse Mtime =:= undefined) andalso - (is_integer(Ctime) orelse Ctime =:= undefined) -> - - %% todo: set atime to localtime() (seconds since epoch) if undefined - %% set mtime to atime if undefined - %% if both undefined ? + atime=Atime0, + mtime=Mtime0, + ctime=Ctime}, + TimeType) -> + + %% FIXME: wtf + {Atime, Mtime} = case {Atime0, Mtime0} of + {undefined, Mtime0} -> {erlang:localtime(), Mtime0}; + {Atime0, undefined} -> {Atime0, Atime0}; + Complete -> Complete + end, drv_command(Port, [?FILE_WRITE_INFO, int_to_int32bytes(Mode), int_to_int32bytes(Uid), int_to_int32bytes(Gid), - int_to_int64bytes(Atime), - int_to_int64bytes(Mtime), - int_to_int64bytes(Ctime), + int_to_int64bytes(to_seconds(Atime, TimeType)), + int_to_int64bytes(to_seconds(Mtime, TimeType)), + int_to_int64bytes(to_seconds(Ctime, TimeType)), pathname(File)]). @@ -825,16 +842,28 @@ read_link_int(Port, Link) -> %% read_link_info/{2,3} read_link_info(Link) -> - read_link_info_int({?DRV, [binary]}, Link). + read_link_info_int({?DRV, [binary]}, Link, local). read_link_info(Port, Link) when is_port(Port) -> - read_link_info_int(Port, Link). + read_link_info_int(Port, Link, local); -read_link_info_int(Port, Link) -> - drv_command(Port, [?FILE_LSTAT, pathname(Link)]). +read_link_info(Link, Opts) -> + read_link_info_int({?DRV, [binary]}, Link, plgv(time, Opts)). +read_link_info(Port, Link, Opts) when is_port(Port) -> + read_link_info_int(Port, Link, plgv(time, Opts)). +read_link_info_int(Port, Link, TimeType) -> + case drv_command(Port, [?FILE_LSTAT, pathname(Link)]) of + {ok, FI} -> {ok, FI#file_info{ + ctime = from_seconds(FI#file_info.ctime, TimeType), + mtime = from_seconds(FI#file_info.mtime, TimeType), + atime = from_seconds(FI#file_info.atime, TimeType) + }}; + Error -> Error + end. + %% list_dir/{1,2} list_dir(Dir) -> @@ -1079,7 +1108,6 @@ translate_response(?FILE_RESP_DATA, List) -> {ok, ND}; translate_response(?FILE_RESP_INFO, List) when is_list(List) -> {ok, transform_info(List)}; - %{ok, transform_info_ints(get_uint32s(List))}; translate_response(?FILE_RESP_NUMERR, L0) -> {N, L1} = get_uint64(L0), {error, {N, list_to_atom(L1)}}; @@ -1285,3 +1313,155 @@ reverse(L, T) -> lists:reverse(L, T). % in list_to_binary, which is caught and generates the {error,badarg} return pathname(File) -> (catch prim_file:internal_name2native(File)). + + +%% proplist:get_value/2 +plgv(K,[{K, V}|_]) -> V; +plgv(K,[_|KVs]) -> plgv(K,KVs); +plgv(_,[]) -> undefined. + + +%% +%% We don't actually want this here +%% We want to use epochs in all prim but erl_prim_loader makes that tricky +%% It is probably needed to redo the whole erl_prim_loader + +-define(DAYS_FROM_0_TO_1970, 719528). +-define(SECONDS_PER_DAY, 86400). +-define(SECONDS_PER_HOUR, 3600). +-define(SECONDS_PER_MINUTE, 60). +-define(DAYS_PER_YEAR, 365). +-define(DAYS_PER_LEAP_YEAR, 366). + +from_seconds(Seconds, utc) when is_integer(Seconds) -> + gregorian_seconds_to_datetime(Seconds + ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970); +from_seconds(Seconds, local) when is_integer(Seconds) -> + erlang:universaltime_to_localtime(gregorian_seconds_to_datetime(Seconds + ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970)). + +to_seconds({_,_} = Datetime, utc) -> + datetime_to_gregorian_seconds(Datetime) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970; +to_seconds({_,_} = Datetime, local) -> + datetime_to_gregorian_seconds(erlang:localtime_to_universaltime(Datetime)) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970; +to_seconds(undefined, _) -> to_seconds(erlang:universaltime(), utc). + +%% perhaps like this + +posix_time(Time) -> + EpochStart = {{1970,1,1},{0,0,0}}, + {Days,{Hour,Min,Sec}} = calendar:time_difference(EpochStart, Time), + 86400*Days + 3600*Hour + 60*Min + Sec. + +posix_to_erlang_time(Sec) -> + OneMillion = 1000000, + Time = calendar:now_to_datetime({Sec div OneMillion, Sec rem OneMillion, 0}), + erlang:universaltime_to_localtime(Time). + + +% from calendar, slightly modified + +%% calendar:datetime_to_gregorian_seconds/1 + +datetime_to_gregorian_seconds({Date, Time}) -> + ?SECONDS_PER_DAY*date_to_gregorian_days(Date) + time_to_seconds(Time). + + +time_to_seconds({H, M, S}) when is_integer(H), is_integer(M), is_integer(S) -> + H * ?SECONDS_PER_HOUR + M * ?SECONDS_PER_MINUTE + S. + +date_to_gregorian_days({Year, Month, Day}) -> + date_to_gregorian_days(Year, Month, Day). + +date_to_gregorian_days(Year, Month, Day) when is_integer(Day), Day > 0 -> + Last = last_day_of_the_month(Year, Month), + if + Day =< Last -> + dy(Year) + dm(Month) + df(Year, Month) + Day - 1 + end. + +last_day_of_the_month(Y, M) when is_integer(Y), Y >= 0 -> + last_day_of_the_month1(Y, M). + +last_day_of_the_month1(_, 4) -> 30; +last_day_of_the_month1(_, 6) -> 30; +last_day_of_the_month1(_, 9) -> 30; +last_day_of_the_month1(_,11) -> 30; +last_day_of_the_month1(Y, 2) -> + case is_leap_year(Y) of + true -> 29; + _ -> 28 + end; +last_day_of_the_month1(_, M) when is_integer(M), M > 0, M < 13 -> + 31. + +dm(1) -> 0; dm(2) -> 31; dm(3) -> 59; dm(4) -> 90; +dm(5) -> 120; dm(6) -> 151; dm(7) -> 181; dm(8) -> 212; +dm(9) -> 243; dm(10) -> 273; dm(11) -> 304; dm(12) -> 334. + +df(_, Month) when Month < 3 -> 0; +df(Year, _) -> + case is_leap_year(Year) of + true -> 1; + false -> 0 + end. + + + +%% calendar:gregorian_seconds_to_datetime/1 + +gregorian_seconds_to_datetime(Secs) when Secs >= 0 -> + Days = Secs div ?SECONDS_PER_DAY, + Rest = Secs rem ?SECONDS_PER_DAY, + {gregorian_days_to_date(Days), seconds_to_time(Rest)}. + +seconds_to_time(Secs0) when Secs0 >= 0, Secs0 < ?SECONDS_PER_DAY -> + Hour = Secs0 div ?SECONDS_PER_HOUR, + Secs1 = Secs0 rem ?SECONDS_PER_HOUR, + Minute = Secs1 div ?SECONDS_PER_MINUTE, + Second = Secs1 rem ?SECONDS_PER_MINUTE, + {Hour, Minute, Second}. + +gregorian_days_to_date(Days) -> + {Year, DayOfYear} = day_to_year(Days), + {Month, DayOfMonth} = year_day_to_date(Year, DayOfYear), + {Year, Month, DayOfMonth}. + +day_to_year(DayOfEpoch) when DayOfEpoch >= 0 -> + Y0 = DayOfEpoch div ?DAYS_PER_YEAR, + {Y1, D1} = dty(Y0, DayOfEpoch, dy(Y0)), + {Y1, DayOfEpoch - D1}. + +dty(Y, D1, D2) when D1 < D2 -> dty(Y-1, D1, dy(Y-1)); +dty(Y, _D1, D2) -> {Y, D2}. + +dy(Y) when Y =< 0 -> 0; +dy(Y) -> + X = Y - 1, + (X div 4) - (X div 100) + (X div 400) + X*?DAYS_PER_YEAR + ?DAYS_PER_LEAP_YEAR. + +year_day_to_date(Year, DayOfYear) -> + ExtraDay = case is_leap_year(Year) of + true -> 1; + false -> 0 + end, + {Month, Day} = year_day_to_date2(ExtraDay, DayOfYear), + {Month, Day + 1}. + +year_day_to_date2(_, Day) when Day < 31 -> {1, Day}; +year_day_to_date2(E, Day) when 31 =< Day, Day < 59 + E -> {2, Day - 31}; +year_day_to_date2(E, Day) when 59 + E =< Day, Day < 90 + E -> { 3, Day - ( 59 + E)}; +year_day_to_date2(E, Day) when 90 + E =< Day, Day < 120 + E -> { 4, Day - ( 90 + E)}; +year_day_to_date2(E, Day) when 120 + E =< Day, Day < 151 + E -> { 5, Day - (120 + E)}; +year_day_to_date2(E, Day) when 151 + E =< Day, Day < 181 + E -> { 6, Day - (151 + E)}; +year_day_to_date2(E, Day) when 181 + E =< Day, Day < 212 + E -> { 7, Day - (181 + E)}; +year_day_to_date2(E, Day) when 212 + E =< Day, Day < 243 + E -> { 8, Day - (212 + E)}; +year_day_to_date2(E, Day) when 243 + E =< Day, Day < 273 + E -> { 9, Day - (243 + E)}; +year_day_to_date2(E, Day) when 273 + E =< Day, Day < 304 + E -> {10, Day - (273 + E)}; +year_day_to_date2(E, Day) when 304 + E =< Day, Day < 334 + E -> {11, Day - (304 + E)}; +year_day_to_date2(E, Day) when 334 + E =< Day -> {12, Day - (334 + E)}. + +is_leap_year(Y) when is_integer(Y), Y >= 0 -> is_leap_year1(Y). +is_leap_year1(Year) when Year rem 4 =:= 0, Year rem 100 > 0 -> true; +is_leap_year1(Year) when Year rem 400 =:= 0 -> true; +is_leap_year1(_) -> false. + + -- cgit v1.2.3 From 7be5712096a0fdf44e2b31d493f03688d4c137e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Mon, 27 Jun 2011 16:06:53 +0200 Subject: Do not use calendar module in preloaded Bad practice --- erts/preloaded/src/prim_zip.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_zip.erl b/erts/preloaded/src/prim_zip.erl index 392a9feb45..d29f17ae56 100644 --- a/erts/preloaded/src/prim_zip.erl +++ b/erts/preloaded/src/prim_zip.erl @@ -432,7 +432,7 @@ binary_io({file_info, B}, _) -> is_binary(B) -> {regular, byte_size(B)}; B =:= directory -> {directory, 0} end, - Now = calendar:local_time(), + Now = erlang:localtime(), #file_info{size = Size, type = Type, access = read_write, atime = Now, mtime = Now, ctime = Now, mode = 0, links = 1, major_device = 0, -- cgit v1.2.3 From 4545abc3bc54ac9be175a53f19ed62fcd3911794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Wed, 30 Nov 2011 18:11:42 +0100 Subject: Fix prim_file time conversions --- erts/preloaded/src/prim_file.erl | 58 +++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 22 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 69ef0b9d54..b781dffba5 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -51,7 +51,7 @@ make_link/2, make_link/3, make_symlink/2, make_symlink/3, read_link/1, read_link/2, - read_link_info/1, read_link_info/2, + read_link_info/1, read_link_info/2, read_link_info/3, list_dir/1, list_dir/2]). %% How to start and stop the ?DRV port. -export([start/0, stop/1]). @@ -725,16 +725,18 @@ del_dir_int(Port, Dir) -> -%% read_file_info/{1,2} +%% read_file_info/{1,2,3} read_file_info(File) -> read_file_info_int({?DRV, [binary]}, File, local). read_file_info(Port, File) when is_port(Port) -> - read_file_info_int(Port, File, local). + read_file_info_int(Port, File, local); +read_file_info(File, Opts) -> + read_file_info_int({?DRV, [binary]}, File, plgv(time, Opts, local)). read_file_info(Port, File, Opts) when is_port(Port) -> - read_file_info_int(Port, File, plgv(time, Opts)). + read_file_info_int(Port, File, plgv(time, Opts, local)). read_file_info_int(Port, File, TimeType) -> case drv_command(Port, [?FILE_FSTAT, pathname(File)]) of @@ -765,12 +767,11 @@ write_file_info(File, Info) -> write_file_info(Port, File, Info) when is_port(Port) -> write_file_info_int(Port, File, Info, local); - write_file_info(File, Info, Opts) -> - write_file_info_int({?DRV, [binary]}, File, Info, plgv(time, Opts)). + write_file_info_int({?DRV, [binary]}, File, Info, plgv(time, Opts, local)). write_file_info(Port, File, Info, Opts) when is_port(Port) -> - write_file_info_int(Port, File, Info, plgv(time, Opts)). + write_file_info_int(Port, File, Info, plgv(time, Opts, local)). write_file_info_int(Port, File, @@ -783,9 +784,13 @@ write_file_info_int(Port, TimeType) -> %% FIXME: wtf + %% sätt atime beroende på timetype, om ej satt + %% sätt mtime som atime, om ej satt + {Atime, Mtime} = case {Atime0, Mtime0} of {undefined, Mtime0} -> {erlang:localtime(), Mtime0}; {Atime0, undefined} -> {Atime0, Atime0}; + {undefined, undefined} -> {erlang:localtime(), erlang:localtime()}; Complete -> Complete end, @@ -848,10 +853,10 @@ read_link_info(Port, Link) when is_port(Port) -> read_link_info_int(Port, Link, local); read_link_info(Link, Opts) -> - read_link_info_int({?DRV, [binary]}, Link, plgv(time, Opts)). + read_link_info_int({?DRV, [binary]}, Link, plgv(time, Opts, local)). read_link_info(Port, Link, Opts) when is_port(Port) -> - read_link_info_int(Port, Link, plgv(time, Opts)). + read_link_info_int(Port, Link, plgv(time, Opts, local)). read_link_info_int(Port, Link, TimeType) -> @@ -1161,7 +1166,6 @@ translate_response(?FILE_RESP_ALL_DATA, Data) -> translate_response(X, Data) -> {error, {bad_response_from_port, [X | Data]}}. - transform_info([ Hsize1, Hsize2, Hsize3, Hsize4, Lsize1, Lsize2, Lsize3, Lsize4, @@ -1211,9 +1215,7 @@ int_to_int32bytes(undefined) -> <<-1:32>>. int_to_int64bytes(Int) when is_integer(Int) -> - <>; -int_to_int64bytes(undefined) -> - <<-1:64>>. + <>. sint64(I1,I2,I3,I4,I5,I6,I7,I8) when I1 > 127 -> @@ -1315,10 +1317,10 @@ pathname(File) -> (catch prim_file:internal_name2native(File)). -%% proplist:get_value/2 -plgv(K,[{K, V}|_]) -> V; -plgv(K,[_|KVs]) -> plgv(K,KVs); -plgv(_,[]) -> undefined. +%% proplist:get_value/3 +plgv(K, [{K, V}|_], _) -> V; +plgv(K, [_|KVs], D) -> plgv(K, KVs, D); +plgv(_, [], D) -> D. %% @@ -1333,16 +1335,28 @@ plgv(_,[]) -> undefined. -define(DAYS_PER_YEAR, 365). -define(DAYS_PER_LEAP_YEAR, 366). +from_seconds(Seconds, epoch) when is_integer(Seconds) -> + Seconds; from_seconds(Seconds, utc) when is_integer(Seconds) -> - gregorian_seconds_to_datetime(Seconds + ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970); + epoch_to_datetime(Seconds); from_seconds(Seconds, local) when is_integer(Seconds) -> - erlang:universaltime_to_localtime(gregorian_seconds_to_datetime(Seconds + ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970)). + erlang:universaltime_to_localtime(epoch_to_datetime(Seconds)). +epoch_to_datetime(Seconds) -> + gregorian_seconds_to_datetime(Seconds + ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970). + +to_seconds(Seconds, epoch) when is_integer(Seconds) -> + Seconds; to_seconds({_,_} = Datetime, utc) -> - datetime_to_gregorian_seconds(Datetime) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970; + datetime_to_epoch(Datetime); to_seconds({_,_} = Datetime, local) -> - datetime_to_gregorian_seconds(erlang:localtime_to_universaltime(Datetime)) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970; -to_seconds(undefined, _) -> to_seconds(erlang:universaltime(), utc). + datetime_to_epoch(erlang:localtime_to_universaltime(Datetime)); +to_seconds(undefined, _) -> + to_seconds(erlang:universaltime(), utc). + +datetime_to_epoch(Datetime) -> + datetime_to_gregorian_seconds(Datetime) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970. + %% perhaps like this -- cgit v1.2.3 From 2a1f035f777b5caef0c47dfd863675ef51296c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Wed, 30 Nov 2011 18:41:15 +0100 Subject: Fix validate structure in file_info --- erts/preloaded/src/prim_file.erl | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index b781dffba5..a301abb667 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -773,8 +773,7 @@ write_file_info(File, Info, Opts) -> write_file_info(Port, File, Info, Opts) when is_port(Port) -> write_file_info_int(Port, File, Info, plgv(time, Opts, local)). -write_file_info_int(Port, - File, +write_file_info_int(Port, File, #file_info{mode=Mode, uid=Uid, gid=Gid, @@ -783,16 +782,12 @@ write_file_info_int(Port, ctime=Ctime}, TimeType) -> - %% FIXME: wtf - %% sätt atime beroende på timetype, om ej satt - %% sätt mtime som atime, om ej satt + % Atime and/or Mtime might be undefined + % - use localtime() for atime, if atime is undefined + % - use atime as mtime if mtime is undefined - {Atime, Mtime} = case {Atime0, Mtime0} of - {undefined, Mtime0} -> {erlang:localtime(), Mtime0}; - {Atime0, undefined} -> {Atime0, Atime0}; - {undefined, undefined} -> {erlang:localtime(), erlang:localtime()}; - Complete -> Complete - end, + Atime = file_info_validate_atime(Atime0, TimeType), + Mtime = file_info_validate_mtime(Mtime0, Atime), drv_command(Port, [?FILE_WRITE_INFO, int_to_int32bytes(Mode), @@ -804,6 +799,13 @@ write_file_info_int(Port, pathname(File)]). +file_info_validate_atime(Atime, _) when Atime =/= undefined -> Atime; +file_info_validate_atime(undefined, local) -> erlang:localtime(); +file_info_validate_atime(undefined, utc) -> erlang:universaltime(); +file_info_validate_atime(undefined, epoch) -> datetime_to_epoch(erlang:universaltime()). + +file_info_validate_mtime(undefined, Atime) -> Atime; +file_info_validate_mtime(Mtime, _) -> Mtime. %% make_link/{2,3} -- cgit v1.2.3 From 73b4ed6d1141e760fcc108e45d3d66ca110f1018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Wed, 30 Nov 2011 19:12:45 +0100 Subject: Silence warnings in prim_file --- erts/preloaded/src/prim_file.erl | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index a301abb667..87fdb3fb8f 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -1360,17 +1360,17 @@ datetime_to_epoch(Datetime) -> datetime_to_gregorian_seconds(Datetime) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970. -%% perhaps like this - -posix_time(Time) -> - EpochStart = {{1970,1,1},{0,0,0}}, - {Days,{Hour,Min,Sec}} = calendar:time_difference(EpochStart, Time), - 86400*Days + 3600*Hour + 60*Min + Sec. - -posix_to_erlang_time(Sec) -> - OneMillion = 1000000, - Time = calendar:now_to_datetime({Sec div OneMillion, Sec rem OneMillion, 0}), - erlang:universaltime_to_localtime(Time). +%% erl_tar uses this convention (investigate) +%% +%% posix_time(Time) -> +%% EpochStart = {{1970,1,1},{0,0,0}}, +%% {Days,{Hour,Min,Sec}} = calendar:time_difference(EpochStart, Time), +%% 86400*Days + 3600*Hour + 60*Min + Sec. +%% +%% posix_to_erlang_time(Sec) -> +%% OneMillion = 1000000, +%% Time = calendar:now_to_datetime({Sec div OneMillion, Sec rem OneMillion, 0}), +%% erlang:universaltime_to_localtime(Time). % from calendar, slightly modified -- cgit v1.2.3 From abaefc0452f5b40841562da0f215e7d1ac371f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Fri, 2 Dec 2011 20:05:08 +0100 Subject: Let prim_file validate ctime in file_info --- erts/preloaded/src/prim_file.erl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 87fdb3fb8f..507ac9c360 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -779,15 +779,17 @@ write_file_info_int(Port, File, gid=Gid, atime=Atime0, mtime=Mtime0, - ctime=Ctime}, + ctime=Ctime0}, TimeType) -> % Atime and/or Mtime might be undefined % - use localtime() for atime, if atime is undefined % - use atime as mtime if mtime is undefined + % - use mtime as ctime if ctime is undefined Atime = file_info_validate_atime(Atime0, TimeType), Mtime = file_info_validate_mtime(Mtime0, Atime), + Ctime = file_info_validate_ctime(Ctime0, Mtime), drv_command(Port, [?FILE_WRITE_INFO, int_to_int32bytes(Mode), @@ -807,6 +809,9 @@ file_info_validate_atime(undefined, epoch) -> datetime_to_epoch(erlang:universal file_info_validate_mtime(undefined, Atime) -> Atime; file_info_validate_mtime(Mtime, _) -> Mtime. +file_info_validate_ctime(undefined, Mtime) -> Mtime; +file_info_validate_ctime(Ctime, _) -> Ctime. + %% make_link/{2,3} make_link(Old, New) -> -- cgit v1.2.3 From 58c4c46694982b59dc52d0443c426009c0910e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Tue, 6 Dec 2011 20:12:30 +0100 Subject: Catch errors from prim_file:*_file_info We do not want to crash the file server. --- erts/preloaded/src/prim_file.erl | 213 ++++++++------------------------------- 1 file changed, 43 insertions(+), 170 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 507ac9c360..2567388a6a 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -739,13 +739,17 @@ read_file_info(Port, File, Opts) when is_port(Port) -> read_file_info_int(Port, File, plgv(time, Opts, local)). read_file_info_int(Port, File, TimeType) -> - case drv_command(Port, [?FILE_FSTAT, pathname(File)]) of - {ok, FI} -> {ok, FI#file_info{ - ctime = from_seconds(FI#file_info.ctime, TimeType), - mtime = from_seconds(FI#file_info.mtime, TimeType), - atime = from_seconds(FI#file_info.atime, TimeType) - }}; - Error -> Error + try + case drv_command(Port, [?FILE_FSTAT, pathname(File)]) of + {ok, FI} -> {ok, FI#file_info{ + ctime = from_seconds(FI#file_info.ctime, TimeType), + mtime = from_seconds(FI#file_info.mtime, TimeType), + atime = from_seconds(FI#file_info.atime, TimeType) + }}; + Error -> Error + end + catch + error:_ -> {error, badarg} end. @@ -787,24 +791,28 @@ write_file_info_int(Port, File, % - use atime as mtime if mtime is undefined % - use mtime as ctime if ctime is undefined - Atime = file_info_validate_atime(Atime0, TimeType), - Mtime = file_info_validate_mtime(Mtime0, Atime), - Ctime = file_info_validate_ctime(Ctime0, Mtime), - - drv_command(Port, [?FILE_WRITE_INFO, - int_to_int32bytes(Mode), - int_to_int32bytes(Uid), - int_to_int32bytes(Gid), - int_to_int64bytes(to_seconds(Atime, TimeType)), - int_to_int64bytes(to_seconds(Mtime, TimeType)), - int_to_int64bytes(to_seconds(Ctime, TimeType)), - pathname(File)]). + try + Atime = file_info_validate_atime(Atime0, TimeType), + Mtime = file_info_validate_mtime(Mtime0, Atime), + Ctime = file_info_validate_ctime(Ctime0, Mtime), + + drv_command(Port, [?FILE_WRITE_INFO, + int_to_int32bytes(Mode), + int_to_int32bytes(Uid), + int_to_int32bytes(Gid), + int_to_int64bytes(to_seconds(Atime, TimeType)), + int_to_int64bytes(to_seconds(Mtime, TimeType)), + int_to_int64bytes(to_seconds(Ctime, TimeType)), + pathname(File)]) + catch + error:_ -> {error, badarg} + end. file_info_validate_atime(Atime, _) when Atime =/= undefined -> Atime; file_info_validate_atime(undefined, local) -> erlang:localtime(); file_info_validate_atime(undefined, utc) -> erlang:universaltime(); -file_info_validate_atime(undefined, epoch) -> datetime_to_epoch(erlang:universaltime()). +file_info_validate_atime(undefined, epoch) -> erlang:universaltime_to_seconds((erlang:universaltime())). file_info_validate_mtime(undefined, Atime) -> Atime; file_info_validate_mtime(Mtime, _) -> Mtime. @@ -867,13 +875,17 @@ read_link_info(Port, Link, Opts) when is_port(Port) -> read_link_info_int(Port, Link, TimeType) -> - case drv_command(Port, [?FILE_LSTAT, pathname(Link)]) of - {ok, FI} -> {ok, FI#file_info{ - ctime = from_seconds(FI#file_info.ctime, TimeType), - mtime = from_seconds(FI#file_info.mtime, TimeType), - atime = from_seconds(FI#file_info.atime, TimeType) - }}; - Error -> Error + try + case drv_command(Port, [?FILE_LSTAT, pathname(Link)]) of + {ok, FI} -> {ok, FI#file_info{ + ctime = from_seconds(FI#file_info.ctime, TimeType), + mtime = from_seconds(FI#file_info.mtime, TimeType), + atime = from_seconds(FI#file_info.atime, TimeType) + }}; + Error -> Error + end + catch + error:_ -> {error, badarg} end. %% list_dir/{1,2} @@ -1329,160 +1341,21 @@ plgv(K, [{K, V}|_], _) -> V; plgv(K, [_|KVs], D) -> plgv(K, KVs, D); plgv(_, [], D) -> D. - %% %% We don't actually want this here %% We want to use epochs in all prim but erl_prim_loader makes that tricky %% It is probably needed to redo the whole erl_prim_loader --define(DAYS_FROM_0_TO_1970, 719528). --define(SECONDS_PER_DAY, 86400). --define(SECONDS_PER_HOUR, 3600). --define(SECONDS_PER_MINUTE, 60). --define(DAYS_PER_YEAR, 365). --define(DAYS_PER_LEAP_YEAR, 366). - from_seconds(Seconds, epoch) when is_integer(Seconds) -> Seconds; from_seconds(Seconds, utc) when is_integer(Seconds) -> - epoch_to_datetime(Seconds); + erlang:seconds_to_universaltime(Seconds); from_seconds(Seconds, local) when is_integer(Seconds) -> - erlang:universaltime_to_localtime(epoch_to_datetime(Seconds)). - -epoch_to_datetime(Seconds) -> - gregorian_seconds_to_datetime(Seconds + ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970). + erlang:universaltime_to_localtime(erlang:seconds_to_universaltime(Seconds)). to_seconds(Seconds, epoch) when is_integer(Seconds) -> Seconds; to_seconds({_,_} = Datetime, utc) -> - datetime_to_epoch(Datetime); + erlang:universaltime_to_seconds(Datetime); to_seconds({_,_} = Datetime, local) -> - datetime_to_epoch(erlang:localtime_to_universaltime(Datetime)); -to_seconds(undefined, _) -> - to_seconds(erlang:universaltime(), utc). - -datetime_to_epoch(Datetime) -> - datetime_to_gregorian_seconds(Datetime) - ?SECONDS_PER_DAY * ?DAYS_FROM_0_TO_1970. - - -%% erl_tar uses this convention (investigate) -%% -%% posix_time(Time) -> -%% EpochStart = {{1970,1,1},{0,0,0}}, -%% {Days,{Hour,Min,Sec}} = calendar:time_difference(EpochStart, Time), -%% 86400*Days + 3600*Hour + 60*Min + Sec. -%% -%% posix_to_erlang_time(Sec) -> -%% OneMillion = 1000000, -%% Time = calendar:now_to_datetime({Sec div OneMillion, Sec rem OneMillion, 0}), -%% erlang:universaltime_to_localtime(Time). - - -% from calendar, slightly modified - -%% calendar:datetime_to_gregorian_seconds/1 - -datetime_to_gregorian_seconds({Date, Time}) -> - ?SECONDS_PER_DAY*date_to_gregorian_days(Date) + time_to_seconds(Time). - - -time_to_seconds({H, M, S}) when is_integer(H), is_integer(M), is_integer(S) -> - H * ?SECONDS_PER_HOUR + M * ?SECONDS_PER_MINUTE + S. - -date_to_gregorian_days({Year, Month, Day}) -> - date_to_gregorian_days(Year, Month, Day). - -date_to_gregorian_days(Year, Month, Day) when is_integer(Day), Day > 0 -> - Last = last_day_of_the_month(Year, Month), - if - Day =< Last -> - dy(Year) + dm(Month) + df(Year, Month) + Day - 1 - end. - -last_day_of_the_month(Y, M) when is_integer(Y), Y >= 0 -> - last_day_of_the_month1(Y, M). - -last_day_of_the_month1(_, 4) -> 30; -last_day_of_the_month1(_, 6) -> 30; -last_day_of_the_month1(_, 9) -> 30; -last_day_of_the_month1(_,11) -> 30; -last_day_of_the_month1(Y, 2) -> - case is_leap_year(Y) of - true -> 29; - _ -> 28 - end; -last_day_of_the_month1(_, M) when is_integer(M), M > 0, M < 13 -> - 31. - -dm(1) -> 0; dm(2) -> 31; dm(3) -> 59; dm(4) -> 90; -dm(5) -> 120; dm(6) -> 151; dm(7) -> 181; dm(8) -> 212; -dm(9) -> 243; dm(10) -> 273; dm(11) -> 304; dm(12) -> 334. - -df(_, Month) when Month < 3 -> 0; -df(Year, _) -> - case is_leap_year(Year) of - true -> 1; - false -> 0 - end. - - - -%% calendar:gregorian_seconds_to_datetime/1 - -gregorian_seconds_to_datetime(Secs) when Secs >= 0 -> - Days = Secs div ?SECONDS_PER_DAY, - Rest = Secs rem ?SECONDS_PER_DAY, - {gregorian_days_to_date(Days), seconds_to_time(Rest)}. - -seconds_to_time(Secs0) when Secs0 >= 0, Secs0 < ?SECONDS_PER_DAY -> - Hour = Secs0 div ?SECONDS_PER_HOUR, - Secs1 = Secs0 rem ?SECONDS_PER_HOUR, - Minute = Secs1 div ?SECONDS_PER_MINUTE, - Second = Secs1 rem ?SECONDS_PER_MINUTE, - {Hour, Minute, Second}. - -gregorian_days_to_date(Days) -> - {Year, DayOfYear} = day_to_year(Days), - {Month, DayOfMonth} = year_day_to_date(Year, DayOfYear), - {Year, Month, DayOfMonth}. - -day_to_year(DayOfEpoch) when DayOfEpoch >= 0 -> - Y0 = DayOfEpoch div ?DAYS_PER_YEAR, - {Y1, D1} = dty(Y0, DayOfEpoch, dy(Y0)), - {Y1, DayOfEpoch - D1}. - -dty(Y, D1, D2) when D1 < D2 -> dty(Y-1, D1, dy(Y-1)); -dty(Y, _D1, D2) -> {Y, D2}. - -dy(Y) when Y =< 0 -> 0; -dy(Y) -> - X = Y - 1, - (X div 4) - (X div 100) + (X div 400) + X*?DAYS_PER_YEAR + ?DAYS_PER_LEAP_YEAR. - -year_day_to_date(Year, DayOfYear) -> - ExtraDay = case is_leap_year(Year) of - true -> 1; - false -> 0 - end, - {Month, Day} = year_day_to_date2(ExtraDay, DayOfYear), - {Month, Day + 1}. - -year_day_to_date2(_, Day) when Day < 31 -> {1, Day}; -year_day_to_date2(E, Day) when 31 =< Day, Day < 59 + E -> {2, Day - 31}; -year_day_to_date2(E, Day) when 59 + E =< Day, Day < 90 + E -> { 3, Day - ( 59 + E)}; -year_day_to_date2(E, Day) when 90 + E =< Day, Day < 120 + E -> { 4, Day - ( 90 + E)}; -year_day_to_date2(E, Day) when 120 + E =< Day, Day < 151 + E -> { 5, Day - (120 + E)}; -year_day_to_date2(E, Day) when 151 + E =< Day, Day < 181 + E -> { 6, Day - (151 + E)}; -year_day_to_date2(E, Day) when 181 + E =< Day, Day < 212 + E -> { 7, Day - (181 + E)}; -year_day_to_date2(E, Day) when 212 + E =< Day, Day < 243 + E -> { 8, Day - (212 + E)}; -year_day_to_date2(E, Day) when 243 + E =< Day, Day < 273 + E -> { 9, Day - (243 + E)}; -year_day_to_date2(E, Day) when 273 + E =< Day, Day < 304 + E -> {10, Day - (273 + E)}; -year_day_to_date2(E, Day) when 304 + E =< Day, Day < 334 + E -> {11, Day - (304 + E)}; -year_day_to_date2(E, Day) when 334 + E =< Day -> {12, Day - (334 + E)}. - -is_leap_year(Y) when is_integer(Y), Y >= 0 -> is_leap_year1(Y). -is_leap_year1(Year) when Year rem 4 =:= 0, Year rem 100 > 0 -> true; -is_leap_year1(Year) when Year rem 400 =:= 0 -> true; -is_leap_year1(_) -> false. - - + erlang:universaltime_to_seconds(erlang:localtime_to_universaltime(Datetime)). -- cgit v1.2.3 From a37f854be3aaee3786d555a28bb4c8d53384a852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Wed, 7 Dec 2011 15:53:21 +0100 Subject: Change options to prim_file:*_file_info/* * 'utc' changed to 'universal' * 'epoch' changed to 'posix' This change conforms to other naming already in OTP, e.g. erlang:universaltime_to_localtime/1. --- erts/preloaded/src/prim_file.erl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index 2567388a6a..e5cb1d5c03 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -810,9 +810,9 @@ write_file_info_int(Port, File, file_info_validate_atime(Atime, _) when Atime =/= undefined -> Atime; -file_info_validate_atime(undefined, local) -> erlang:localtime(); -file_info_validate_atime(undefined, utc) -> erlang:universaltime(); -file_info_validate_atime(undefined, epoch) -> erlang:universaltime_to_seconds((erlang:universaltime())). +file_info_validate_atime(undefined, local) -> erlang:localtime(); +file_info_validate_atime(undefined, universal) -> erlang:universaltime(); +file_info_validate_atime(undefined, posix) -> erlang:universaltime_to_seconds((erlang:universaltime())). file_info_validate_mtime(undefined, Atime) -> Atime; file_info_validate_mtime(Mtime, _) -> Mtime. @@ -1343,19 +1343,19 @@ plgv(_, [], D) -> D. %% %% We don't actually want this here -%% We want to use epochs in all prim but erl_prim_loader makes that tricky +%% We want to use posix time in all prim but erl_prim_loader makes that tricky %% It is probably needed to redo the whole erl_prim_loader -from_seconds(Seconds, epoch) when is_integer(Seconds) -> +from_seconds(Seconds, posix) when is_integer(Seconds) -> Seconds; -from_seconds(Seconds, utc) when is_integer(Seconds) -> +from_seconds(Seconds, universal) when is_integer(Seconds) -> erlang:seconds_to_universaltime(Seconds); from_seconds(Seconds, local) when is_integer(Seconds) -> erlang:universaltime_to_localtime(erlang:seconds_to_universaltime(Seconds)). -to_seconds(Seconds, epoch) when is_integer(Seconds) -> +to_seconds(Seconds, posix) when is_integer(Seconds) -> Seconds; -to_seconds({_,_} = Datetime, utc) -> +to_seconds({_,_} = Datetime, universal) -> erlang:universaltime_to_seconds(Datetime); to_seconds({_,_} = Datetime, local) -> erlang:universaltime_to_seconds(erlang:localtime_to_universaltime(Datetime)). -- cgit v1.2.3 From 9baa361811a4dd936e73136ea20320423980604b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Wed, 7 Dec 2011 16:08:55 +0100 Subject: Change name of bif universaltime_to_seconds/1 * erlang:universaltime_to_seconds/1 changed to erlang:universaltime_to_posixtime/1 * erlang:seconds_to_universaltime/1 changed to erlang:posixtime_to_universaltime/1 Let prim_file.erl reflect these changes. --- erts/preloaded/src/prim_file.erl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl index e5cb1d5c03..36cbe329e8 100644 --- a/erts/preloaded/src/prim_file.erl +++ b/erts/preloaded/src/prim_file.erl @@ -812,7 +812,7 @@ write_file_info_int(Port, File, file_info_validate_atime(Atime, _) when Atime =/= undefined -> Atime; file_info_validate_atime(undefined, local) -> erlang:localtime(); file_info_validate_atime(undefined, universal) -> erlang:universaltime(); -file_info_validate_atime(undefined, posix) -> erlang:universaltime_to_seconds((erlang:universaltime())). +file_info_validate_atime(undefined, posix) -> erlang:universaltime_to_posixtime(erlang:universaltime()). file_info_validate_mtime(undefined, Atime) -> Atime; file_info_validate_mtime(Mtime, _) -> Mtime. @@ -1349,13 +1349,13 @@ plgv(_, [], D) -> D. from_seconds(Seconds, posix) when is_integer(Seconds) -> Seconds; from_seconds(Seconds, universal) when is_integer(Seconds) -> - erlang:seconds_to_universaltime(Seconds); + erlang:posixtime_to_universaltime(Seconds); from_seconds(Seconds, local) when is_integer(Seconds) -> - erlang:universaltime_to_localtime(erlang:seconds_to_universaltime(Seconds)). + erlang:universaltime_to_localtime(erlang:posixtime_to_universaltime(Seconds)). to_seconds(Seconds, posix) when is_integer(Seconds) -> Seconds; to_seconds({_,_} = Datetime, universal) -> - erlang:universaltime_to_seconds(Datetime); + erlang:universaltime_to_posixtime(Datetime); to_seconds({_,_} = Datetime, local) -> - erlang:universaltime_to_seconds(erlang:localtime_to_universaltime(Datetime)). + erlang:universaltime_to_posixtime(erlang:localtime_to_universaltime(Datetime)). -- cgit v1.2.3 From 474be24e335b03d64eb389993e110f07fe0d3f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= Date: Thu, 8 Dec 2011 14:27:05 +0100 Subject: Update prim_file.beam and prim_zip.beam --- erts/preloaded/ebin/prim_file.beam | Bin 34780 -> 37716 bytes erts/preloaded/ebin/prim_zip.beam | Bin 22532 -> 22436 bytes 2 files changed, 0 insertions(+), 0 deletions(-) (limited to 'erts/preloaded') diff --git a/erts/preloaded/ebin/prim_file.beam b/erts/preloaded/ebin/prim_file.beam index ad1d7031a3..bc5631f3dd 100644 Binary files a/erts/preloaded/ebin/prim_file.beam and b/erts/preloaded/ebin/prim_file.beam differ diff --git a/erts/preloaded/ebin/prim_zip.beam b/erts/preloaded/ebin/prim_zip.beam index 7e1a5d1fdb..b6c49d5c0c 100644 Binary files a/erts/preloaded/ebin/prim_zip.beam and b/erts/preloaded/ebin/prim_zip.beam differ -- cgit v1.2.3