SPDX: license tags (mostly by guesswork)
[exim.git] / src / util / mkcdb.pl
1 #!/usr/bin/perl -wT
2 # SPDX-License-Identifier: GPL-2.0-only
3 #
4 # Create cdb file from flat alias file. DPC: 15/10/98.
5 # Args:      source  (may be relative or absolute)
6 #            target  (may be relative or absolute. Default = source)
7 # Generates: target.cdb
8 #            target.tmp
9 #
10 # Little Perl script to convert flat file into CDB file. Two advantages over
11 # cdbmake-12 awk script that is distributed with CDB:
12 #  1) Handles 'dpc22:dpc22@hermes' as well as 'dpc22 dpc22@hermes'
13 #  2) Perl works with arbitrary length strings: awk chokes at 1,024 chars
14 #
15 # Cambridge: hermes/src/admin/mkcdb,v 1.9 2005/02/15 18:14:12 fanf2 Exp
16
17 use strict;
18
19 BEGIN { pop @INC if $INC[-1] eq '.' };
20 $ENV{'PATH'} = "";
21 umask(022);
22
23 my $CDB = '/opt/cdb/bin/cdbmake';
24
25 my $prog = $0;
26 $prog =~ s|(.*/)?([^/]+)|$2|;
27
28 my $source;
29 my $target;
30 if (@ARGV == 1) {
31     $source = shift(@ARGV);
32     $target = $source;
33 } elsif (@ARGV == 2) {
34     $source = shift(@ARGV);
35     $target = shift(@ARGV);
36 } else {
37     die("$prog: usage: <source> [<target>]\n");
38 }
39 # trust the invoker ?!
40 $source =~ /(.*)/;
41 $source = $1;
42 $target =~ /(.*)/;
43 $target = $1;
44
45 open(SOURCE, "< ${source}")
46     or die("$prog: open < $source: $!\n");
47
48 open(PIPE, "| $CDB $target.cdb $target.tmp")
49     or die("$prog: open | $CDB $target: $!\n");
50
51 sub add_item ($$) {
52     my $key = shift;
53     my $val = shift;
54     printf PIPE ("+%d,%d:%s->%s\n", length($key), length($val), $key, $val);
55 }
56
57 sub add_line ($) {
58     my $line = shift;
59     if ($line =~ /^([^\s:]+)\s*:\s*(.*)$/s) {   # key : values
60         add_item($1,$2);
61         return;
62     }
63     if ($line =~ /^(\S+)\s+(.*)$/s) {       # key: values
64         add_item($1,$2);
65         return;
66     }
67     if ($line =~ /^(\S+)$/s) {              # key (empty value)
68         add_item($1,'');
69         return;
70     }
71     warn "$prog: unrecognized item: $line";
72 }
73
74 my $data;
75 while(<SOURCE>) {
76     next if /^#/ or /^\s*$/;
77     m/^(\s*)(\S.*)\s+$/s;
78     if (length($1) == 0) {
79             add_line($data) if defined $data;
80             $data = $2;
81     } else {
82             $data .= " $2";
83     }
84 }
85 add_line($data) if defined $data;
86 print PIPE "\n";
87
88 close(SOURCE)
89     or die("$prog: close < $source: $!\n");
90 close(PIPE)
91     or die($! ? "$prog: close | $CDB $target: $!\n"
92            : "$prog: close | $CDB $target: exited $?\n");
93
94 exit 0;