PhysicsFS or (PhysFS for short) can be found at: http://icculus.org/physfs/
I now use this in the cgame for read/write of most of my text-format files. As well as for the game monkey script reading.
I also have it on the server side as well for Shrubbot, my weapon config, the holocron point files, bot waypoint files, banlist, as well as others but just to name a few.
If you look on the websvn you will also notice i posted a patch for 0-length file opening. :P
I use this instead of the regular trap calls because theoretically you can get around some things that you are not supposed to be able to. Plus this allows for non-allowed extensions in pure servers (though most people don't use pure in JKA because of skins, models, sabers, etc)
Also, it is completely virtual like the quake 3 engine is. How it works basically is you call init to the directory where jamp is. Mount fs_game directory and base. Change the zip extension to pk3 and then you can mount all pk3s and read files from pk3s as well. Note: you are only able to have 1 write directory so you would want to set that to fs_game, also if fs_game is "" you will want to forward it to base and not do both checks.
The way I have mine set up is, an extra read cmd that asks for an enum of:
MODPATH_BASE or MODPATH_FS_GAME if it gets MODPATH_BASE it looks in base/ if it gets MODPATH_FS_GAME it looks in fs_game/ fs_game being whatever that cvar is.
You can also chain it if say you are loading a map to check if it exists, check in base and if that fails, try fs_game, and if that fails then fail completely. I'm actually using C++ to do my internal functions in (c)g_physfs.cpp.
Basically I have:
A cvar retrieve function that returns the buffer of the string in a std::string format.
And, I use new and delete for char buffers for the game monkey portion, otherwise i just use my CG_Alloc / G_Alloc and CG_Free / G_Free.