diff -ru mfs_vplay_tserver-20050419/CHANGES mfs_vplay_tserver/CHANGES --- mfs_vplay_tserver-20050419/CHANGES 2005-04-20 01:03:38.000000000 +0100 +++ mfs_vplay_tserver/CHANGES 2005-04-29 22:55:36.796555200 +0100 @@ -1,3 +1,24 @@ +20050529 + +maxwells_daemon + New tserver/vserver -l and -L options. + -l sends error messages to the syslog. -L sends all messages. + So we don't have to rewrite everything, log.h redefines fprintf etc + to call syslog() if use_syslog is set - otherwise it runs fprintf as if + log.h weren't there. + + New tserver/vserver -i option. This allows these programs to be started + on demand from inetd. stderr and stdout are written to /dev/null, so + it's probably best to use -l (or -L) too. + + Fix load_devs which generated an unterminated device name, so could + randomly crash. + + Fix error message in generate_1_NowShowing, which probably would have + crashed. + + Add usage message for vserver -h. Update usage message for tserver -h. +----------------------------------------------------------------------------- 20050519 Jamie diff -ru mfs_vplay_tserver-20050419/Makefile mfs_vplay_tserver/Makefile --- mfs_vplay_tserver-20050419/Makefile 2005-03-18 03:43:53.000000000 +0000 +++ mfs_vplay_tserver/Makefile 2005-04-29 02:21:50.950083200 +0100 @@ -64,7 +64,7 @@ COMMON = mfs.c object.c util.c bitmap.c io.c partition.c \ crc.c pri.c export.c schema.c query.c tzoffset.c tar.c \ - credits.c read_xml.c generate_xml.c generate_NowShowing.c attribute.c + credits.c read_xml.c generate_xml.c generate_NowShowing.c attribute.c log.c BINS = \ mfs_info mfs_ls mfs_streams mfs_dumpobj mfs_dumpschema mfs_tzoffset \ @@ -101,7 +101,7 @@ .PRECIOUS : $(OBJDIR)/%.o -$(OBJDIR)/%.o : %.c mfs.h +$(OBJDIR)/%.o : %.c mfs.h log.h $(CC) $(CFLAGS) -c $< -o $@ $(BINDIR)/% : $(OBJDIR)/%.o $(TRIDGE_MFS_LIB) diff -ru mfs_vplay_tserver-20050419/attribute.c mfs_vplay_tserver/attribute.c --- mfs_vplay_tserver-20050419/attribute.c 2005-04-14 04:28:56.000000000 +0100 +++ mfs_vplay_tserver/attribute.c 2005-04-29 21:28:39.314184000 +0100 @@ -8,6 +8,7 @@ #include #include "mfs.h" #include "attribute.h" +#include "log.h" int get_attribute( void *buf, unsigned size, const char *target_subobj_name, diff -ru mfs_vplay_tserver-20050419/bitmap.c mfs_vplay_tserver/bitmap.c --- mfs_vplay_tserver-20050419/bitmap.c 2004-12-13 16:37:06.000000000 +0000 +++ mfs_vplay_tserver/bitmap.c 2005-04-29 21:28:46.794940800 +0100 @@ -1,4 +1,5 @@ #include "mfs.h" +#include "log.h" /**************************************************************************** allocate a bitmap of the specified size diff -ru mfs_vplay_tserver-20050419/crc.c mfs_vplay_tserver/crc.c --- mfs_vplay_tserver-20050419/crc.c 2005-01-30 23:31:02.000000000 +0000 +++ mfs_vplay_tserver/crc.c 2005-04-29 21:28:51.231320000 +0100 @@ -1,4 +1,5 @@ #include "mfs.h" +#include "log.h" /* * Crc - 32 BIT ANSI X3.66 CRC checksum files diff -ru mfs_vplay_tserver-20050419/credits.c mfs_vplay_tserver/credits.c --- mfs_vplay_tserver-20050419/credits.c 2005-03-14 23:04:37.000000000 +0000 +++ mfs_vplay_tserver/credits.c 2005-04-29 21:59:38.387400000 +0100 @@ -7,7 +7,7 @@ Original mfs_* package by tridge at samba.org, January 2001\n\ Modifications by:\n\ adh, jamie, jbuehl, jdiner, jonbig, mbm, musclenerd, ppchacker\n\ - Daniel Gimpelevich (aka sn9) and possibly others...\n\ + Daniel Gimpelevich (aka sn9), maxwells_daemon, and possibly others...\n\ A support thread is in the forums at dealdatabase.com\n\ "); } diff -ru mfs_vplay_tserver-20050419/export.c mfs_vplay_tserver/export.c --- mfs_vplay_tserver-20050419/export.c 2005-03-21 23:58:30.000000000 +0000 +++ mfs_vplay_tserver/export.c 2005-04-29 21:29:29.786760000 +0100 @@ -14,6 +14,7 @@ #include #include "mfs.h" +#include "log.h" // Write a complete buffer to a file descriptor, handling partial writes diff -ru mfs_vplay_tserver-20050419/generate_NowShowing.c mfs_vplay_tserver/generate_NowShowing.c --- mfs_vplay_tserver-20050419/generate_NowShowing.c 2005-04-20 01:35:41.000000000 +0100 +++ mfs_vplay_tserver/generate_NowShowing.c 2005-04-29 21:29:58.658275200 +0100 @@ -12,6 +12,7 @@ #include "mfs.h" #include "attribute.h" +#include "log.h" /** * Fetch an fsid, if it isn't a subobject of the fsid we already have @@ -241,8 +242,11 @@ unsigned size; if ( fsid<=0 || mfs_fsid_type(fsid) != MFS_TYPE_OBJ) { - fprintf(stderr, "Bad recording id: %d type: %s\n", fsid, - (fsid<=0)? "*bad fsid*" : mfs_fsid_type(fsid) ); + if (fsid<=0) { + fprintf(stderr, "Bad recording id: %d\n", fsid); + } else { + fprintf(stderr, "Bad recording id: %d type: %d\n", fsid, mfs_fsid_type(fsid) ); + } return 0; } diff -ru mfs_vplay_tserver-20050419/io.c mfs_vplay_tserver/io.c --- mfs_vplay_tserver-20050419/io.c 2005-03-16 18:02:08.000000000 +0000 +++ mfs_vplay_tserver/io.c 2005-04-29 21:29:55.403595200 +0100 @@ -13,6 +13,7 @@ #include #include #include "mfs.h" +#include "log.h" static int readahead_enabled; static int vserver = -1; @@ -301,6 +302,7 @@ devs[i].dev = (char *) malloc( l + (ep-p1) +1 ); strncpy( devs[i].dev, xlist[xi], l ); strncpy( devs[i].dev+l, p1, (ep-p1) ); + devs[i].dev[l+(ep-p1)]= '\0'; } else { devs[i].dev = strndup(devlist,len); } Only in mfs_vplay_tserver: log.c Only in mfs_vplay_tserver: log.h diff -ru mfs_vplay_tserver-20050419/mfs.c mfs_vplay_tserver/mfs.c --- mfs_vplay_tserver-20050419/mfs.c 2005-03-25 19:59:10.000000000 +0000 +++ mfs_vplay_tserver/mfs.c 2005-04-29 21:29:52.689692800 +0100 @@ -7,6 +7,7 @@ #include #include #include "mfs.h" +#include "log.h" static struct mfs_super super; static struct mfs_zone_map *zones[MAX_ZONES]; diff -ru mfs_vplay_tserver-20050419/partition.c mfs_vplay_tserver/partition.c --- mfs_vplay_tserver-20050419/partition.c 2004-12-13 16:37:06.000000000 +0000 +++ mfs_vplay_tserver/partition.c 2005-04-29 21:30:06.219147200 +0100 @@ -5,6 +5,7 @@ */ #include "mfs.h" +#include "log.h" #define MAX_PARTITIONS 20 #define PARTITION_MAGIC 0x504d diff -ru mfs_vplay_tserver-20050419/pri.c mfs_vplay_tserver/pri.c --- mfs_vplay_tserver-20050419/pri.c 2005-03-13 22:31:54.000000000 +0000 +++ mfs_vplay_tserver/pri.c 2005-04-29 21:30:19.938875200 +0100 @@ -6,6 +6,7 @@ #define _STRUCT_TIMESPEC #include #include +#include "log.h" #ifdef TIVO_S1 //#include diff -ru mfs_vplay_tserver-20050419/schema.c mfs_vplay_tserver/schema.c --- mfs_vplay_tserver-20050419/schema.c 2004-12-13 16:37:06.000000000 +0000 +++ mfs_vplay_tserver/schema.c 2005-04-29 21:28:09.691588800 +0100 @@ -5,6 +5,7 @@ */ #include #include "preload_schema.h" +#include "log.h" static const char **types = 0; static int ntypes=0; diff -ru mfs_vplay_tserver-20050419/tserver.c mfs_vplay_tserver/tserver.c --- mfs_vplay_tserver-20050419/tserver.c 2005-03-14 20:51:28.000000000 +0000 +++ mfs_vplay_tserver/tserver.c 2005-04-29 22:06:45.110998400 +0100 @@ -17,6 +17,29 @@ // From the MFS_stream code. We are now using this as it seems to work better. // #include "mfs.h" + +// +// usage - Print out the usage as seperate lines. Save the deprecation warnings. +// +void usage(void) +{ + printf("tserver_mfs [options]\n"); + printf("Version: 1.3-20050428\n"); + printf("options:\n"); + printf(" -n No Priority Change (Stay at higher priority...)\n"); + printf(" -d DeleteShowing tivosh script to use instead of the internal script\n"); + printf(" -s NowShowing tivosh script to use instead of the internal code.\n" + " Also used for DeleteScript, unless overriden with -d\n"); + printf(" -l Send messages to syslog\n"); + printf(" -L Send all messages to syslog\n"); + printf(" -i inetd mode. Use this in inetd.conf.\n"); + printf(" -h help\n"); + credits(); + exit(1); +} + +#include "log.h" + int verbose = 0; int SetupClientSocket(char *Servername, int ServerPort); @@ -71,23 +94,6 @@ } -// -// usage - Print out the usage as seperate lines. Save the deprecation warnings. -// -void usage(void) -{ - printf("tserver_mfs [options]\n"); - printf("Version: 1.2-20041212\n"); - printf("options:\n"); - printf(" -n No Priority Change (Stay at higher priority...)\n"); - printf(" -d DeleteShowing tivosh script to use instead of the internal script\n"); - printf(" -s NowShowing tivosh script to use instead of the internal code.\n" - " Also used for DeleteScript, unless overriden with -d\n"); - printf(" -h help\n"); - credits(); - exit(1); -} - static void @@ -257,7 +263,7 @@ main(int argc, char *argv[]) { char buf[CMD_SIZE]; // Command we read from the socket. - int ns; // New socket descriptor + int ns = -1; // New socket descriptor int len; struct sockaddr client_sa; // Data structure for the address of the client entity @@ -267,26 +273,43 @@ extern int optind; int doPri = 1; // By default change the priority. int reuseAddr; - int c, fd; + int c, fd, inetd = 0; - while ((c = getopt(argc, argv, "nd:s:")) != -1) + while ((c = getopt(argc, argv, "nd:s:lLih?")) != -1) { switch (c) { case 'n': doPri=0; break; // Don't change priority. + case 'd': script_DeleteShowing=optarg; break; case 's': script_NowShowing=optarg; break; + case 'l': setup_syslog(1); break; + case 'L': setup_syslog(2); break; + case 'i': inetd=1; break; default: usage(); exit(1); } } argc -= optind; argv += optind; - + if (argc != 0) { usage(); } + if (inetd) { + // If started by inetd, stdin+stdout+stderr are all connected + // to the socket. Here we keep just stdin (fd=0). + int logfd; + logfd= open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (logfd==-1) exit(2); + dup2(logfd,1); + close(logfd); + dup2(1,2); + sd = dup(0); + close(0); + } + /* Check NowSHowing script */ if (script_NowShowing) { fd = open(script_NowShowing, O_RDONLY, 0); @@ -318,6 +341,7 @@ { printf("Doing the Lowest PriorityFix...\n"); fixPriority(1); // Force ourselves to a low priority to keep the Tivo from skipping. + } else { @@ -327,27 +351,28 @@ mfs_init(); // Turn on the mfs code so we can read these as we go. - - sd = socket(AF_INET,SOCK_STREAM,0); // Get a socket descriptor and make sure it is good. - if (sd<0) - { + if (!inetd) { + sd = socket(AF_INET,SOCK_STREAM,0); // Get a socket descriptor and make sure it is good. + if (sd<0) + { perror("Can't open a socket\n"); exit(0); - } + } - bzero(&sa_in, sizeof(sa_in)); // Bind the socket to an address. - sa_in.sin_addr.s_addr = INADDR_ANY; // And legal address in the server interface list. - sa_in.sin_port = htons(0xded); // on port 3565 - sa_in.sin_family = AF_INET; // An inet family socket. + bzero(&sa_in, sizeof(sa_in)); // Bind the socket to an address. + sa_in.sin_addr.s_addr = INADDR_ANY; // And legal address in the server interface list. + sa_in.sin_port = htons(0xded); // on port 3565 + sa_in.sin_family = AF_INET; // An inet family socket. - reuseAddr = 1; // Be able to reopen an already running address. - setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuseAddr, sizeof(int)); + reuseAddr = 1; // Be able to reopen an already running address. + setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuseAddr, sizeof(int)); - if (bind(sd, (struct sockaddr *)&sa_in, sizeof(sa_in))) - { + if (bind(sd, (struct sockaddr *)&sa_in, sizeof(sa_in))) + { perror("Bad binding in the server"); close(sd); exit(0); + } } signal(SIGINT,onintr); // Setup the ^C interrupts and other good ones to watch. @@ -355,19 +380,24 @@ signal(SIGTERM,onintr); signal(SIGPIPE,write_error); - listen(sd, 10); // Set the listen queue, 10 can wait while we process the current. + if (!inetd) + listen(sd, 10); // Set the listen queue, 10 can wait while we process the current. for(;;) { int ret; int i; - printf("Waiting for an incoming connection!\n"); + if (inetd) { + ns = sd; + } else { + printf("Waiting for an incoming connection!\n"); - ret = waitio (sd, 0); - if (ret != 1) continue; // Something went bad, so leave! + ret = waitio (sd, 0); + if (ret != 1) continue; // Something went bad, so leave! - ns = accept(sd,&client_sa,&len); // Wait here for a client to connect and make a request. + ns = accept(sd,&client_sa,&len); // Wait here for a client to connect and make a request. + } bzero(buf, CMD_SIZE); read(ns, &buf, CMD_SIZE); @@ -379,7 +409,7 @@ else break; } - printf("SERVER: We got a message! buf = '%s'\n", buf); + logmsg("SERVER: We got a message! buf = '%s'\n", buf); // // CORE: Download a TyStream here... // @@ -536,7 +566,9 @@ } close(ns); + if (inetd) break; } + exit(0); } diff -ru mfs_vplay_tserver-20050419/util.c mfs_vplay_tserver/util.c --- mfs_vplay_tserver-20050419/util.c 2005-03-16 18:04:18.000000000 +0000 +++ mfs_vplay_tserver/util.c 2005-04-29 21:30:25.947515200 +0100 @@ -5,6 +5,7 @@ */ #include "mfs.h" +#include "log.h" #include #include diff -ru mfs_vplay_tserver-20050419/vserver.c mfs_vplay_tserver/vserver.c --- mfs_vplay_tserver-20050419/vserver.c 2005-03-18 03:45:02.000000000 +0000 +++ mfs_vplay_tserver/vserver.c 2005-04-29 22:06:00.126313600 +0100 @@ -7,6 +7,24 @@ #include "mfs.h" +// +// usage - Print out the usage as seperate lines. Save the deprecation warnings. +// +void usage(void) +{ + printf("vserver_mfs [options]\n"); + printf("Version: 1.3-20050428\n"); + printf("options:\n"); + printf(" -l Send messages to syslog\n"); + printf(" -L Send all messages to syslog\n"); + printf(" -i inetd mode. Use this in inetd.conf.\n"); + printf(" -h help\n"); + credits(); + exit(1); +} + +#include "log.h" + #define CHUNK_SIZE (256*1024) #define CHUNK_BLOCKS (CHUNK_SIZE >> SECTOR_SHIFT) @@ -166,6 +184,44 @@ int main(int argc, char *argv[]) { int sock; + int c, inetd = 0; + + while ((c = getopt(argc, argv, "lLih?")) != -1) + { + switch (c) + { + case 'l': setup_syslog(1); break; + case 'L': setup_syslog(2); break; + case 'i': inetd=1; break; + default: usage(); exit(1); + } + } + + argc -= optind; argv += optind; + + if (argc != 0) + { + usage(); + } + + if (inetd) { + // If started by inetd, stdin+stdout+stderr are all connected + // to the socket. Here we keep just stdin (fd=0). + int logfd; + logfd= open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (logfd==-1) exit(2); + dup2(logfd,1); + close(logfd); + dup2(1,2); + sock = dup(0); + close(0); + + signal(SIGCHLD, SIG_IGN); + mfs_init(); + logmsg("starting vserver\n"); + vserver(sock); + return 0; + } sock = open_socket_in(SOCK_STREAM, VSERVER_PORT, INADDR_ANY); @@ -178,7 +234,7 @@ mfs_init(); - printf("waiting for connections on port %d\n", VSERVER_PORT); + logmsg("waiting for connections on port %d\n", VSERVER_PORT); while (1) { struct sockaddr addr;