1#!/usr/local/bin/perl
2# save_vgetty.cgi
3# Save, create or delete a serial port configuration
4
5require './vgetty-lib.pl';
6&foreign_require("inittab", "inittab-lib.pl");
7&ReadParse();
8@inittab = &inittab::parse_inittab();
9@vgt = &vgetty_inittabs();
10if (!$in{'new'}) {
11	($init) = grep { $_->{'id'} eq $in{'id'} } @vgt;
12	$oldtty = $init->{'tty'};
13	$oldtty = "/dev/$oldtty" if ($oldtty !~ /^\//);
14	}
15@conf = &get_config();
16$rings = &find_value("rings", \@conf);
17$ans = &find_value("answer_mode", \@conf);
18
19&lock_file($inittab::config{'inittab_file'});
20if ($in{'delete'}) {
21	# Just deleting an inittab entry
22	&inittab::delete_inittab($init);
23	if (defined($in{'rings_def'})) {
24		local $tf = &tty_opt_file($ans, $oldtty);
25		&lock_file($tf);
26		unlink($tf);
27		&unlock_file($tf);
28		}
29	if (defined($in{'ans_def'})) {
30		$tf = &tty_opt_file($rings, $oldtty);
31		&lock_file($tf);
32		unlink($tf);
33		&unlock_file($tf);
34		}
35	}
36else {
37	# Validate and store inputs
38	&error_setup($text{'vgetty_err'});
39	$cmd = $in{'new'} ? &has_command("vgetty") : $init->{'vgetty'};
40	if ($init->{'args'}) {
41		$init->{'args'} =~ s/^\s+//;
42		$cmd .= " $init->{'args'}";
43		}
44	if ($in{'tty'}) {
45		$cmd .= " $in{'tty'}";
46		$init->{'tty'} = $in{'tty'};
47		}
48	else {
49		-r $in{'other'} || &error($text{'vgetty_etty'});
50		$cmd .= " $in{'other'}";
51		$init->{'tty'} = $in{'other'};
52		}
53	$newtty = $init->{'tty'};
54	$newtty = "/dev/$newtty" if ($newtty !~ /^\//);
55	if ($in{'new'} || $newtty ne $oldtty) {
56		# Check for tty clash
57		foreach $v (&vgetty_inittabs()) {
58			local $vtty = $v->{'tty'};
59			$vtty = "/dev/$vtty" if ($vtty !~ /^\//);
60			&error(&text('vgetty_eclash', "<tt>$vtty</tt>"))
61				if ($vtty eq $newtty);
62			}
63		}
64	$init->{'process'} = $cmd;
65
66	if (defined($in{'rings_def'})) {
67		$tf = &tty_opt_file($rings, $init->{'tty'});
68		&lock_file($tf);
69		if (!$in{'new'} && $oldtty ne $newtty) {
70			unlink(&tty_opt_file($rings, $oldtty));
71			}
72		if ($in{'rings_def'}) {
73			unlink($tf);
74			}
75		else {
76			$in{'rings'} =~ /^\d+$/ ||
77				&error($text{'vgetty_erings'});
78			$in{'rings'} >= 2 || &error($text{'vgetty_erings2'});
79			&open_tempfile(TF, ">$tf");
80			&print_tempfile(TF, $in{'rings'},"\n");
81			&close_tempfile(TF);
82			}
83		&unlock_file($tf);
84		}
85
86	if (defined($in{'ans_def'})) {
87		$tf = &tty_opt_file($ans, $init->{'tty'});
88		&lock_file($tf);
89		if (!$in{'new'} && $oldtty ne $newtty) {
90			unlink(&tty_opt_file($ans, $oldtty));
91			}
92		if ($in{'ans_def'}) {
93			unlink($tf);
94			}
95		else {
96			$mode = &parse_answer_mode("ans");
97			$mode || &error($text{'vgetty_eans'});
98			&open_tempfile(TF, ">$tf");
99			&print_tempfile(TF, $mode,"\n");
100			&close_tempfile(TF);
101			}
102		&unlock_file($tf);
103		}
104
105	if ($in{'new'}) {
106		$maxid = 1;
107		foreach $i (@inittab) {
108			$maxid = $i->{'id'} if ($i->{'id'} =~ /^\d+$/ &&
109						$i->{'id'} > $maxid);
110			}
111		$init->{'id'} = $maxid + 1;
112		$init->{'levels'} = [ 2, 3, 4, 5 ];
113		$init->{'action'} = "respawn";
114		&inittab::create_inittab($init);
115		}
116	else {
117		&inittab::modify_inittab($init);
118		}
119	}
120&unlock_file($inittab::config{'inittab_file'});
121&webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify",
122	    "vgetty", $init->{'tty'}, $init);
123
124&redirect("list_vgetty.cgi");
125
126