flock-sysid-20030303
[openafs.git] / src / config / util_cr.c
1 /* crlf.c : Defines the entry point for the console application.*/
2
3 /* Copyright 2000, International Business Machines Corporation and others.
4         All Rights Reserved.
5  
6         This software has been released under the terms of the IBM Public
7         License.  For details, see the LICENSE file in the top-level source
8         directory or online at http://www.openafs.org/dl/license10.html
9 */
10
11 #include "stdio.h"
12 #include "io.h"
13 #include <assert.h>
14 #include "string.h"
15 #include "process.h"
16 #include "windows.h"
17 #include "malloc.h"
18 #include "time.h"
19
20 void usuage()
21 {
22         printf("util_cr file ;remove cr (from crlf)\n\
23         OR util_cr } ProductVersion in_filename out_filename ; substitute for %1-%5 in file\n\
24            %1=Major version, %2=Minor version, %3=Patch(first digit) %4=(last two digits) %5=Version display string \n\
25            ProductVersion=maj.min.pat.pat2 ;maj=numeric, min=numeric pat,pat2 are not more than 3 digits or 1-2 digits and one alpha \n\
26            e.g 1.0.4.1, 1.0.4 a 1.0.401, 1.0.4a  all represent the same version\n\
27         OR util_cr + file ;add cr\n \
28         OR util_cr * \"+[register key value] x=y\" ; add register key value\n\
29         OR util_cr * \"-[register key value]\" ; aremove register key value\n\
30         OR util_cr @ file.ini \"[SectionKey]variable=value\" ; update ini-ipr-pwf file\n\
31         OR util_cr @ file.ini \"[SectionKey]variable=value*DatE*\" ; update ini-ipr-pwf file, insert date\n\
32         OR util_cr ~  ;force error\n");
33         exit(0xc000);
34 }
35
36
37 void Addkey (const char *hkey,const char *subkey,const char *stag,const char *sval)
38 {
39         DWORD disposition,result;
40         HKEY kPkey,kHkey=0;
41         if (strcmp(hkey,"HKEY_CLASSES_ROOT")==0) kHkey=HKEY_CLASSES_ROOT;
42         if (strcmp(hkey,"HKEY_CURRENT_USER")==0) kHkey=HKEY_CURRENT_USER;
43         if (strcmp(hkey,"HKEY_LOCAL_MACHINE")==0) kHkey=HKEY_LOCAL_MACHINE;
44         if (kHkey==0)
45                 usuage();
46         result=(RegCreateKeyEx(kHkey    /*HKEY_LOCAL_MACHINE*/
47                 ,subkey
48                 ,0,NULL
49                 ,REG_OPTION_NON_VOLATILE
50                 ,KEY_ALL_ACCESS,NULL
51                 ,&kPkey
52                 ,&disposition)==ERROR_SUCCESS);
53         if(!result)
54         {
55                 printf("AFS Error - Could Not create a registration key\n");
56                 exit(0xc000);
57         }
58         if (stag==NULL) return;
59         if ((sval)&&(strlen(sval)))
60         {
61                 if (*stag=='@')
62                         result=RegSetValueEx(kPkey,"",0,REG_SZ,(CONST BYTE *)sval,strlen(sval));
63                 else
64                         result=RegSetValueEx(kPkey,stag,0,REG_SZ,(CONST BYTE *)sval,strlen(sval));
65         } else {
66
67                 if (*stag=='@')
68                         result=(RegSetValueEx(kPkey,"",0,REG_SZ,(CONST BYTE *)"",0));
69                 else
70                         result=(RegSetValueEx(kPkey,stag,0,REG_SZ,(CONST BYTE *)"",0));
71         }
72         if(result!=ERROR_SUCCESS)
73         {
74                 printf("AFS Error - Could Not create a registration key\n");
75                 exit(0xc000);
76         }
77 }
78
79 void Subkey(const char *hkey,const char *subkey)
80 {
81         DWORD result;
82         HKEY kHkey=0;
83         if (strcmp(hkey,"HKEY_CLASSES_ROOT")==0) kHkey=HKEY_CLASSES_ROOT;
84         if (strcmp(hkey,"HKEY_CURRENT_USER")==0) kHkey=HKEY_CURRENT_USER;
85         if (strcmp(hkey,"HKEY_LOCAL_MACHINE")==0) kHkey=HKEY_LOCAL_MACHINE;
86         if (kHkey==0)
87                 usuage();
88         result=RegDeleteKey(
89                 kHkey,
90                 subkey
91         );
92         if(result!=ERROR_SUCCESS)
93         {
94                 printf("AFS Error - Could Not create a registration key\n");
95                 exit(0xc000);
96         }
97 }
98
99 int main(int argc, char* argv[])
100 {
101         char fname[128];
102         FILE *file;
103         int l,i;
104         char **pvar,*ch;
105         long len;
106         typedef char * CHARP;
107
108         if (argc<3)
109                 usuage();
110         if (strcmp(argv[1],"}")==0)
111         {
112                 char v1[4],v2[4],v3[4],v4[4];
113                 char v5[132];
114                 char *ptr=NULL;
115                 char *buf;
116                 int maj;
117                 int min;
118                 int pat,pat2;
119                 strcpy(v5,argv[2]);
120                 if (argc<5)
121                         usuage();
122                 if ((ptr=strtok(argv[2],". \n"))==NULL)
123                         return 0;
124                 maj=atoi(ptr);
125                 if ((ptr=strtok(NULL,". \n"))==NULL)
126                         return 0;
127                 min=atoi(ptr);
128                 if ((ptr=strtok(NULL,". \n"))==NULL)
129                         return 0;
130                 pat2=-1;
131                 switch (strlen(ptr))
132                 {
133                 case 0:
134                         usuage();
135                 case 1:
136                         pat=atoi(ptr);
137                         if (isdigit(*ptr)!=0)
138                                 break;
139                         usuage();
140                 case 2: //ONLY 1.0.44 is interpreted as 1.0.4.4 or 1.0.4a as 1.0.4.a
141                         if (isdigit(*ptr)==0)
142                                 usuage();
143                         pat=*ptr-'0';
144                         ptr++;
145                         if (isalpha(*ptr)==0)
146                         {
147                                 pat2=atoi(ptr);
148                         } else if (isalpha(*ptr)!=0)
149                         {
150                                 pat2=tolower(*ptr)-'a'+1;
151                         } else 
152                                 usuage();
153                         break;                  
154                 case 3://1.0.401 or 1.0.40a are the same; 
155                         if ((isdigit(*ptr)==0)  // first 2 must be digit
156                                 || (isdigit(*(ptr+1)==0))
157                                 || (*(ptr+1)!='0' && isdigit(*(ptr+2))==0) // disallow 1.0.4b0  or 1.0.41a 
158                                 )
159                                 usuage();
160                         pat=*ptr-'0';
161                         ptr++;
162                         pat2=atoi(ptr);
163                         ptr++;
164                         if (isalpha(*ptr))
165                                 pat2=tolower(*ptr)-'a'+1;
166                         break;
167                 default:
168                         usuage();
169                 }
170                 // last can be 1-2 digits or one alpha (if pat2 hasn't been set)
171                 if ((ptr=strtok(NULL,". \n"))!=NULL)
172                 {
173                         if (pat2>=0)
174                                 usuage();
175                         switch (strlen(ptr))
176                         {
177                         case 1:
178                                 pat2=(isdigit(*ptr))?atoi(ptr):tolower(*ptr)-'a'+1;
179                                 break;
180                         case 2:
181                                 if ( 
182                                         isdigit(*ptr)==0 
183                                         || isdigit(*(ptr+1))==0
184                                         ) 
185                                         usuage();
186                                 pat2=atoi(ptr);
187                         default:
188                                 usuage();
189                         }
190                 }
191                 file=fopen(argv[3],"r");
192                 if (file==NULL)
193                         usuage();
194                 len=filelength(_fileno(file));
195                 buf=(char *)malloc(len+1);
196                 len=fread(buf,sizeof(char),len,file);
197                 buf[len]=0;     //set eof
198                 fclose(file);
199                 file=fopen(argv[4],"w");
200                 if (file==NULL)
201                         usuage();
202                 sprintf(v1,"%i",maj);
203                 sprintf(v2,"%i",min);
204                 sprintf(v3,"%i",pat);
205                 sprintf(v4,"%02i",pat2);
206                 while (1)
207                 {
208                         ptr=strstr(buf,"%");
209                         fwrite(buf,1,(ptr)?ptr-buf:strlen(buf),file);   //write file if no % found or up to %
210                         if (ptr==NULL)
211                                 break;
212                         switch (*(ptr+1))       //skip first scan if buf="1...."
213                         {
214                         case '1':
215                                 fwrite(v1,1,strlen(v1),file);
216                                 ptr++;
217                                 break;                          
218                         case '2':
219                                 fwrite(v2,1,strlen(v2),file);
220                                 ptr++;
221                                 break;                          
222                         case '3':
223                                 fwrite(v3,1,strlen(v3),file);
224                                 ptr++;
225                                 break;                          
226                         case '4':
227                                 fwrite(v4,1,strlen(v4),file);
228                                 ptr++;
229                                 break;                          
230                         case '5':
231                                 fwrite(v5,1,strlen(v5),file);
232                                 ptr++;
233                                 break;
234                         default:
235                                 fwrite("%",1,1,file);   //either % at end of file or no %1...
236                                 break;
237                         }
238                         buf=ptr+1;
239                 }
240                 fclose(file);
241                 return 0;
242         }
243         if (strcmp(argv[1],"~")==0)
244         {       //check for file presence
245                 if (fopen(argv[2],"r"))
246                         return(0);
247                 if(argc<4)
248                         printf("ERROR --- File not present %s\n",argv[2]);
249                 else 
250                         printf("Error---%s\n",argv[3]);
251                 exit(0xc000);
252         }
253         if (strcmp(argv[1],"*")==0)
254         {               /* "[HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}]  @=AFS Client Shell Extension" */
255                 if (argc<3)
256                         usuage();
257                 for (i=2;argc>=3;i++)
258                 {
259                         char *ssub=strtok(argv[i],"[");
260                         BOOL option;
261                         char *skey=strtok(NULL,"]");
262                         char *sval,*stag;
263                         if ((ssub==NULL) || (skey==NULL))
264                         {
265                                 printf("format error parameter %s\n",argv[i]);
266                                 exit(0xc000);
267                         }
268                         option=(*ssub=='-');
269                         stag=strtok(NULL,"\0");
270                         if (stag)
271                         while(*stag==' ') 
272                                 stag++;
273                         ssub=strtok(skey,"\\");
274                         ssub=strtok(NULL,"\0");
275                         sval=strtok(stag,"=");
276                         sval=strtok(NULL,"\0");
277                         switch (option)
278                         {
279                         case 0:
280                                 Addkey (skey,ssub,stag,sval);
281                                 break;
282                         default :
283                                 if (stag)
284                                         Addkey (skey,ssub,stag,"");
285                                 else
286                                         Subkey(skey,ssub);
287                                 break;
288                         }
289
290                         argc-=1;
291                 }
292                 return 0;
293         }
294         if (strcmp(argv[1],"@")==0)
295         {
296                 char msg[256],msgt[256];
297                 char *ptr;
298                 if (argc<4)
299                         usuage();
300                 for (i=3;argc>=4;i++)
301                 {
302
303                         char *ssect=strstr(argv[i],"[");
304                         char *skey=strstr(ssect,"]");
305                         char *sval;
306                         if ((ssect==NULL) || (skey==NULL))
307                         {
308                                 printf("format error parameter %s\n",argv[i]);
309                                 exit(0xc000);
310                         }
311                         ssect++;
312                         *skey=0;
313                         if ((strlen(skey+1)==0)||(strlen(ssect)==0))
314                         {
315                                 printf("format error parameter %s\n",argv[i]);
316                                 exit(0xc000);
317                         }
318                         while(*++skey==' ');
319                         sval=strstr(skey,"=");
320                         if (sval==NULL)
321                         {
322                                 printf("format error parameter %s\n",argv[i]);
323                                 exit(0xc000);
324                         }
325                         ptr=sval;
326                         while(*--ptr==' ') ;
327                         *(ptr+1)=0;
328                         while(*++sval==' ') ;
329                         if (ptr=strstr(sval,"*DatE*"))
330                         {// ok so lets substitute date in this string;
331                                 char tmpbuf[32];
332                                 *(ptr)=0;
333                                 strcpy(msg,sval);
334                             _tzset();
335                             _strdate( tmpbuf );
336                                 strcat(msg,tmpbuf);
337                                 strcat(msg,ptr+6);
338                                 sval=msg;
339                         }
340                         if (ptr=strstr(sval,"*TimE*"))
341                         {
342                                 char tmpbuf[32];
343                                 *(ptr)=0;
344                                 strcpy(msgt,sval);
345                             _strtime( tmpbuf );
346                                 strncat(msgt,tmpbuf,5);
347                                 strcat(msgt,ptr+6);
348                                 sval=msgt;
349                         }
350                         if (WritePrivateProfileString(ssect,skey,sval,argv[2])==0)
351                         {
352                                 LPVOID lpMsgBuf;
353                                 FormatMessage( 
354                                         FORMAT_MESSAGE_ALLOCATE_BUFFER | 
355                                         FORMAT_MESSAGE_FROM_SYSTEM | 
356                                         FORMAT_MESSAGE_IGNORE_INSERTS,
357                                         NULL,
358                                         GetLastError(),
359                                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
360                                         (LPTSTR) &lpMsgBuf,
361                                         0,
362                                         NULL 
363                                 );
364                                 printf("Error writing profile string - %s",lpMsgBuf);
365                                 LocalFree( lpMsgBuf );
366                                 exit(0xc000);
367                         }
368                         argc-=1;
369                 }
370                 return 0;
371         }
372         strcpy(fname,argv[2]);
373         if (strcmp(argv[1],"+")==0)
374         {
375                 file=fopen(fname,"rb");
376                 if (file==NULL)
377                         exit(0xc000);
378                 len=filelength(_fileno(file));
379                 ch=(char *)malloc(len+2);
380                 *ch++=0;        /* a small hack to allow matching /r/n if /n is first character*/
381                 len=fread(ch,sizeof(char),len,file);
382                 file=freopen(fname,"wb",file);
383                 while (len-->0)
384                 {
385                         if ((*ch=='\n') && (*(ch-1)!='\r')) /*line feed alone*/
386                         {
387                                 fputc('\r',file);
388                         }
389                         fputc(*ch,file);
390                         ch++;
391                 }
392                 fclose(file);
393                 return 0;
394         }
395         if (strcmp(argv[1],"-")==0)
396         {
397                 strcpy(fname,argv[2]);
398                 file=fopen(fname,"rb");
399                 if (file==NULL)
400                         exit(0xc000);
401                 len=filelength(_fileno(file));
402                 ch=(char *)malloc(len+1);
403                 len=fread(ch,sizeof(char),len,file);
404                 file=freopen(fname,"wb",file);
405                 while (len-->0)
406                 {
407                         if (*ch!='\r')
408                                 fputc(*ch,file);
409                         ch++;
410                 }
411                 fclose(file);
412                 return 0;
413         }
414         if (strstr(fname,".et")==NULL)
415                 strcat(fname,".et");
416         file=fopen(fname,"rb");
417         if (file==NULL)
418                 exit(0xc000);
419         len=filelength(_fileno(file));
420         ch=(char *)malloc(len+1);
421         len=fread(ch,sizeof(char),len,file);
422         file=freopen(fname,"wb",file);
423         while (len-->0)
424         {
425                 if (*ch!='\r')
426                         fputc(*ch,file);
427                 ch++;
428         }
429         fclose(file);
430         pvar=(CHARP *)malloc(argc*sizeof(CHARP));
431         for (i=1;i<argc-1;i++)
432                 pvar[i]=argv[i+1];
433         pvar[argc-1]=NULL;
434         pvar[0]=argv[1];
435         l=_spawnvp(_P_WAIT,argv[1],pvar);
436         if (ch)
437                 free(ch);
438         if (pvar)
439                 free(pvar);
440         return 0;
441 }