1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

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.
This commit is contained in:
Jeremy Allison 0001-01-01 00:00:00 +00:00
parent 84d858782e
commit f9dacd1d8b
5 changed files with 141 additions and 12 deletions

View File

@ -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);
}

View File

@ -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};

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;