summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1997-10-28 23:58:31 +0000
committerJeremy Allison <jra@samba.org>1997-10-28 23:58:31 +0000
commitecb952f913e0532e4570753e479f8b8de14b0988 (patch)
tree2c7dfb7a47cfd3ccf1ec3fb6feb35c47119643d4
parentdb12131fcdcb2d361bf8adf1877d525d86c203fc (diff)
downloadsamba-ecb952f913e0532e4570753e479f8b8de14b0988.tar.gz
samba-ecb952f913e0532e4570753e479f8b8de14b0988.tar.bz2
samba-ecb952f913e0532e4570753e479f8b8de14b0988.zip
Utility code to produce printer definition files from MS files.
Part of code to support Windows 95 automated printer driver installs. Written by Jean-Francois Micouleau <Jean-Francois.Micouleau@utc.fr>. (This used to be commit 6e9f817414d6f7bdcb0ea64170d0db34b62651a5)
-rw-r--r--source3/utils/make_printerdef.c301
1 files changed, 301 insertions, 0 deletions
diff --git a/source3/utils/make_printerdef.c b/source3/utils/make_printerdef.c
new file mode 100644
index 0000000000..8b49925ad8
--- /dev/null
+++ b/source3/utils/make_printerdef.c
@@ -0,0 +1,301 @@
+ /*
+ Unix SMB/Netbios implementation.
+ Version 1.9.
+ Create printer definition files.
+
+ Copyright (C) Jean-Francois.Micouleau@utc.fr, 10/26/97
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+/*
+#define DEBUG
+*/
+char *files_to_copy;
+char *driverfile;
+char buffer[50][255];
+char sub_dir[50][2][255];
+
+void usage(char *name)
+{
+ fprintf(stderr,"%s: printer.def \"Printer Name\"\n", name);
+}
+
+/*
+ This function split a line in two parts
+ on both side of the equal sign
+ "entry=value"
+*/
+char *scan(char *chaine,char **entry)
+{
+ char *value;
+ char *temp;
+ int i=0;
+
+ *entry=(char *)malloc(255*sizeof(char));
+ value=(char *)malloc(255*sizeof(char));
+ strcpy(*entry,chaine);
+ temp=chaine;
+ while( temp[i]!='=' && temp[i]!='\0') {
+ i++;
+ }
+ (*entry)[i]='\0';
+ strcpy(value,temp+i+1);
+ return (value);
+}
+
+void build_subdir()
+{
+ int i=0;
+ char *entry;
+ char *data;
+
+ while (*buffer[i]!='\0') {
+ data=scan(buffer[i],&entry);
+#ifdef DEBUG
+ fprintf(stderr,"\tentry=data %s:%s\n",entry,data);
+#endif
+
+ if (strcmp(data,"11")==0) {
+ strcpy(sub_dir[i][0],entry);
+ strcpy(sub_dir[i][1],"");
+ }
+ if (strcmp(data,"23")==0) {
+ strcpy(sub_dir[i][0],entry);
+ strcpy(sub_dir[i][1],"color\\");
+ }
+#ifdef DEBUG
+ fprintf(stderr,"\tsubdir %s:%s\n",sub_dir[i][0],sub_dir[i][1]);
+#endif
+ i++;
+ }
+}
+
+/*
+ Lockup an entry in a file
+ Return all the lines between the entry and the next one or the end of file
+ An entry is something between braces.
+*/
+void lookup_entry(FILE *fichier,char *chaine)
+{
+ int found=0,pointeur=0,i=0;
+ char *temp,*temp2;
+
+ temp=(char *)malloc(255*sizeof(char));
+ temp2=(char *)malloc(255*sizeof(char));
+
+ *buffer[0]='\0';
+
+ strcpy(temp2,"[");
+ strcat(temp2,chaine);
+ strcat(temp2,"]");
+
+ rewind(fichier);
+#ifdef DEBUG
+ fprintf(stderr,"\tLooking for %s\n",chaine);
+#endif
+
+ while (!feof(fichier) && found==0) {
+ *temp='\0';
+ fgets(temp,255,fichier);
+ if (strncmp(temp,temp2,strlen(temp2))==0) found=1;
+ }
+
+
+ while (!feof(fichier) && found==1) {
+ *temp='\0';
+ fgets(temp,255,fichier);
+ if (*temp=='[') {
+ found=2;
+ *buffer[pointeur]='\0';
+ }
+ else {
+ strcpy(buffer[pointeur],temp);
+ i=strlen(buffer[pointeur])-1;
+ while (buffer[pointeur][i]=='\r' || buffer[pointeur][i]=='\n')
+ buffer[pointeur][i--]='\0';
+ pointeur++;
+ }
+ }
+#ifdef DEBUG
+ fprintf(stderr,"\t\tFound %d entries\n",pointeur-1);
+#endif
+}
+
+
+
+char *find_desc(FILE *fichier,char *text)
+{
+ char *chaine;
+ char *long_desc;
+ char *short_desc;
+ char *crap;
+ char *p;
+
+ int found=0;
+
+ chaine=(char *)malloc(255*sizeof(char));
+ long_desc=(char *)malloc(40*sizeof(char));
+ short_desc=(char *)malloc(13*sizeof(char));
+
+ while (!feof(fichier) && found==0)
+ {
+ fgets(chaine,255,fichier);
+
+ long_desc=strtok(chaine,"=");
+ crap=strtok(NULL,",");
+
+ p=long_desc;
+ while(*p!='"' && *p!='\0')
+ p++;
+ if (*p=='"' && *(p+1)!='\0') p++;
+ long_desc=p;
+
+ if (*p!='\0')
+ {
+ p++;
+ while(*p!='\"')
+ p++;
+ *p='\0';
+ }
+ if (!strcmp(text,long_desc)) found=1;
+ }
+ free(chaine);
+ while(*crap==' ') crap++;
+ strcpy(short_desc,crap);
+ if (found) return(short_desc);
+ else return(NULL);
+}
+
+void scan_copyfiles(FILE *fichier, char *chaine)
+{
+ char *part;
+ int i;
+ char direc[255];
+#ifdef DEBUG
+ fprintf(stderr,"In scan_copyfiles Lookup up of %s\n",chaine);
+#endif
+ part=strtok(chaine,", ");
+ do {
+ /* If the entry start with a @ then it's a file to copy
+ else it's an entry refering to files to copy
+ the main difference is when it's an entry
+ you can have a directory to append before the file name
+ */
+ if (*part=='@') {
+ strcpy(files_to_copy,", ");
+ strcpy(files_to_copy,part);
+ } else {
+ lookup_entry(fichier,part);
+ i=0;
+ strcpy(direc,"");
+ while (*sub_dir[i][0]!='\0') {
+#ifdef DEBUG
+ fprintf(stderr,"\tsubdir %s:%s\n",sub_dir[i][0],sub_dir[i][1]);
+#endif
+ if (strcmp(sub_dir[i][0],part)==0)
+ strcpy(direc,sub_dir[i][1]);
+ i++;
+ }
+ i=0;
+ while (*buffer[i]!='\0') {
+ strcat(files_to_copy,", ");
+ strcat(files_to_copy,direc);
+ strcat(files_to_copy,buffer[i]);
+ i++;
+ }
+ }
+ part=strtok(NULL,", ");
+ }
+ while (part!=NULL);
+}
+
+
+void scan_short_desc(FILE *fichier, char *short_desc)
+{
+ int i=0;
+ char *chaine;
+ char *temp;
+ char *copyfiles=0,*datasection=0,*datafile=0,*helpfile=0;
+
+ chaine=(char *)malloc(255*sizeof(char));
+ temp=(char *)malloc(255*sizeof(char));
+
+ driverfile=short_desc;
+
+ lookup_entry(fichier,short_desc);
+
+ while(*buffer[i]!='\0') {
+#ifdef DEBUG
+ fprintf(stderr,"\tLookup up of %s\n",buffer[i]);
+#endif
+ if (strncmp(buffer[i],"CopyFiles",9)==0) copyfiles=scan(buffer[i],&temp);
+ if (strncmp(buffer[i],"DataSection",11)==0) datasection=scan(buffer[i],&temp);
+ if (strncmp(buffer[i],"DataFile",8)==0) datafile=scan(buffer[i],&temp);
+ if (strncmp(buffer[i],"DriverFile",10)==0) driverfile=scan(buffer[i],&temp);
+ if (strncmp(buffer[i],"HelpFile",8)==0) helpfile=scan(buffer[i],&temp);
+ i++;
+ }
+ if (i) fprintf(stderr,"End of section found\n");
+
+ fprintf(stderr,"CopyFiles: %s\n",copyfiles);
+ fprintf(stderr,"Datasection: %s\n",datasection);
+ fprintf(stderr,"Datafile: %s\n",datafile);
+ fprintf(stderr,"Driverfile: %s\n",driverfile);
+ fprintf(stderr,"Helpfile: %s\n",helpfile);
+ if (copyfiles) scan_copyfiles(fichier,copyfiles);
+/* if (datasection) scan_copyfiles(fichier,datasection);*/
+ if (datafile) scan_copyfiles(fichier,datafile);
+ if (helpfile) scan_copyfiles(fichier,helpfile);
+}
+
+int main(int argc, char *argv[])
+{
+ char *short_desc;
+ FILE *inf_file;
+
+ if (argc!=3)
+ {
+ usage(argv[0]);
+ return(-1);
+ }
+
+ inf_file=fopen(argv[1],"r");
+ if (!inf_file)
+ {
+ fprintf(stderr,"Description file not found, bye\n");
+ return(-1);
+ }
+
+ short_desc=find_desc(inf_file,argv[2]);
+ if (short_desc==NULL)
+ {
+ fprintf(stderr,"Printer not found\n");
+ return(-1);
+ }
+ else fprintf(stderr,"Found:%s\n",short_desc);
+
+ lookup_entry(inf_file,"DestinationDirs");
+ build_subdir();
+
+ files_to_copy=(char *)malloc(2048*sizeof(char));
+ scan_short_desc(inf_file,short_desc);
+ fprintf(stdout,"%s:%s:%s:",argv[2],short_desc,driverfile);
+ fprintf(stdout,"%s\n",files_to_copy);
+ return 0;
+}
+