From ecb952f913e0532e4570753e479f8b8de14b0988 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 28 Oct 1997 23:58:31 +0000 Subject: 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 . (This used to be commit 6e9f817414d6f7bdcb0ea64170d0db34b62651a5) --- source3/utils/make_printerdef.c | 301 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 source3/utils/make_printerdef.c (limited to 'source3') 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; +} + -- cgit