Adding Windows 95 printer driver code donated by Jean-Francois.Micouleau@utc.fr.
authorJeremy Allison <jra@samba.org>
Tue, 28 Oct 1997 19:32:59 +0000 (19:32 +0000)
committerJeremy Allison <jra@samba.org>
Tue, 28 Oct 1997 19:32:59 +0000 (19:32 +0000)
New program, make_printerdef, plus two new parameters :

[global] "printer driver file"
[local] "printer driver location"

Jeremy.

source/.cvsignore
source/include/proto.h
source/param/loadparm.c
source/smbd/ipc.c

index f6b77ee2f96eaa5c1d5bfb6037c31faf87f2b972..1e48a541752a430e89b1df0da920512b6aabe763 100644 (file)
@@ -2,6 +2,7 @@ Makefile.RPM
 makefile
 makefile.sunos5
 make_smbcodepage
+make_printerdef
 nmbd
 nmblookup
 smbclient
index db8674a5a1c21537f38de180b950370c57faacfe..9ebe15e99a884bba6da27e56c7e4f390c29ce118 100644 (file)
@@ -159,6 +159,7 @@ struct in_addr *iface_ip(struct in_addr ip);
 
 /*The following definitions come from  ipc.c  */
 
+int get_printerdrivernumber(int snum);
 int reply_trans(char *inbuf,char *outbuf);
 
 /*The following definitions come from  kanji.c  */
@@ -203,6 +204,7 @@ char *lp_socket_address(void);
 char *lp_nis_home_map_name(void);
 char *lp_announce_version(void);
 char *lp_netbios_aliases(void);
+char *lp_driverfile(void);
 char *lp_domain_sid(void);
 char *lp_domain_other_sids(void);
 char *lp_domain_groups(void);
@@ -285,6 +287,7 @@ char *lp_volume(int );
 char *lp_mangled_map(int );
 char *lp_veto_files(int );
 char *lp_hide_files(int );
+char *lp_driverlocation(int );
 BOOL lp_alternate_permissions(int );
 BOOL lp_revalidate(int );
 BOOL lp_casesensitive(int );
index 122e2f664923ca5a3510f9ed8c41feb19691ad6d..db494711b6cd8fef8140cd7cc273f566118ade31 100644 (file)
@@ -147,6 +147,7 @@ typedef struct
   char *szDomainSID;
   char *szDomainOtherSIDs;
   char *szDomainGroups;
+  char *szDriverFile;
   int max_log_size;
   int mangled_stack;
   int max_xmit;
@@ -222,6 +223,7 @@ typedef struct
   char *szLpresumecommand;
   char *szPrintername;
   char *szPrinterDriver;
+  char *szPrinterDriverLocation;
   char *szDontdescend;
   char *szHostsallow;
   char *szHostsdeny;
@@ -305,6 +307,7 @@ static service sDefault =
   NULL,    /* szLpresumecommand */
   NULL,    /* szPrintername */
   NULL,    /* szPrinterDriver - this is set in init_globals() */
+  NULL,    /* szPrinterDriverLocation */
   NULL,    /* szDontdescend */
   NULL,    /* szHostsallow */
   NULL,    /* szHostsdeny */
@@ -494,6 +497,7 @@ struct parm_struct
   {"unix realname",    P_BOOL,    P_GLOBAL, &Globals.bUnixRealname,     NULL},
   {"NIS homedir",      P_BOOL,    P_GLOBAL, &Globals.bNISHomeMap,       NULL},
   {"time server",      P_BOOL,    P_GLOBAL, &Globals.bTimeServer,      NULL},
+  {"printer driver file", P_STRING,  P_GLOBAL, &Globals.szDriverFile,   NULL},
   {"-valid",           P_BOOL,    P_LOCAL,  &sDefault.valid,            NULL},
   {"comment",          P_STRING,  P_LOCAL,  &sDefault.comment,          NULL},
   {"copy",             P_STRING,  P_LOCAL,  &sDefault.szCopy,    handle_copy},
@@ -576,6 +580,7 @@ struct parm_struct
   {"printer",          P_STRING,  P_LOCAL,  &sDefault.szPrintername,    NULL},
   {"printer name",     P_STRING,  P_LOCAL,  &sDefault.szPrintername,    NULL},
   {"printer driver",   P_STRING,  P_LOCAL,  &sDefault.szPrinterDriver,  NULL},
+  {"printer driver location",   P_STRING,  P_LOCAL,  &sDefault.szPrinterDriverLocation,  NULL},
   {"hosts allow",      P_STRING,  P_LOCAL,  &sDefault.szHostsallow,     NULL},
   {"allow hosts",      P_STRING,  P_LOCAL,  &sDefault.szHostsallow,     NULL},
   {"hosts deny",       P_STRING,  P_LOCAL,  &sDefault.szHostsdeny,      NULL},
@@ -627,6 +632,7 @@ static void init_globals(void)
   string_set(&Globals.szWorkGroup, WORKGROUP);
   string_set(&Globals.szPasswdProgram, SMB_PASSWD);
   string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
+  string_set(&Globals.szDriverFile, DRIVERFILE);
   string_set(&Globals.szLockDir, LOCKDIR);
   string_set(&Globals.szRootdir, "/");
   string_set(&Globals.szSmbrun, SMBRUN);
@@ -868,6 +874,7 @@ FN_GLOBAL_STRING(lp_socket_address,&Globals.szSocketAddress)
 FN_GLOBAL_STRING(lp_nis_home_map_name,&Globals.szNISHomeMapName)
 FN_GLOBAL_STRING(lp_announce_version,&Globals.szAnnounceVersion)
 FN_GLOBAL_STRING(lp_netbios_aliases,&Globals.szNetbiosAliases)
+FN_GLOBAL_STRING(lp_driverfile,&Globals.szDriverFile)
 
 FN_GLOBAL_STRING(lp_domain_sid,&Globals.szDomainSID)
 FN_GLOBAL_STRING(lp_domain_other_sids,&Globals.szDomainOtherSIDs)
@@ -954,6 +961,7 @@ FN_LOCAL_STRING(lp_volume,volume)
 FN_LOCAL_STRING(lp_mangled_map,szMangledMap)
 FN_LOCAL_STRING(lp_veto_files,szVetoFiles)
 FN_LOCAL_STRING(lp_hide_files,szHideFiles)
+FN_LOCAL_STRING(lp_driverlocation,szPrinterDriverLocation)
 
 FN_LOCAL_BOOL(lp_alternate_permissions,bAlternatePerm)
 FN_LOCAL_BOOL(lp_revalidate,bRevalidate)
index 0354b4ecbe8526f0d6c43797148a49acdac911ed..65f85719ae4ba57c8d7122fab4725755125eb79c 100644 (file)
@@ -462,6 +462,10 @@ static int check_printq_info(struct pack_desc* desc,
   case 5:
     desc->format = "z";
     break;
+  case 52:
+    desc->format = "WzzzzzzzzN";
+    desc->subformat = "z";
+    break;
   default: return False;
   }
   if (strcmp(desc->format,id1) != 0) return False;
@@ -521,11 +525,18 @@ static void fill_printq_info(int cnum, int snum, int uLevel,
                             int count, print_queue_struct* queue,
                             print_status_struct* status)
 {
-  if (uLevel < 3) {
-    PACKS(desc,"B13",SERVICE(snum));
-  } else {
-    PACKS(desc,"z",Expand(cnum,snum,SERVICE(snum)));
+  switch (uLevel) {
+    case 1:
+    case 2:
+      PACKS(desc,"B13",SERVICE(snum));
+      break;
+    case 3:
+    case 4:
+    case 5:
+      PACKS(desc,"z",Expand(cnum,snum,SERVICE(snum)));
+      break;
   }
+
   if (uLevel == 1 || uLevel == 2) {
     PACKS(desc,"B","");                /* alignment */
     PACKI(desc,"W",5);         /* priority */
@@ -573,10 +584,119 @@ static void fill_printq_info(int cnum, int snum, int uLevel,
     for (i=0;i<count;i++)
       fill_printjob_info(cnum,snum,uLevel == 2 ? 1 : 2,desc,&queue[i],i);
   }
+
+  if (uLevel==52) {
+    int i,ok=0;
+    pstring tok,driver,short_name;
+    char *p,*q;
+    FILE *f;
+    pstring fname;
+
+    strcpy(fname,lp_driverfile());
+
+    f=fopen(fname,"r");
+    if (!f) {
+      DEBUG(0,("fill_printq_info: Can't open %s - %s\n",fname,strerror(errno)));
+    }
+
+    p=(char *)malloc(8192*sizeof(char));
+    bzero(p, 8192*sizeof(char));
+    q=p;
+
+    /* lookup the long printer driver name in the file description */
+    while (f && !feof(f) && !ok)
+    {
+      fgets(p,8191,f);
+      p[strlen(p)-1]='\0';
+      next_token(&p,tok,":");
+      if(!strncmp(tok,lp_printerdriver(snum),strlen(lp_printerdriver(snum)))) ok=1;
+    }
+
+    fclose(f);
+
+    next_token(&p,short_name,":");
+    next_token(&p,driver,":");
+
+    PACKI(desc,"W",0x0400);                      /* don't know */
+    PACKS(desc,"z",lp_printerdriver(snum));        /* long printer name */
+
+    if (ok)
+    {
+      PACKS(desc,"z",driver);                    /* Driver Name */
+      PACKS(desc,"z",short_name);                /* short printer name */
+      DEBUG(3,("Driver:%s:\n",driver));
+      DEBUG(3,("short name:%s:\n",short_name));
+    }
+    else 
+    {
+      PACKS(desc,"z","");
+      PACKS(desc,"z","");
+    }
+
+    PACKS(desc,"z","");
+    PACKS(desc,"z",lp_driverlocation(snum));       /* share to retrieve files */
+    PACKS(desc,"z","EMF");
+    PACKS(desc,"z","");
+    if (ok)
+      PACKS(desc,"z",driver);                      /* driver name */
+    else
+      PACKS(desc,"z","");
+    PACKI(desc,"N",count);                         /* number of files to copy */
+    for (i=0;i<count;i++)
+    {
+      next_token(&p,tok,",");
+      PACKS(desc,"z",tok);                        /* driver files to copy */
+      DEBUG(3,("file:%s:\n",tok));
+    }
+    free(q);
+  }
+
   DEBUG(3,("fill_printq_info on <%s> gave %d entries\n",SERVICE(snum),count));
 }
 
+/* This function returns the number of file for a given driver */
+int get_printerdrivernumber(int snum)
+{
+  int i=0,ok=0;
+  pstring tok;
+  char *p,*q;
+  FILE *f;
+  pstring fname;
+
+  strcpy(fname,lp_driverfile());
+
+  DEBUG(4,("In get_printerdrivernumber: %s\n",fname));
+  f=fopen(fname,"r");
+  if (!f) {
+    DEBUG(0,("get_printerdrivernumber: Can't open %s - %s\n",fname,strerror(errno)));
+    return(0);
+  }
+
+  p=(char *)malloc(8192*sizeof(char));
+  q=p; /* need it to free memory because p change ! */
+
+  /* lookup the long printer driver name in the file description */
+  while (!feof(f) && !ok)
+  {
+    fgets(p,8191,f);
+    next_token(&p,tok,":");
+    if(!strncmp(tok,lp_printerdriver(snum),strlen(lp_printerdriver(snum)))) ok=1;
+  }
+
+  if (ok) {
+    /* skip 2 fields */
+    next_token(&p,tok,":");  /* short name */
+    next_token(&p,tok,":");  /* driver name */
+    /* count the number of files */
+    while (next_token(&p,tok,","))
+       i++;
+  }
+  fclose(f);
+  free(q);
+
+  return(i);
+}
+
 static BOOL api_DosPrintQGetInfo(int cnum,uint16 vuid, char *param,char *data,
                                 int mdrcnt,int mprcnt,
                                 char **rdata,char **rparam,
@@ -622,7 +742,14 @@ static BOOL api_DosPrintQGetInfo(int cnum,uint16 vuid, char *param,char *data,
   
   if (snum < 0 || !VALID_SNUM(snum)) return(False);
 
-  count = get_printqueue(snum,cnum,&queue,&status);
+  if (uLevel==52)
+  {
+    count = get_printerdrivernumber(snum);
+    DEBUG(3,("api_DosPrintQGetInfo: Driver files count: %d\n",count));
+  }
+  else
+    count = get_printqueue(snum,cnum,&queue,&status);
+
   if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
   desc.base = *rdata;
   desc.buflen = mdrcnt;