========== BOTH ========== ===== bugs ===== "olc/lang.h" may need to be included before the rcsid decl. else, take the "const" keyword out of the decl. If gresolve acl is used to bump someone (forw, cancel, off), then "disconnect_knuckles" should not be called. Else you dump core. Also, clients need work to understand return codes from daemon if using gresolve acl to accomplish something... "l -q", "l -s", does not do the right thing right now. "l -t topic" gives back unconnected consultants. ===== enhancements ===== Implement simple caching by including time of data in data passed. Server then compares the time with the internal time of the data requested. If same, return (new) code UNCHANGED. Then the client just uses the local data. This would have to coincide with a new protocol number. "Error grabbing user" should give more info back to the grabber. This happens most often when the person has messages off in xterms and the console and zephyr is losing... Run lint over everything? Someday. "write_message_to_user" could maybe be taken out of the daemon in lots of places and put into the client. Then, when I send a message to a user, my client could send a message to the other user saying "so-and-so has sent you a message". This would relieve the daemon from having to do so. However, you lose the functionality in that the daemon detects loss of connectivity to the user and marks him logged out. This could be resolved by creating a new request type UPDATE_STATUS, so that the deamon could be told, OK, so-and-so is now logged out or whatever, and the daemon would update the status of that person. This provides the possibility of writing a special client that would poll each of the people in the queue, and if it couldn't contact that user, or send him a ping, or something, it could tell the daemon to update the status, bump a consultant or whatever. Ta-da... POLLING! It also opens the possibility of writing an administrative command from maude that would allow an admin to bump a consultant very easily. Actually, that could be done now. Simply add a request type that calls disconnect_knuckles somehow... hmmm... ========== CLIENT ========== ===== bugs ===== Stock answer temp files are not being unlinked after sending them. Also, apparently temp files that are created just before sending mail are not being unlinked. ===== enhancements ===== The output from stat -- it would be nice to indicate somehow which of your instances is a consultant, and which is a user... also, why not include the connected machine name? Allow people to select a pager, with envvar PAGER. Allow people to select a file "-", meaning stdout. Get OLZ out of lib/init.c, so that OLZ only affects the server build and not the clients... Add "version", "daemonhost" 'sub'commands. Maybe "bug" or "sendbug" command that would provide a template to mail off -- automatically including the version, daemonhost, and path of the executable? Addressed and ready to mail...? get_prompted_input (used everywhere) will exit the program on a ^D. This is probably not the right thing to do in most cases. Would be sort of nice if there was a "forward -all" command, so that people could put this in their .logout files so that they wouldn't be stuck connected to people after they logged out. ========== SERVER ========== ===== enhancements ===== Compile a profiling version of the daemon and get stats. Functions that call "log_error" should give more debugging info. Broadcasting error messages with no info make problems hard to track down. Look at everywhere that "log_error" is used, and see if it really needs to be logged and broadcast. The return value from "write_message_to_user" should be returned in "connect_knuckles", so that you can do nifty things like not connect if you try and grab and then find out the user is gone, or if match_maker tries to connect you and finds the user is gone. Figure out the difference between SERVICED and ACTIVE... Is there any? Look at the assignment of "target" everywhere in the server. In a lot of cases, "target = requester" is being used, when this is perhaps not the best thing. "target = requester->connected" perhaps is the right thing in these cases. Add timeouts around read's... especially in read_request(). Or, use sread's everywhere, and put the timeouts around the read's inside sread... load_user should zero permission bits before or'ing bits into it... check out "delete_knuckle" and see how often it is used. It should probably be used more often. Also check to see whether deleted space is being re-used. check return values on *allocs... delete_knuckle does not return an error if it couldn't find the knuckle. nothing would be done with the return value anyway... if cont=0, n_knuckles isn't decremented... if knuckle not found, last knuckle deleted. k_ptr[i] = k_ptr[knuckle->user->no_knuckles - 1]; k_ptr[knuckle->user->no_knuckles - 1] = 0; (store in temp var...) (if end_of_list is null, and delete first knuckle in list, possible n_knuckles mess up, first knuckle gets nulled and you have a null knuckle_list all of a sudden...) failed to contact user should say why -- timeout (write, zwrite), connect refused, machine down, etc. Move unseen messages out into files. Names can be "user_0.newmsg", similar to log names of "user_0.log". This should help keep the daemon from growing so large, as well as make the backup file much quicker to read and write. Also, the filename of the log and the new messages file should not have to be stored as a string in the question struct, since this is reconstructible -- user_inst.foo... When resolving a log, simply move it off into another directory reserved for resolved logs and give it some kind of unique name, like "user.date.time", and also write out a file that contains a command for shoving it off to the log, like: "dspipe mtgname -t title < foofile; rm foofile". Then have a job in cron that goes around every 15 minutes or so and execs all the one-line "scripts" that have been "written". ========== DONE ========== ========== SERVER ========== cancelled q's should go into the correct topic meeting, not "oh". From jfc: You should relink olcd with the new zephyr library; this has an optimization in ZSendPacket (pre-7.0 versions waited .5 seconds after sending a packet before checking for a response). You may want to build it with optimization on (the Athena build tree has CDEBUGFLAGS=-g; the size is close enough to the one on matisse that I suspect the one on matisse was too). From marc: call ZInitialize once only! set initial description is working. When bumping consultants off of a question because it can't contact them, NOTE IT in the log. Mail from a user that is not connected causes a core dump (printf'ing the connected pointer when that pointer is off in space...) Fix is to not allow owner of question send mail, since this makes no sense anyway. Got rid of multiple "unable to contact"s in the logs -- when forwarding, it would write to the user, fail, the forward would happen, then it would attempt to do match_maker for the newly unconnected user, which almost always failed, and then would attempt to tell the user that no consultant was available at the moment. So, fix is to not try doing match_maker on the user, because the user isn't there anyway. Got OLZ flag out of server code. Server now takes a command line argument "-inst instance" and uses that 'instance' for zephyr class, and what sloc to look up from hesiod. If can't dispose of log, lumberjack doesn't unlink the log file. Pickup/refer questions are now getting put back into the pending queue if/when the user sends a new message. Merely logging in does not change queues, though. ========== CLIENT ========== Mail includes user real name in header template. Fixed bug with forward and certain combinations of options going into infinite loop or dumping core.