xref: /trunk/main/solenv/bin/modules/installer/systemactions.pm (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1#*************************************************************************
2#
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# Copyright 2000, 2010 Oracle and/or its affiliates.
6#
7# OpenOffice.org - a multi-platform office productivity suite
8#
9# This file is part of OpenOffice.org.
10#
11# OpenOffice.org is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Lesser General Public License version 3
13# only, as published by the Free Software Foundation.
14#
15# OpenOffice.org is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU Lesser General Public License version 3 for more details
19# (a copy is included in the LICENSE file that accompanied this code).
20#
21# You should have received a copy of the GNU Lesser General Public License
22# version 3 along with OpenOffice.org.  If not, see
23# <http://www.openoffice.org/license.html>
24# for a copy of the LGPLv3 License.
25#
26#*************************************************************************
27
28package installer::systemactions;
29
30use Cwd;
31use File::Copy;
32use installer::converter;
33use installer::exiter;
34use installer::globals;
35use installer::pathanalyzer;
36use installer::remover;
37
38######################################################
39# Creating a new direcotory
40######################################################
41
42sub create_directory
43{
44    my ($directory) = @_;
45
46    my $returnvalue = 1;
47    my $infoline = "";
48
49    if (!(-d $directory))
50    {
51        $returnvalue = mkdir($directory, 0775);
52
53        if ($returnvalue)
54        {
55            $infoline = "\nCreated directory: $directory\n";
56            push(@installer::globals::logfileinfo, $infoline);
57
58            my $localcall = "chmod 0775 $directory \>\/dev\/null 2\>\&1";
59            system($localcall);
60
61            # chmod 0775 is not sufficient on mac to remove sticky tag
62            $localcall = "chmod a-s $directory \>\/dev\/null 2\>\&1";
63            system($localcall);
64        }
65        else
66        {
67            # New solution in parallel packing: It is possible, that the directory now exists, although it
68            # was not created in this process. There is only an important error, if the directory does not
69            # exist now.
70
71            $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n";
72            push(@installer::globals::logfileinfo, $infoline);
73
74            if (!(-d $directory))
75            {
76                # Problem with parallel packaging? -> Try a little harder, before exiting.
77                # Did someone else remove the parent directory in the meantime?
78                my $parentdir = $directory;
79                installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir);
80                if (!(-d $parentdir))
81                {
82                    $returnvalue = mkdir($parentdir, 0775);
83
84                    if ($returnvalue)
85                    {
86                        $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n";
87                        push(@installer::globals::logfileinfo, $infoline);
88
89                        my $localcall = "chmod 775 $parentdir \>\/dev\/null 2\>\&1";
90                        system($localcall);
91                    }
92                    else
93                    {
94                        $infoline = "\Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n";
95                        push(@installer::globals::logfileinfo, $infoline);
96                        if ( -d $parentdir )
97                        {
98                            $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n";
99                            push(@installer::globals::logfileinfo, $infoline);
100                        }
101                        else
102                        {
103                            # Now it is time to exit, even the parent could not be created.
104                            installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory");
105                        }
106                    }
107                }
108
109                # At this point we have to assume, that the parent directory exist.
110                # Trying once more to create the desired directory
111
112                $returnvalue = mkdir($directory, 0775);
113
114                if ($returnvalue)
115                {
116                    $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n";
117                    push(@installer::globals::logfileinfo, $infoline);
118
119                    my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1";
120                    system($localcall);
121                }
122                else
123                {
124                    if ( -d $directory )
125                    {
126                        $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n";
127                        push(@installer::globals::logfileinfo, $infoline);
128                    }
129                    else
130                    {
131                        # It is time to exit, even the second try failed.
132                        installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory");
133                    }
134                }
135            }
136            else
137            {
138                $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n";
139                push(@installer::globals::logfileinfo, $infoline);
140            }
141        }
142    }
143    else
144    {
145        $infoline = "\nAlready existing directory, did not create: $directory\n";
146        push(@installer::globals::logfileinfo, $infoline);
147    }
148}
149
150######################################################
151# Creating a new direcotory with defined privileges
152######################################################
153
154sub create_directory_with_privileges
155{
156    my ($directory, $privileges) = @_;
157
158    my $returnvalue = 1;
159    my $infoline = "";
160
161    if (!(-d $directory))
162    {
163        my $localprivileges = oct("0".$privileges); # changes "777" to 0777
164        $returnvalue = mkdir($directory, $localprivileges);
165
166        if ($returnvalue)
167        {
168            $infoline = "\nCreated directory: $directory\n";
169            push(@installer::globals::logfileinfo, $infoline);
170
171            my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1";
172            system($localcall);
173        }
174        else
175        {
176            # New solution in parallel packing: It is possible, that the directory now exists, although it
177            # was not created in this process. There is only an important error, if the directory does not
178            # exist now.
179
180            $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n";
181            push(@installer::globals::logfileinfo, $infoline);
182
183            if (!(-d $directory))
184            {
185                # Problem with parallel packaging? -> Try a little harder, before exiting.
186                # Did someone else remove the parent directory in the meantime?
187                my $parentdir = $directory;
188                installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir);
189                if (!(-d $parentdir))
190                {
191                    $returnvalue = mkdir($directory, $localprivileges);
192
193                    if ($returnvalue)
194                    {
195                        $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n";
196                        push(@installer::globals::logfileinfo, $infoline);
197
198                        my $localcall = "chmod $privileges $parentdir \>\/dev\/null 2\>\&1";
199                        system($localcall);
200                    }
201                    else
202                    {
203                        $infoline = "\Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n";
204                        push(@installer::globals::logfileinfo, $infoline);
205                        if ( -d $parentdir )
206                        {
207                            $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n";
208                            push(@installer::globals::logfileinfo, $infoline);
209                        }
210                        else
211                        {
212                            # Now it is time to exit, even the parent could not be created.
213                            installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory_with_privileges");
214                        }
215                    }
216                }
217
218                # At this point we have to assume, that the parent directory exist.
219                # Trying once more to create the desired directory
220
221                $returnvalue = mkdir($directory, $localprivileges);
222
223                if ($returnvalue)
224                {
225                    $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n";
226                    push(@installer::globals::logfileinfo, $infoline);
227
228                    my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1";
229                    system($localcall);
230                }
231                else
232                {
233                    if ( -d $directory )
234                    {
235                        $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n";
236                        push(@installer::globals::logfileinfo, $infoline);
237                    }
238                    else
239                    {
240                        # It is time to exit, even the second try failed.
241                        installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory_with_privileges");
242                    }
243                }
244            }
245            else
246            {
247                $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n";
248                push(@installer::globals::logfileinfo, $infoline);
249            }
250        }
251    }
252    else
253    {
254        $infoline = "\nAlready existing directory, did not create: $directory\n";
255        push(@installer::globals::logfileinfo, $infoline);
256
257        my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1";
258        system($localcall);
259    }
260}
261
262######################################################
263# Removing a new direcotory
264######################################################
265
266sub remove_empty_directory
267{
268    my ($directory) = @_;
269
270    my $returnvalue = 1;
271
272    if (-d $directory)
273    {
274        my $systemcall = "rmdir $directory";
275
276        $returnvalue = system($systemcall);
277
278        my $infoline = "Systemcall: $systemcall\n";
279        push( @installer::globals::logfileinfo, $infoline);
280
281        if ($returnvalue)
282        {
283            $infoline = "ERROR: Could not remove \"$directory\"!\n";
284            push( @installer::globals::logfileinfo, $infoline);
285        }
286        else
287        {
288            $infoline = "Success: Removed \"$directory\"!\n";
289            push( @installer::globals::logfileinfo, $infoline);
290        }
291    }
292}
293
294#######################################################################
295# Calculating the number of languages in the string
296#######################################################################
297
298sub get_number_of_langs
299{
300    my ($languagestring) = @_;
301
302    my $number = 1;
303
304    my $workstring = $languagestring;
305
306    while ( $workstring =~ /^\s*(.*)_(.*?)\s*$/ )
307    {
308        $workstring = $1;
309        $number++;
310    }
311
312    return $number;
313}
314
315#######################################################################
316# Creating the directories, in which files are generated or unzipped
317#######################################################################
318
319sub create_directories
320{
321    my ($newdirectory, $languagesref) =@_;
322
323    $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//;  # removing ending slashes and backslashes
324
325    my $path = "";
326
327    if (( $newdirectory eq "uno" ) || ( $newdirectory eq "zip" ) || ( $newdirectory eq "cab" ) || ( $newdirectory =~ /rdb\s*$/i )) # special handling for zip files, cab files and services file because of performance reasons
328    {
329        if ( $installer::globals::temppathdefined ) { $path = $installer::globals::temppath; }
330        else { $path = $installer::globals::unpackpath; }
331        $path =~ s/\Q$installer::globals::separator\E\s*$//;    # removing ending slashes and backslashes
332        $path = $path . $installer::globals::separator;
333    }
334    elsif ( ( $newdirectory eq "jds" ) )
335    {
336        if ( $installer::globals::jdstemppathdefined ) { $path = $installer::globals::jdstemppath; }
337        else { $path = $installer::globals::unpackpath; }
338        $path =~ s/\Q$installer::globals::separator\E\s*$//;    # removing ending slashes and backslashes
339        $path = $path . $installer::globals::separator;
340        installer::systemactions::create_directory($path);
341    }
342    else
343    {
344        $path = $installer::globals::unpackpath . $installer::globals::separator;
345
346        # special handling, if LOCALINSTALLDIR is set
347        if (( $installer::globals::localinstalldirset ) && ( $newdirectory eq "install" ))
348        {
349            $installer::globals::localinstalldir =~ s/\Q$installer::globals::separator\E\s*$//;
350            $path = $installer::globals::localinstalldir . $installer::globals::separator;
351        }
352    }
353
354    $infoline = "create_directories: Using $path for $newdirectory !\n";
355    push( @installer::globals::logfileinfo, $infoline);
356
357    if ($newdirectory eq "unzip" )  # special handling for common directory
358    {
359        $path = $path  . ".." . $installer::globals::separator . "common" . $installer::globals::productextension . $installer::globals::separator;
360        create_directory($path);
361
362        $path = $path . $newdirectory . $installer::globals::separator;
363        create_directory($path);
364    }
365    else
366    {
367        my $localproductname = $installer::globals::product;
368        my $localproductsubdir = "";
369
370        if ( $installer::globals::product =~ /^\s*(.+?)\_\_(.+?)\s*$/ )
371        {
372            $localproductname = $1;
373            $localproductsubdir = $2;
374        }
375
376        if ( $installer::globals::languagepack ) { $path = $path . $localproductname . "_languagepack" . $installer::globals::separator; }
377        elsif ( $installer::globals::patch ) { $path = $path . $localproductname . "_patch" . $installer::globals::separator; }
378        else { $path = $path . $localproductname . $installer::globals::separator; }
379
380        create_directory($path);
381
382        if ( $localproductsubdir )
383        {
384            $path = $path . $localproductsubdir . $installer::globals::separator;
385            create_directory($path);
386        }
387
388        $path = $path . $installer::globals::installertypedir . $installer::globals::separator;
389        create_directory($path);
390
391        $path = $path . $newdirectory . $installer::globals::separator;
392        create_directory($path);
393
394        my $locallanguagesref = "";
395
396        if ( $$languagesref ) { $locallanguagesref = $$languagesref; }
397
398        if (!($locallanguagesref eq "" ))   # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files
399        {
400            my $languagestring = $$languagesref;
401
402            if (length($languagestring) > $installer::globals::max_lang_length )
403            {
404                my $number_of_languages = get_number_of_langs($languagestring);
405                chomp(my $shorter = `echo $languagestring | md5sum | sed -e "s/ .*//g"`);
406                # $languagestring = $shorter;
407                my $id = substr($shorter, 0, 8); # taking only the first 8 digits
408                $languagestring = "lang_" . $number_of_languages . "_id_" . $id;
409            }
410
411            $path = $path . $languagestring  . $installer::globals::separator;
412            create_directory($path);
413        }
414    }
415
416    installer::remover::remove_ending_pathseparator(\$path);
417
418    $path = installer::converter::make_path_conform($path);
419
420    return $path;
421}
422
423########################
424# Copying one file
425########################
426
427sub copy_one_file
428{
429    my ($source, $dest) = @_;
430
431    my ($returnvalue, $infoline);
432
433    my $copyreturn = copy($source, $dest);
434
435    if ($copyreturn)
436    {
437        $infoline = "Copy: $source to $dest\n";
438        $returnvalue = 1;
439    }
440    else
441    {
442        $infoline = "ERROR: Could not copy $source to $dest\n";
443        $returnvalue = 0;
444    }
445
446    push(@installer::globals::logfileinfo, $infoline);
447
448    if ( !$returnvalue ) {
449        return $returnvalue;
450    }
451
452    # taking care of file attributes
453    if ($installer::globals::iswin && -f $dest) {
454        my $mode = -x $source ? 0775 : 0664;
455        my $mode_str = sprintf("%o", $mode);
456        my $chmodreturn = chmod($mode, $dest);
457        if ($chmodreturn)
458        {
459            $infoline = "chmod $mode_str, $dest\n";
460            $returnvalue = 1;
461        }
462        else
463        {
464            $infoline = "WARNING: Could not chmod $dest: $!\n";
465            $returnvalue = 0;
466        }
467
468        push(@installer::globals::logfileinfo, $infoline);
469    }
470
471    return $returnvalue;
472}
473
474##########################
475# Hard linking one file
476##########################
477
478sub hardlink_one_file
479{
480    my ($source, $dest) = @_;
481
482    my ($returnvalue, $infoline);
483
484    my $copyreturn = link($source, $dest);
485
486    if ($copyreturn)
487    {
488        $infoline = "Link: $source to $dest\n";
489        $returnvalue = 1;
490    }
491    else
492    {
493        $infoline = "ERROR: Could not link $source to $dest\n";
494        $returnvalue = 0;
495    }
496
497    push(@installer::globals::logfileinfo, $infoline);
498
499    return $returnvalue;
500}
501
502##########################
503# Soft linking one file
504##########################
505
506sub softlink_one_file
507{
508    my ($source, $dest) = @_;
509
510    my ($returnvalue, $infoline);
511
512    my $linkreturn = symlink($source, $dest);
513
514    if ($linkreturn)
515    {
516        $infoline = "Symlink: $source to $dest\n";
517        $returnvalue = 1;
518    }
519    else
520    {
521        $infoline = "ERROR: Could not symlink $source to $dest\n";
522        $returnvalue = 0;
523    }
524
525    push(@installer::globals::logfileinfo, $infoline);
526
527    return $returnvalue;
528}
529
530########################
531# Renaming one file
532########################
533
534sub rename_one_file
535{
536    my ($source, $dest) = @_;
537
538    my ($returnvalue, $infoline);
539
540    my $renamereturn = rename($source, $dest);
541
542    if ($renamereturn)
543    {
544        $infoline = "Rename: $source to $dest\n";
545        $returnvalue = 1;
546    }
547    else
548    {
549        $infoline = "ERROR: Could not rename $source to $dest\n";
550        $returnvalue = 0;
551    }
552
553    push(@installer::globals::logfileinfo, $infoline);
554
555    return $returnvalue;
556}
557
558##########################################
559# Copying all files from one directory
560# to another directory
561##########################################
562
563sub copy_directory
564{
565    my ($sourcedir, $destdir) = @_;
566
567    my @sourcefiles = ();
568
569    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
570    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
571
572    my $infoline = "\n";
573    push(@installer::globals::logfileinfo, $infoline);
574    $infoline = "Copying files from directory $sourcedir to directory $destdir\n";
575    push(@installer::globals::logfileinfo, $infoline);
576
577    opendir(DIR, $sourcedir);
578    @sourcefiles = readdir(DIR);
579    closedir(DIR);
580
581    my $onefile;
582
583    foreach $onefile (@sourcefiles)
584    {
585        if ((!($onefile eq ".")) && (!($onefile eq "..")))
586        {
587            my $sourcefile = $sourcedir . $installer::globals::separator . $onefile;
588            my $destfile = $destdir . $installer::globals::separator . $onefile;
589            if ( -f $sourcefile )   # only files, no directories
590            {
591                copy_one_file($sourcefile, $destfile);
592            }
593        }
594    }
595}
596
597##########################################
598# Copying all files from one directory
599# to another directory
600##########################################
601
602sub is_empty_dir
603{
604    my ($dir) = @_;
605
606    my $directory_is_empty = 1;
607    my @sourcefiles = ();
608
609    opendir(DIR, $dir);
610    @sourcefiles = readdir(DIR);
611    closedir(DIR);
612
613    my $onefile;
614    my @realcontent = ();
615
616    foreach $onefile (@sourcefiles)
617    {
618        if ((!($onefile eq ".")) && (!($onefile eq "..")))
619        {
620            push(@realcontent, $onefile);
621        }
622    }
623
624    if ( $#realcontent > -1 ) { $directory_is_empty = 0; }
625
626    return $directory_is_empty;
627}
628
629#####################################################################
630# Creating hard links to a complete directory with sub directories.
631#####################################################################
632
633sub hardlink_complete_directory
634{
635    my ($sourcedir, $destdir) = @_;
636
637    my @sourcefiles = ();
638
639    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
640    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
641
642    if ( ! -d $destdir ) { create_directory($destdir); }
643
644    my $infoline = "\n";
645    push(@installer::globals::logfileinfo, $infoline);
646    $infoline = "Creating hard links for all files from directory $sourcedir to directory $destdir\n";
647    push(@installer::globals::logfileinfo, $infoline);
648
649    opendir(DIR, $sourcedir);
650    @sourcefiles = readdir(DIR);
651    closedir(DIR);
652
653    my $onefile;
654
655    foreach $onefile (@sourcefiles)
656    {
657        if ((!($onefile eq ".")) && (!($onefile eq "..")))
658        {
659            my $source = $sourcedir . $installer::globals::separator . $onefile;
660            my $dest = $destdir . $installer::globals::separator . $onefile;
661            if ( -f $source )   # only files, no directories
662            {
663                hardlink_one_file($source, $dest);
664            }
665            if ( -d $source )   # recursive
666            {
667                hardlink_complete_directory($source, $dest);
668            }
669        }
670    }
671}
672
673#####################################################################
674# Creating hard links to a complete directory with sub directories.
675#####################################################################
676
677sub softlink_complete_directory
678{
679    my ($sourcedir, $destdir, $depth) = @_;
680
681    my @sourcefiles = ();
682
683    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
684    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
685
686    if ( ! -d $destdir ) { create_directory($destdir); }
687
688    my $infoline = "\n";
689    push(@installer::globals::logfileinfo, $infoline);
690    $infoline = "Creating soft links for all files from directory $sourcedir to directory $destdir\n";
691    push(@installer::globals::logfileinfo, $infoline);
692
693    opendir(DIR, $sourcedir);
694    @sourcefiles = readdir(DIR);
695    closedir(DIR);
696
697    my $onefile;
698
699    foreach $onefile (@sourcefiles)
700    {
701        if ((!($onefile eq ".")) && (!($onefile eq "..")))
702        {
703            my $source = $sourcedir . $installer::globals::separator . $onefile;
704            my $dest = $destdir . $installer::globals::separator . $onefile;
705            if ( -f $source )   # only files, no directories
706            {
707                my $localsource = $source;
708                if ( $depth > 0 ) { for ( my $i = 1; $i <= $depth; $i++ ) { $localsource = "../" . $localsource; } }
709                softlink_one_file($localsource, $dest);
710            }
711            if ( -d $source )   # recursive
712            {
713                my $newdepth = $depth + 1;
714                softlink_complete_directory($source, $dest, $newdepth);
715            }
716        }
717    }
718}
719
720#####################################################
721# Copying a complete directory with sub directories.
722#####################################################
723
724sub copy_complete_directory
725{
726    my ($sourcedir, $destdir) = @_;
727
728    my @sourcefiles = ();
729
730    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
731    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
732
733    if ( ! -d $destdir ) { create_directory($destdir); }
734
735    my $infoline = "\n";
736    push(@installer::globals::logfileinfo, $infoline);
737    $infoline = "Copying files from directory $sourcedir to directory $destdir\n";
738    push(@installer::globals::logfileinfo, $infoline);
739
740    opendir(DIR, $sourcedir);
741    @sourcefiles = readdir(DIR);
742    closedir(DIR);
743
744    my $onefile;
745
746    foreach $onefile (@sourcefiles)
747    {
748        if ((!($onefile eq ".")) && (!($onefile eq "..")))
749        {
750            my $source = $sourcedir . $installer::globals::separator . $onefile;
751            my $dest = $destdir . $installer::globals::separator . $onefile;
752            if ( -f $source )   # only files, no directories
753            {
754                copy_one_file($source, $dest);
755            }
756            if ( -d $source )   # recursive
757            {
758                if ((!( $source =~ /packages\/SUNW/ )) && (!( $source =~ /packages\/OOO/ )))    # do not copy complete Solaris packages!
759                {
760                    copy_complete_directory($source, $dest);
761                }
762            }
763        }
764    }
765}
766
767#####################################################################################
768# Copying a complete directory with sub directories, but not the CVS directories.
769#####################################################################################
770
771sub copy_complete_directory_without_cvs
772{
773    my ($sourcedir, $destdir) = @_;
774
775    my @sourcefiles = ();
776
777    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
778    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
779
780    if ( ! -d $destdir ) { create_directory($destdir); }
781
782    my $infoline = "\n";
783    push(@installer::globals::logfileinfo, $infoline);
784    $infoline = "Copying files from directory $sourcedir to directory $destdir (without CVS)\n";
785    push(@installer::globals::logfileinfo, $infoline);
786
787    opendir(DIR, $sourcedir);
788    @sourcefiles = readdir(DIR);
789    closedir(DIR);
790
791    my $onefile;
792
793    foreach $onefile (@sourcefiles)
794    {
795        if ((!($onefile eq ".")) && (!($onefile eq "..")) && (!($onefile eq "CVS")))
796        {
797            my $source = $sourcedir . $installer::globals::separator . $onefile;
798            my $dest = $destdir . $installer::globals::separator . $onefile;
799            if ( -f $source )   # only files, no directories
800            {
801                copy_one_file($source, $dest);
802            }
803            if ( -d $source )   # recursive
804            {
805                copy_complete_directory_without_cvs($source, $dest);
806            }
807        }
808    }
809}
810
811#####################################################
812# Copying all files with a specified file extension
813# from one directory to another directory.
814#####################################################
815
816sub copy_directory_with_fileextension
817{
818    my ($sourcedir, $destdir, $extension) = @_;
819
820    my @sourcefiles = ();
821
822    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
823    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
824
825    $infoline = "\n";
826    push(@installer::globals::logfileinfo, $infoline);
827    $infoline = "Copying files with extension $extension from directory $sourcedir to directory $destdir\n";
828    push(@installer::globals::logfileinfo, $infoline);
829
830    opendir(DIR, $sourcedir);
831    @sourcefiles = readdir(DIR);
832    closedir(DIR);
833
834    my $onefile;
835
836    foreach $onefile (@sourcefiles)
837    {
838        if ((!($onefile eq ".")) && (!($onefile eq "..")))
839        {
840            if ( $onefile =~ /\.$extension\s*$/ )   # only copying specified files
841            {
842                my $sourcefile = $sourcedir . $installer::globals::separator . $onefile;
843                my $destfile = $destdir . $installer::globals::separator . $onefile;
844                if ( -f $sourcefile )   # only files, no directories
845                {
846                    copy_one_file($sourcefile, $destfile);
847                }
848            }
849        }
850    }
851}
852
853#########################################################
854# Copying all files without a specified file extension
855# from one directory to another directory.
856#########################################################
857
858sub copy_directory_except_fileextension
859{
860    my ($sourcedir, $destdir, $extension) = @_;
861
862    my @sourcefiles = ();
863
864    $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
865    $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
866
867    $infoline = "\n";
868    push(@installer::globals::logfileinfo, $infoline);
869    $infoline = "Copying files without extension $extension from directory $sourcedir to directory $destdir\n";
870    push(@installer::globals::logfileinfo, $infoline);
871
872    opendir(DIR, $sourcedir);
873    @sourcefiles = readdir(DIR);
874    closedir(DIR);
875
876    my $onefile;
877
878    foreach $onefile (@sourcefiles)
879    {
880        if ((!($onefile eq ".")) && (!($onefile eq "..")))
881        {
882            if ( ! ( $onefile =~ /\.$extension\s*$/ ))  # only copying not having the specified extension
883            {
884                my $sourcefile = $sourcedir . $installer::globals::separator . $onefile;
885                my $destfile = $destdir . $installer::globals::separator . $onefile;
886                if ( -f $sourcefile )   # only files, no directories
887                {
888                    copy_one_file($sourcefile, $destfile);
889                }
890            }
891        }
892    }
893}
894
895########################################################
896# Renaming all files with a specified file extension
897# in a specified directory.
898# Example: "Feature.idt.01" -> "Feature.idt"
899########################################################
900
901sub rename_files_with_fileextension
902{
903    my ($dir, $extension) = @_;
904
905    my @sourcefiles = ();
906
907    $dir =~ s/\Q$installer::globals::separator\E\s*$//;
908
909    my $infoline = "\n";
910    push(@installer::globals::logfileinfo, $infoline);
911    $infoline = "Renaming files with extension \"$extension\" in the directory $dir\n";
912    push(@installer::globals::logfileinfo, $infoline);
913
914    opendir(DIR, $dir);
915    @sourcefiles = readdir(DIR);
916    closedir(DIR);
917
918    my $onefile;
919
920    foreach $onefile (@sourcefiles)
921    {
922        if ((!($onefile eq ".")) && (!($onefile eq "..")))
923        {
924            if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ )    # only renaming specified files
925            {
926                my $destfile = $1;
927                my $sourcefile = $dir . $installer::globals::separator . $onefile;
928                $destfile = $dir . $installer::globals::separator . $destfile;
929                if ( -f $sourcefile )   # only files, no directories
930                {
931                    rename_one_file($sourcefile, $destfile);
932                }
933            }
934        }
935    }
936}
937
938########################################################
939# Finding all files with a specified file extension
940# in a specified directory.
941########################################################
942
943sub find_file_with_file_extension
944{
945    my ($extension, $dir) = @_;
946
947    my @allfiles = ();
948
949    $dir =~ s/\Q$installer::globals::separator\E\s*$//;
950
951    my $infoline = "\n";
952    push(@installer::globals::logfileinfo, $infoline);
953    $infoline = "Searching files with extension \"$extension\" in the directory $dir\n";
954    push(@installer::globals::logfileinfo, $infoline);
955
956    opendir(DIR, $dir);
957    @sourcefiles = sort readdir(DIR);
958    closedir(DIR);
959
960    my $onefile;
961
962    foreach $onefile (@sourcefiles)
963    {
964        if ((!($onefile eq ".")) && (!($onefile eq "..")))
965        {
966            if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ )
967            {
968                push(@allfiles, $onefile)
969            }
970        }
971    }
972
973    return \@allfiles;
974}
975
976##############################################################
977# Creating a unique directory, for example "01_inprogress_7"
978# in the install directory.
979##############################################################
980
981sub make_numbered_dir
982{
983    my ($newstring, $olddir) = @_;
984
985    my $basedir = $olddir;
986    installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir);
987
988    my $alldirs = get_all_directories($basedir);
989
990    # searching for the highest number extension
991
992    my $maxnumber = 0;
993
994    for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
995    {
996        if ( ${$alldirs}[$i] =~ /\_(\d+)\s*$/ )
997        {
998            my $number = $1;
999            if ( $number > $maxnumber ) { $maxnumber = $number; }
1000        }
1001    }
1002
1003    my $newnumber = $maxnumber + 1;
1004
1005    my $newdir = $olddir . "_" . $newstring . "_" . $newnumber;
1006
1007    my $returndir = "";
1008
1009    if ( move($olddir, $newdir) )
1010    {
1011        $infoline = "\nMoved directory from $olddir to $newdir\n";
1012        push(@installer::globals::logfileinfo, $infoline);
1013        $returndir = $newdir;
1014    }
1015    else
1016    {
1017        $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"make_numbered_dir\"\n";
1018        push(@installer::globals::logfileinfo, $infoline);
1019        $returndir = $olddir;
1020    }
1021
1022    return $returndir;
1023}
1024
1025##############################################################
1026# Determining the highest number in the install directory.
1027##############################################################
1028
1029sub determine_maximum_number
1030{
1031    my ($dir, $languagestringref) = @_;
1032
1033    my $basedir = $dir;
1034    installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir);
1035
1036    my $alldirs = get_all_directories($basedir);
1037
1038    my $maxnumber = 1;
1039
1040    # In control.pm the installation directory is determined as:
1041    # $installer::globals::build . "_" . $installer::globals::lastminor . "_" .
1042    # "native_inprogress-number_" . $$languagesref . "\." . $installer::globals::buildid;
1043
1044    # searching for the highest number extension after the first "-", which belongs to
1045    # $installer::globals::build, $installer::globals::lastminor and $installer::globals::buildid
1046    # In this step not looking for the language!
1047
1048    my @correctbuildiddirs = ();
1049
1050    for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
1051    {
1052        my $onedir = ${$alldirs}[$i];
1053        installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$onedir);
1054
1055        if ( $onedir =~ /^\s*\Q$installer::globals::build\E\_\Q$installer::globals::lastminor\E\_(.*?)\-(\d+)\_(.*?)\.\Q$installer::globals::buildid\E\s*$/ )
1056        {
1057            my $number = $2;
1058            if ( $number > $maxnumber ) { $maxnumber = $number; }
1059            push(@correctbuildiddirs, $onedir);
1060        }
1061    }
1062
1063    # From all directories with correct $installer::globals::build, $installer::globals::lastminor
1064    # and $installer::globals::buildid, those directories, which already have the maximum number
1065    # have to be selected
1066
1067    my @maximumnumberdirs = ();
1068
1069    for ( my $i = 0; $i <= $#correctbuildiddirs; $i++ )
1070    {
1071        my $onedir = $correctbuildiddirs[$i];
1072
1073        if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ )
1074        {
1075            my $number = $2;
1076
1077            if ( $number == $maxnumber )
1078            {
1079                push(@maximumnumberdirs, $onedir);
1080            }
1081        }
1082    }
1083
1084    # @maximumnumberdirs contains only those directories with correct $installer::globals::build,
1085    # $installer::globals::lastminor and $installer::globals::buildid, which already have the maximum number.
1086    # If the current language is part of this directory, the number has to be increased.
1087
1088    my $increase_counter = 0;
1089
1090    for ( my $i = 0; $i <= $#maximumnumberdirs; $i++ )
1091    {
1092        my $onedir = $maximumnumberdirs[$i];
1093
1094        if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ )
1095        {
1096            my $number = $2;
1097            my $languagestring = $3;
1098
1099            if ( $languagestring eq $$languagestringref )
1100            {
1101                $increase_counter = 1;
1102            }
1103        }
1104    }
1105
1106    if ( $increase_counter )
1107    {
1108        $maxnumber = $maxnumber + 1;
1109    }
1110
1111    return $maxnumber;
1112}
1113
1114#####################################################################################
1115# Renaming a directory by exchanging a string, for example from "01_inprogress_7"
1116# to "01_witherror_7".
1117#####################################################################################
1118
1119sub rename_string_in_directory
1120{
1121    my ($olddir, $oldstring, $newstring) = @_;
1122
1123    my $newdir = $olddir;
1124    my $infoline = "";
1125
1126    $newdir =~ s/$oldstring/$newstring/g;
1127
1128    if (( -d $newdir ) && ( $olddir ne $newdir )) { remove_complete_directory($newdir, 1); }
1129
1130    if ( move($olddir, $newdir) )
1131    {
1132        $infoline = "\nMoved directory from $olddir to $newdir\n";
1133        push(@installer::globals::logfileinfo, $infoline);
1134    }
1135    else
1136    {
1137        $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_string_in_directory\"\n";
1138        push(@installer::globals::logfileinfo, $infoline);
1139    }
1140
1141    return $newdir;
1142}
1143
1144######################################################
1145# Returning the complete directory name,
1146# input is the first part of the directory name.
1147######################################################
1148
1149sub get_directoryname
1150{
1151    my ($searchdir, $startstring) = @_;
1152
1153    my $dirname = "";
1154    my $founddir = 0;
1155    my $direntry;
1156
1157    opendir(DIR, $searchdir);
1158
1159    foreach $direntry (readdir (DIR))
1160    {
1161        next if $direntry eq ".";
1162        next if $direntry eq "..";
1163
1164        if (( -d $direntry ) && ( $direntry =~ /^\s*\Q$startstring\E/ ))
1165        {
1166            $dirname = $direntry;
1167            $founddir = 1;
1168            last;
1169        }
1170    }
1171
1172    closedir(DIR);
1173
1174    if ( ! $founddir ) { installer::exiter::exit_program("ERROR: Did not find directory beginning with $startstring in directory $searchdir", "get_directoryname"); }
1175
1176    return $dirname;
1177}
1178
1179
1180###################################
1181# Renaming a directory
1182###################################
1183
1184sub rename_directory
1185{
1186    my ($olddir, $newdir) = @_;
1187
1188    my $infoline = "";
1189
1190    if ( move($olddir, $newdir) )
1191    {
1192        $infoline = "\nMoved directory from $olddir to $newdir\n";
1193        push(@installer::globals::logfileinfo, $infoline);
1194    }
1195    else
1196    {
1197        installer::exiter::exit_program("ERROR: Could not move directory from $olddir to $newdir", "rename_directory");
1198        # $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_directory\"\n";
1199        # push(@installer::globals::logfileinfo, $infoline);
1200    }
1201
1202    return $newdir;
1203}
1204
1205##############################################################
1206# Creating a directory next to an existing directory
1207##############################################################
1208
1209sub create_directory_next_to_directory
1210{
1211    my ($topdir, $dirname) = @_;
1212
1213    my $basedir = $topdir;
1214    installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir);
1215
1216    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1217
1218    my $newdir = $basedir . $installer::globals::separator . $dirname;
1219
1220    create_directory($newdir);
1221
1222    return $newdir;
1223}
1224
1225##############################################################
1226# Collecting all directories inside a directory
1227##############################################################
1228
1229sub get_all_directories
1230{
1231    my ($basedir) = @_;
1232
1233    my @alldirs = ();
1234    my $direntry;
1235
1236    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1237
1238    opendir(DIR, $basedir);
1239
1240    foreach $direntry (readdir (DIR))
1241    {
1242        next if $direntry eq ".";
1243        next if $direntry eq "..";
1244
1245        my $completeentry = $basedir . $installer::globals::separator . $direntry;
1246
1247        if ( -d $completeentry ) { push(@alldirs, $completeentry); }
1248    }
1249
1250    closedir(DIR);
1251
1252    return \@alldirs;
1253}
1254
1255##############################################################
1256# Collecting all directories inside a directory
1257# Returning without path
1258##############################################################
1259
1260sub get_all_directories_without_path
1261{
1262    my ($basedir) = @_;
1263
1264    my @alldirs = ();
1265    my $direntry;
1266
1267    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1268
1269    opendir(DIR, $basedir);
1270
1271    foreach $direntry (readdir (DIR))
1272    {
1273        next if $direntry eq ".";
1274        next if $direntry eq "..";
1275
1276        my $completeentry = $basedir . $installer::globals::separator . $direntry;
1277
1278        if ( -d $completeentry ) { push(@alldirs, $direntry); }
1279    }
1280
1281    closedir(DIR);
1282
1283    return \@alldirs;
1284}
1285
1286##############################################################
1287# Collecting all files inside one directory
1288##############################################################
1289
1290sub get_all_files_from_one_directory
1291{
1292    my ($basedir) = @_;
1293
1294    my @allfiles = ();
1295    my $direntry;
1296
1297    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1298
1299    opendir(DIR, $basedir);
1300
1301    foreach $direntry (readdir (DIR))
1302    {
1303        next if $direntry eq ".";
1304        next if $direntry eq "..";
1305
1306        my $completeentry = $basedir . $installer::globals::separator . $direntry;
1307
1308        if ( -f $completeentry ) { push(@allfiles, $completeentry); }
1309    }
1310
1311    closedir(DIR);
1312
1313    return \@allfiles;
1314}
1315
1316##############################################################
1317# Collecting all files inside one directory
1318##############################################################
1319
1320sub get_all_files_from_one_directory_without_path
1321{
1322    my ($basedir) = @_;
1323
1324    my @allfiles = ();
1325    my $direntry;
1326
1327    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1328
1329    opendir(DIR, $basedir);
1330
1331    foreach $direntry (readdir (DIR))
1332    {
1333        next if $direntry eq ".";
1334        next if $direntry eq "..";
1335
1336        my $completeentry = $basedir . $installer::globals::separator . $direntry;
1337
1338        if ( -f $completeentry ) { push(@allfiles, $direntry); }
1339    }
1340
1341    closedir(DIR);
1342
1343    return \@allfiles;
1344}
1345
1346##############################################################
1347# Collecting all files and directories inside one directory
1348##############################################################
1349
1350sub read_directory
1351{
1352    my ($basedir) = @_;
1353
1354    my @allcontent = ();
1355    my $direntry;
1356
1357    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1358
1359    opendir(DIR, $basedir);
1360
1361    foreach $direntry (readdir (DIR))
1362    {
1363        next if $direntry eq ".";
1364        next if $direntry eq "..";
1365
1366        my $completeentry = $basedir . $installer::globals::separator . $direntry;
1367
1368        if (( -f $completeentry ) || ( -d $completeentry )) { push(@allcontent, $completeentry); }
1369    }
1370
1371    closedir(DIR);
1372
1373    return \@allcontent;
1374}
1375
1376##############################################################
1377# Finding the new content in a directory
1378##############################################################
1379
1380sub find_new_content_in_directory
1381{
1382    my ( $basedir, $oldcontent ) = @_;
1383
1384    my @newcontent = ();
1385    my @allcontent = ();
1386
1387    my $direntry;
1388
1389    $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
1390
1391    opendir(DIR, $basedir);
1392
1393    foreach $direntry (readdir (DIR))
1394    {
1395        next if $direntry eq ".";
1396        next if $direntry eq "..";
1397
1398        my $completeentry = $basedir . $installer::globals::separator . $direntry;
1399
1400        if (( -f $completeentry ) || ( -d $completeentry ))
1401        {
1402            push(@allcontent, $completeentry);
1403            if (! installer::existence::exists_in_array($completeentry, $oldcontent))
1404            {
1405                push(@newcontent, $completeentry);
1406            }
1407        }
1408    }
1409
1410    closedir(DIR);
1411
1412    return (\@newcontent, \@allcontent);
1413}
1414
1415##############################################################
1416# Trying to create a directory, no error if this fails
1417##############################################################
1418
1419sub try_to_create_directory
1420{
1421    my ($directory) = @_;
1422
1423    my $returnvalue = 1;
1424    my $created_directory = 0;
1425
1426    if (!(-d $directory))
1427    {
1428        $returnvalue = mkdir($directory, 0775);
1429
1430        if ($returnvalue)
1431        {
1432            $created_directory = 1;
1433            $infoline = "\nCreated directory: $directory\n";
1434            push(@installer::globals::logfileinfo, $infoline);
1435
1436            my $localcall = "chmod 0775 $directory \>\/dev\/null 2\>\&1";
1437            system($localcall);
1438
1439            # chmod 0775 is not sufficient on mac to remove sticky tag
1440            $localcall = "chmod a-s $directory \>\/dev\/null 2\>\&1";
1441            system($localcall);
1442        }
1443        else
1444        {
1445            $created_directory = 0;
1446        }
1447    }
1448    else
1449    {
1450        $created_directory = 1;
1451    }
1452
1453    return $created_directory;
1454}
1455
1456##############################################################
1457# Creating a complete directory structure
1458##############################################################
1459
1460sub create_directory_structure
1461{
1462    my ($directory) = @_;
1463
1464    if ( ! try_to_create_directory($directory) )
1465    {
1466        my $parentdir = $directory;
1467        installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir);
1468
1469        my $infoline = "INFO: Did not create directory $directory\n";
1470        push(@installer::globals::logfileinfo, $infoline);
1471        $infoline = "Now trying to create parent directory $parentdir\n";
1472        push(@installer::globals::logfileinfo, $infoline);
1473
1474        create_directory_structure($parentdir);                                 # recursive
1475    }
1476
1477    create_directory($directory);   # now it has to succeed
1478}
1479
1480######################################################
1481# Removing a complete directory with subdirectories
1482######################################################
1483
1484sub remove_complete_directory
1485{
1486    my ($directory, $start) = @_;
1487
1488    my @content = ();
1489    my $infoline = "";
1490
1491    $directory =~ s/\Q$installer::globals::separator\E\s*$//;
1492
1493    if ( -d $directory )
1494    {
1495        if ( $start )
1496        {
1497            $infoline = "\n";
1498            push(@installer::globals::logfileinfo, $infoline);
1499            $infoline = "Removing directory $directory\n";
1500            push(@installer::globals::logfileinfo, $infoline);
1501        }
1502
1503        opendir(DIR, $directory);
1504        @content = readdir(DIR);
1505        closedir(DIR);
1506
1507        my $oneitem;
1508
1509        foreach $oneitem (@content)
1510        {
1511            if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
1512            {
1513                my $item = $directory . $installer::globals::separator . $oneitem;
1514
1515                if ( -f $item || -l $item )     # deleting files or links
1516                {
1517                    unlink($item);
1518                }
1519
1520                if ( -d $item )     # recursive
1521                {
1522                    remove_complete_directory($item, 0);
1523                }
1524            }
1525        }
1526
1527        # try to remove empty directory
1528
1529        my $returnvalue = rmdir $directory;
1530
1531        if ( ! $returnvalue )
1532        {
1533            $infoline = "Warning: Problem with removing empty dir $directory\n";
1534            push(@installer::globals::logfileinfo, $infoline);
1535        }
1536
1537        # try a little bit harder (sometimes there is a performance problem)
1538        if ( -d $directory )
1539        {
1540            for ( my $j = 1; $j <= 3; $j++ )
1541            {
1542                if ( -d $directory )
1543                {
1544                    $infoline = "\n";
1545                    push(@installer::globals::logfileinfo, $infoline);
1546                    $infoline = "Warning (Try $j): Problems with removing directory $directory\n";
1547                    push(@installer::globals::logfileinfo, $infoline);
1548
1549                    $returnvalue = rmdir $directory;
1550
1551                    if ( $returnvalue )
1552                    {
1553                        $infoline = "Successfully removed empty dir $directory\n";
1554                        push(@installer::globals::logfileinfo, $infoline);
1555                    } else {
1556                        $infoline = "Warning: rmdir $directory failed.\n";
1557                        push(@installer::globals::logfileinfo, $infoline);
1558                    }
1559                }
1560            }
1561        }
1562    }
1563}
1564
1565######################################################
1566# Creating a unique directory with number extension
1567######################################################
1568
1569sub create_unique_directory
1570{
1571    my ($directory) = @_;
1572
1573    $directory =~ s/\Q$installer::globals::separator\E\s*$//;
1574    $directory = $directory . "_INCREASINGNUMBER";
1575
1576    my $counter = 1;
1577    my $created = 0;
1578    my $localdirectory = "";
1579
1580    do
1581    {
1582        $localdirectory = $directory;
1583        $localdirectory =~ s/INCREASINGNUMBER/$counter/;
1584        $counter++;
1585
1586        if ( ! -d $localdirectory )
1587        {
1588            create_directory($localdirectory);
1589            $created = 1;
1590        }
1591    }
1592    while ( ! $created );
1593
1594    return $localdirectory;
1595}
1596
1597######################################################
1598# Creating a unique directory with pid extension
1599######################################################
1600
1601sub create_pid_directory
1602{
1603    my ($directory) = @_;
1604
1605    $directory =~ s/\Q$installer::globals::separator\E\s*$//;
1606    my $pid = $$;           # process id
1607    my $time = time();      # time
1608
1609    $directory = $directory . "_" . $pid . $time;
1610
1611    if ( ! -d $directory ) { create_directory($directory); }
1612    else { installer::exiter::exit_program("ERROR: Directory $directory already exists!", "create_pid_directory"); }
1613
1614    return $directory;
1615}
1616
1617##############################################################
1618# Reading all files from a directory and its subdirectories
1619##############################################################
1620
1621sub read_complete_directory
1622{
1623    my ($directory, $pathstring, $filecollector) = @_;
1624
1625    my @content = ();
1626    opendir(DIR, $directory);
1627    @content = readdir(DIR);
1628    closedir(DIR);
1629
1630    my $onefile;
1631
1632    foreach $onefile (@content)
1633    {
1634        if ((!($onefile eq ".")) && (!($onefile eq "..")))
1635        {
1636            my $completefilename = $directory . $installer::globals::separator . $onefile;
1637            my $sep = "";
1638            if ( $pathstring ne "" ) { $sep = $installer::globals::separator; }
1639
1640            if ( ! -d $completefilename )   # only files, no directories
1641            {
1642                my $content = $pathstring . $sep . $onefile;
1643                push(@{$filecollector}, $content);
1644            }
1645            else  # recursive for directories
1646            {
1647                my $newpathstring = $pathstring . $sep . $onefile;
1648                read_complete_directory($completefilename, $newpathstring, $filecollector);
1649            }
1650        }
1651    }
1652}
1653
1654##############################################################
1655# Reading all files from a directory and its subdirectories
1656# Version 2
1657##############################################################
1658
1659sub read_full_directory {
1660    my ( $currentdir, $pathstring, $collector ) = @_;
1661    my $item;
1662    my $fullname;
1663    local *DH;
1664
1665    unless (opendir(DH, $currentdir))
1666    {
1667        return;
1668    }
1669    while (defined ($item = readdir(DH)))
1670    {
1671        next if($item eq "." or $item eq "..");
1672        $fullname = $currentdir . $installer::globals::separator . $item;
1673        my $sep = "";
1674        if ( $pathstring ne "" ) { $sep = $installer::globals::separator; }
1675
1676        if( -d $fullname)
1677        {
1678            my $newpathstring = $pathstring . $sep . $item;
1679            read_full_directory($fullname, $newpathstring, $collector) if(-d $fullname);
1680        }
1681        else
1682        {
1683            my $content = $pathstring . $sep . $item;
1684            push(@{$collector}, $content);
1685        }
1686    }
1687    closedir(DH);
1688    return
1689}
1690
1691##############################################################
1692# Removing all empty directories below a specified directory
1693##############################################################
1694
1695sub remove_empty_dirs_in_folder
1696{
1697    my ( $dir ) = @_;
1698
1699    my @content = ();
1700    my $infoline = "";
1701
1702    $dir =~ s/\Q$installer::globals::separator\E\s*$//;
1703
1704    if ( -d $dir )
1705    {
1706        opendir(DIR, $dir);
1707        @content = readdir(DIR);
1708        closedir(DIR);
1709
1710        my $oneitem;
1711
1712        foreach $oneitem (@content)
1713        {
1714            if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
1715            {
1716                my $item = $dir . $installer::globals::separator . $oneitem;
1717
1718                if ( -d $item ) # recursive
1719                {
1720                    remove_empty_dirs_in_folder($item);
1721                }
1722            }
1723        }
1724
1725        # try to remove empty directory
1726        my $returnvalue = rmdir $dir;
1727
1728        if ( $returnvalue )
1729        {
1730            $infoline = "Successfully removed empty dir $dir\n";
1731            push(@installer::globals::logfileinfo, $infoline);
1732        }
1733
1734    }
1735
1736}
1737
17381;
1739