--- os.ml.orig 2013-10-24 12:41:54.000000000 +0200 +++ os.ml 2013-10-24 13:27:27.000000000 +0200 @@ -322,18 +322,32 @@ let s = if i=0 then suffix else Printf.sprintf "..%03d.%s" i suffix in + + (* Do not use longer temp-file names than the file system permits. + * eCryptfs has the lowest file name length limit I know of: 143 bytes. + *) + + + let tempPath = match Path.deconstructRev path with None -> assert false | Some (name, parentPath) -> let name = Name.toString name in - let len = String.length name in - let maxlen = 64 in + let nameLen = String.length name in + let maxFileNameLength = 143 in (* eCryptfs limit *) + let prefixLen = String.length prefix in + let suffixLen = String.length s in + let maxLen = maxFileNameLength - prefixLen - suffixLen in + let name = - if len <= maxlen then name else - (truncate_filename name maxlen ^ - Digest.to_hex (Digest.string name)) + if nameLen <= maxLen then name else + let nameDigest = Digest.to_hex (Digest.string name) in + let nameDigestLen = String.length nameDigest in + let maxLen = maxLen - nameDigestLen in + assert(maxLen>0); + (truncate_filename name maxLen ^ nameDigest) in Path.child parentPath (Name.fromString (prefix ^ name ^ s)) in