@@ -260,11 +260,62 @@ static void cfs_rc4_init(void)
260260 }
261261}
262262
263+ /*
264+ * For a file name like 'path/to/16384/16401[.123]' return part1 = 16384, part2 = 16401 and part3 = 123.
265+ * Returns 0 on success and negative value on error.
266+ */
267+ static int extract_fname_parts (const char * fname ,unsignedint * part1 ,unsignedint * part2 ,unsignedint * part3 )
268+ {
269+ int idx = strlen (fname );
270+ if (idx == 0 )
271+ return -1 ;
272+ idx -- ;
273+
274+ while (idx >=0 && isdigit (fname [idx ]))
275+ idx -- ;
276+
277+ if (idx == 0 )
278+ return -2 ;
279+
280+ if (fname [idx ]!= '.' )
281+ {
282+ * part3 = 0 ;
283+ gotoassign_part2 ;
284+ }
285+
286+ * part3 = atoi (& fname [idx + 1 ]);
287+
288+ idx -- ;
289+ while (idx >=0 && isdigit (fname [idx ]))
290+ idx -- ;
291+
292+ if (idx == 0 )
293+ return -3 ;
294+
295+ assign_part2 :
296+ * part2 = atoi (& fname [idx + 1 ]);
297+
298+ idx -- ;
299+ while (idx >=0 && isdigit (fname [idx ]))
300+ idx -- ;
301+
302+ if (idx == 0 )
303+ return -4 ;
304+
305+ * part1 = atoi (& fname [idx + 1 ]);
306+ return 0 ;
307+ }
308+
263309void cfs_encrypt (const char * fname ,void * block ,uint32 offs ,uint32 size )
264310{
265311if (cfs_encryption )
266312{
267- elog (LOG ,"cfs_encrypt, fname = %s, offs = %d, size = %d" ,fname ,offs ,size );
313+ unsignedint fname_part1 ,fname_part2 ,fname_part3 ;
314+ if (extract_fname_parts (fname ,& fname_part1 ,& fname_part2 ,& fname_part3 )< 0 )
315+ fname_part1 = fname_part2 = fname_part3 = 0 ;
316+
317+ elog (LOG ,"cfs_encrypt, fname = %s, part1 = %d, part2 = %d, part3 = %d, offs = %d, size = %d" ,
318+ fname ,fname_part1 ,fname_part2 ,fname_part3 ,offs ,size );
268319cfs_rc4_encrypt_block (block ,offs ,size );
269320}
270321}
@@ -273,7 +324,12 @@ void cfs_decrypt(const char* fname, void* block, uint32 offs, uint32 size)
273324{
274325if (cfs_encryption )
275326{
276- elog (LOG ,"cfs_decrypt, fname = %s, offs = %d, size = %d" ,fname ,offs ,size );
327+ unsignedint fname_part1 ,fname_part2 ,fname_part3 ;
328+ if (extract_fname_parts (fname ,& fname_part1 ,& fname_part2 ,& fname_part3 )< 0 )
329+ fname_part1 = fname_part2 = fname_part3 = 0 ;
330+
331+ elog (LOG ,"cfs_decrypt, fname = %s, part1 = %d, part2 = %d, part3 = %d, offs = %d, size = %d" ,
332+ fname ,fname_part1 ,fname_part2 ,fname_part3 ,offs ,size );
277333cfs_rc4_encrypt_block (block ,offs ,size );
278334}
279335}