diff options
author | Jeremy Allison <jra@samba.org> | 1998-04-02 01:01:24 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 1998-04-02 01:01:24 +0000 |
commit | f9dacd1d8b89fccad859c0c6bc7a492823eb4b06 (patch) | |
tree | 7d663455e19571ab11ed1890a7cd8f0e7c7340ee | |
parent | 84d858782eca2077cd0ce089b156938fa122cf93 (diff) | |
download | samba-f9dacd1d8b89fccad859c0c6bc7a492823eb4b06.tar.gz |
Patch from Chris Maltby <chris@softway.com.au>. His comments follow:
+ improvement to smbtar to allow exclusion/inclusion of system and
hidden files, and to generate a listing of what has been archived
in a format useful for automated backup systems.
+ add the "Softq" spooling system to samba's printing capabilities.
+ I have "fixed" the intrusion of US style dates into samba reporting
as well. The format yyyy/mm/dd is not only uunambiguous, but also
has the benefit of making lexicographic sorts work correctly.
Jeremy.
-rw-r--r-- | source/client/clitar.c | 52 | ||||
-rw-r--r-- | source/include/smb.h | 2 | ||||
-rw-r--r-- | source/lib/time.c | 8 | ||||
-rw-r--r-- | source/param/loadparm.c | 10 | ||||
-rw-r--r-- | source/printing/printing.c | 81 |
5 files changed, 141 insertions, 12 deletions
diff --git a/source/client/clitar.c b/source/client/clitar.c index ccaab486d0f..36cefeec557 100644 --- a/source/client/clitar.c +++ b/source/client/clitar.c @@ -48,6 +48,13 @@ BOOL tar_inc=False; BOOL tar_reset=False; /* Include / exclude mode (true=include, false=exclude) */ BOOL tar_excl=True; +/* Dump files with System attribute */ +BOOL tar_system=False; +/* Dump files with Hidden attribute */ +BOOL tar_hidden=True; +/* Be noisy - make a catalogue */ +BOOL tar_noisy=True; + char tar_type='\0'; static char **cliplist=NULL; static int clipn=0; @@ -856,6 +863,16 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) DEBUG(4, ("skipping %s - archive bit not set\n", finfo.name)); shallitime=0; } + else if (!tar_system && (finfo.mode & aSYSTEM)) + { + DEBUG(4, ("skipping %s - system bit is set\n", finfo.name)); + shallitime=0; + } + else if (!tar_hidden && (finfo.mode & aHIDDEN)) + { + DEBUG(4, ("skipping %s - hidden bit is set\n", finfo.name)); + shallitime=0; + } else { if (SVAL(inbuf,smb_vwv0) == SMBreadX) @@ -870,7 +887,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) datalen = 0; } - DEBUG(1,("getting file %s of size %d bytes as a tar file %s", + DEBUG(2,("getting file %s of size %d bytes as a tar file %s", finfo.name, finfo.size, lname)); @@ -1135,9 +1152,16 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) get_total_size += finfo.size; /* Thanks to Carel-Jan Engel (ease@mail.wirehub.nl) for this one */ - DEBUG(1,("(%g kb/s) (average %g kb/s)\n", + DEBUG(2,("(%g kb/s) (average %g kb/s)\n", finfo.size / MAX(0.001, (1.024*this_time)), get_total_size / MAX(0.001, (1.024*get_total_time_ms)))); + if (tar_noisy) + { + printf("%10d (%7.1f kb/s) %s\n", + finfo.size, finfo.size / MAX(0.001, (1.024*this_time)), + finfo.name); + } + } free(inbuf);free(outbuf); @@ -1456,7 +1480,7 @@ void cmd_block(void) } blocksize=block; - DEBUG(1,("blocksize is now %d\n", blocksize)); + DEBUG(2,("blocksize is now %d\n", blocksize)); } /**************************************************************************** @@ -1475,12 +1499,28 @@ void cmd_tarmode(void) tar_reset=True; else if (strequal(buf, "noreset")) tar_reset=False; + else if (strequal(buf, "system")) + tar_system=True; + else if (strequal(buf, "nosystem")) + tar_system=False; + else if (strequal(buf, "hidden")) + tar_hidden=True; + else if (strequal(buf, "nohidden")) + tar_hidden=False; + else if (strequal(buf, "verbose") || strequal(buf, "noquiet")) + tar_noisy=True; + else if (strequal(buf, "quiet") || strequal(buf, "noverbose")) + tar_noisy=False; else DEBUG(0, ("tarmode: unrecognised option %s\n", buf)); } - DEBUG(0, ("tarmode is now %s, %s\n", + DEBUG(0, ("tarmode is now %s, %s, %s, %s, %s\n", tar_inc ? "incremental" : "full", - tar_reset ? "reset" : "noreset")); + tar_system ? "system" : "nosystem", + tar_hidden ? "hidden" : "nohidden", + tar_reset ? "reset" : "noreset", + tar_noisy ? "verbose" : "quiet")); + } /**************************************************************************** @@ -1533,7 +1573,7 @@ void cmd_setmode(void) return; } - DEBUG(1, ("\nperm set %d %d\n", attra[ATTRSET], attra[ATTRRESET])); + DEBUG(2, ("\nperm set %d %d\n", attra[ATTRSET], attra[ATTRRESET])); (void) do_setrattr(fname, attra[ATTRSET], ATTRSET); (void) do_setrattr(fname, attra[ATTRRESET], ATTRRESET); } diff --git a/source/include/smb.h b/source/include/smb.h index 0acc5cbfa34..88d9a9de095 100644 --- a/source/include/smb.h +++ b/source/include/smb.h @@ -1064,7 +1064,7 @@ enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER}; /* printing types */ enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX, - PRINT_QNX,PRINT_PLP,PRINT_LPRNG}; + PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ}; /* Remote architectures we know about. */ enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_SAMBA}; diff --git a/source/lib/time.c b/source/lib/time.c index 050b4725a79..716f5d62cc6 100644 --- a/source/lib/time.c +++ b/source/lib/time.c @@ -478,19 +478,19 @@ char *timestring(void ) #ifdef NO_STRFTIME fstrcpy(TimeBuf, asctime(tm)); #elif defined(CLIX) || defined(CONVEX) - strftime(TimeBuf,100,"%m/%d/%Y %I:%M:%S %p",tm); + strftime(TimeBuf,100,"%Y/%m/%d %I:%M:%S %p",tm); #elif defined(AMPM) - strftime(TimeBuf,100,"%m/%d/%Y %r",tm); + strftime(TimeBuf,100,"%Y/%m/%d %r",tm); #elif defined(TZ_TIME) { int zone = TimeDiff(t); int absZoneMinutes = (zone<0 ? -zone : zone) / 60; - size_t len = strftime(TimeBuf,sizeof(TimeBuf)-6,"%m/%d/%Y %T",tm); + size_t len = strftime(TimeBuf,sizeof(TimeBuf)-6,"%Y/%m/%d %T",tm); sprintf(TimeBuf+len," %c%02d%02d", zone<0?'+':'-',absZoneMinutes/60,absZoneMinutes%60); } #else - strftime(TimeBuf,100,"%m/%d/%Y %T",tm); + strftime(TimeBuf,100,"%Y/%m/%d %T",tm); #endif return(TimeBuf); } diff --git a/source/param/loadparm.c b/source/param/loadparm.c index 70f06065a31..2527692bc5e 100644 --- a/source/param/loadparm.c +++ b/source/param/loadparm.c @@ -407,7 +407,8 @@ static struct enum_list enum_security[] = {{SEC_SHARE, "SHARE"}, {SEC_USER, "US static struct enum_list enum_printing[] = {{PRINT_SYSV, "sysv"}, {PRINT_AIX, "aix"}, {PRINT_HPUX, "hpux"}, {PRINT_BSD, "bsd"}, {PRINT_QNX, "qnx"}, {PRINT_PLP, "plp"}, - {PRINT_LPRNG, "lprng"}, {-1, NULL}}; + {PRINT_LPRNG, "lprng"}, {PRINT_SOFTQ, "softq"}, + {-1, NULL}}; static struct enum_list enum_announce_as[] = {{ANNOUNCE_AS_NT, "NT"}, {ANNOUNCE_AS_WIN95, "win95"}, {ANNOUNCE_AS_WFW, "WfW"}, {-1, NULL}}; @@ -821,6 +822,13 @@ static void init_locals(void) string_initial(&sDefault.szPrintcommand,"lp -r -P%p %s"); break; + case PRINT_SOFTQ: + string_initial(&sDefault.szLpqcommand,"qstat -l -d%p"); + string_initial(&sDefault.szLprmcommand,"qstat -s -j%j -c"); + string_initial(&sDefault.szPrintcommand,"lp -d%p -s %s; rm %s"); + string_initial(&sDefault.szLppausecommand,"qstat -s -j%j -h"); + string_initial(&sDefault.szLpresumecommand,"qstat -s -j%j -r"); + break; } } diff --git a/source/printing/printing.c b/source/printing/printing.c index bf49a372030..c7db5744e26 100644 --- a/source/printing/printing.c +++ b/source/printing/printing.c @@ -846,6 +846,84 @@ static BOOL parse_lpq_plp(char *line,print_queue_struct *buf,BOOL first) return(True); } +/**************************************************************************** +parse a qstat line + +here is an example of "qstat -l -d qms" output under softq + +Queue qms: 2 jobs; daemon active (313); enabled; accepting; + job-ID submission-time pri size owner title +205980: H 98/03/09 13:04:05 0 15733 stephenf chap1.ps +206086:> 98/03/12 17:24:40 0 659 chris - +206087: 98/03/12 17:24:45 0 4876 chris - +Total: 21268 bytes in queue + + +****************************************************************************/ +static BOOL parse_lpq_softq(char *line,print_queue_struct *buf,BOOL first) +{ + string tok[10]; + int count=0; + + /* mung all the ":"s to spaces*/ + string_sub(line,":"," "); + + for (count=0; count<10 && next_token(&line,tok[count],NULL); count++) ; + + /* we must get 9 tokens */ + if (count < 9) + return(False); + + /* the 1st and 7th columns must be integer */ + if (!isdigit(*tok[0]) || !isdigit(*tok[6])) return(False); + /* if the 2nd column is either '>' or 'H' then the 7th and 8th must be + * integer, else it's the 6th and 7th that must be + */ + if (*tok[1] == 'H' || *tok[1] == '>') + { + if (!isdigit(*tok[7])) + return(False); + buf->status = *tok[1] == '>' ? LPQ_PRINTING : LPQ_PAUSED; + count = 1; + } + else + { + if (!isdigit(*tok[5])) + return(False); + buf->status = LPQ_QUEUED; + count = 0; + } + + + buf->job = atoi(tok[0]); + buf->size = atoi(tok[count+6]); + buf->priority = atoi(tok[count+5]); + StrnCpy(buf->user,tok[count+7],sizeof(buf->user)-1); + StrnCpy(buf->file,tok[count+8],sizeof(buf->file)-1); + buf->time = time(NULL); /* default case: take current time */ + { + time_t jobtime; + struct tm *t; + + t = localtime(&buf->time); + t->tm_mday = atoi(tok[count+2]+6); + t->tm_mon = atoi(tok[count+2]+3); + switch (*tok[count+2]) + { + case 7: case 8: case 9: t->tm_year = atoi(tok[count+2]) + 1900; break; + default: t->tm_year = atoi(tok[count+2]) + 2000; break; + } + + t->tm_hour = atoi(tok[count+3]); + t->tm_min = atoi(tok[count+4]); + t->tm_sec = atoi(tok[count+5]); + jobtime = mktime(t); + if (jobtime != (time_t)-1) + buf->time = jobtime; + } + + return(True); +} char *stat0_strings[] = { "enabled", "online", "idle", "no entries", "free", "ready", NULL }; @@ -881,6 +959,9 @@ static BOOL parse_lpq_entry(int snum,char *line, case PRINT_PLP: ret = parse_lpq_plp(line,buf,first); break; + case PRINT_SOFTQ: + ret = parse_lpq_softq(line,buf,first); + break; default: ret = parse_lpq_bsd(line,buf,first); break; |