Added slam command

exposed as command the implementation by Anathema: kills all
processes using the tomb (denying it to be closed) and umounts

tomb (the commandline script) is not supposed to be interactive
we leave interactivity to be implemented by wrappers as tomb-open
so it should stop to ask the used if to slam, rather than offer
it as a command. now also tomb-status has the menu option to slam.
This commit is contained in:
Jaromil 2011-04-27 23:19:06 +02:00
parent 4b47f94c12
commit 8771d103b7
3 changed files with 72 additions and 14 deletions

View File

@ -51,10 +51,18 @@ mounted in a directory named after the filename and inside /media.
.B .B
.IP "close" .IP "close"
Closes a currently open tomb. When \fIan argument\fR is specified, it Closes a currently open tomb. When \fIan argument\fR is specified, it
should point to the tomb mount on /dev/mapper; if not specified and should be the name of a mounted tomb; if not specified and only one
only one tomb is open then it will be closed; if multiple tombs are tomb is open then it will be closed; if multiple tombs are open, the
open, the command will list them on the terminal. The special command will list them on the terminal. The special
\fIargument\fR 'all' will close all currently open tombs. \fIargument\fR 'all' will close all currently open tombs. This command
fails if the tomb is in use by running processes, the command
\fIslam\fR can be used to force close.
.B
.IP "slam"
Closes a tomb like the command \fIclose\fR does, but in case it is in
use looks for all the processes accessing its files and violently
kills them using \-9.
.B .B
.IP "bury" .IP "bury"

View File

@ -210,7 +210,8 @@ Commands:
create create a new tomb FILE and its keys create create a new tomb FILE and its keys
open open an existing tomb FILE on PLACE open open an existing tomb FILE on PLACE
close closes the tomb open on PLACE close close the open tomb called FILE (or all)
slam close tomb FILE and kill all pids using it
bury hide a tomb key FILE inside a jpeg PLACE bury hide a tomb key FILE inside a jpeg PLACE
exhume extract a tomb key FILE from a jpeg PLACE exhume extract a tomb key FILE from a jpeg PLACE
@ -707,16 +708,15 @@ umount_tomb() {
umount ${tombmount} 2> /dev/null umount ${tombmount} 2> /dev/null
if ! [ $? = 0 ]; then if ! [ $? = 0 ]; then
error "Tomb is busy, cannot umount!" error "Tomb is busy, cannot umount!"
notice "Do you want to force umount? y/N: " if [ $SLAM ]; then
read ans notice "Slamming tomb killing all processes using it"
if [ "$ans" = "S" -o "$ans" = "s" -o "$ans" = "y" -o "$ans" = "Y" ]; then
pidk=`lsof -t "$tombmount"` pidk=`lsof -t "$tombmount"`
for p in "$pidk"; do for p in "$pidk"; do
pname=`pidof $p` pname=`pidof $p`
func "killing PID $p of $pname..." func "killing PID $p of $pname..."
kill -9 $p kill -9 $p
done done
umount "${tombmount}" umount "${tombmount}"
else else
error "Cannot umount $tombname on $tombmount" error "Cannot umount $tombname on $tombmount"
return 1 return 1
@ -877,6 +877,7 @@ main () {
umount) check_priv ; umount_tomb ${CMD2} ;; umount) check_priv ; umount_tomb ${CMD2} ;;
unmount) check_priv ; umount_tomb ${CMD2} ;; unmount) check_priv ; umount_tomb ${CMD2} ;;
close) check_priv ; umount_tomb ${CMD2} ;; close) check_priv ; umount_tomb ${CMD2} ;;
slam) chack_priv ; SLAM=1; umount_tomb ${CMD2} ;;
bury) if [ "$STEGHIDE" = 0 ]; then bury) if [ "$STEGHIDE" = 0 ]; then
error "steghide not installed. Cannot bury your key" error "steghide not installed. Cannot bury your key"
return 1 return 1

View File

@ -49,13 +49,15 @@ char mountpoint[256];
gboolean left_click(GtkWidget *w, GdkEvent *e); gboolean left_click(GtkWidget *w, GdkEvent *e);
gboolean cb_view(GtkWidget *w, GdkEvent *e); gboolean cb_view(GtkWidget *w, GdkEvent *e);
gboolean cb_close(GtkWidget *w, GdkEvent *e); gboolean cb_close(GtkWidget *w, GdkEvent *e);
gboolean cb_slam(GtkWidget *w, GdkEvent *e);
gboolean right_click(GtkWidget *w, GdkEvent *e); gboolean right_click(GtkWidget *w, GdkEvent *e);
gboolean cb_about(GtkWidget *w, GdkEvent *e); gboolean cb_about(GtkWidget *w, GdkEvent *e);
int main(int argc, char **argv) { int main(int argc, char **argv) {
GtkWidget *item_close, *item_view, *item_about; GtkWidget *item_close, *item_slam;
GtkWidget *item_view, *item_about;
gint menu_x, menu_y; gint menu_x, menu_y;
gboolean push_in = TRUE; gboolean push_in = TRUE;
@ -104,6 +106,11 @@ int main(int argc, char **argv) {
gtk_menu_attach(menu_left, item_close, 0, 1, 1, 2); gtk_menu_attach(menu_left, item_close, 0, 1, 1, 2);
g_signal_connect_swapped(item_close, "activate", G_CALLBACK(cb_close), NULL); g_signal_connect_swapped(item_close, "activate", G_CALLBACK(cb_close), NULL);
gtk_widget_show(item_close); gtk_widget_show(item_close);
// slam
item_slam = gtk_menu_item_new_with_label("Slam");
gtk_menu_attach(menu_left, item_slam, 0, 1, 2, 3);
g_signal_connect_swapped(item_slam, "activate", G_CALLBACK(cb_slam), NULL);
gtk_widget_show(item_slam);
// connect it // connect it
g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_left); g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_left);
@ -196,7 +203,6 @@ gboolean cb_close(GtkWidget *w, GdkEvent *e) {
fprintf(stderr,"pipe creation error: %s\n", strerror(errno)); fprintf(stderr,"pipe creation error: %s\n", strerror(errno));
return FALSE; return FALSE;
} }
cpid = fork(); cpid = fork();
if (cpid == -1) { if (cpid == -1) {
@ -228,6 +234,49 @@ gboolean cb_close(GtkWidget *w, GdkEvent *e) {
return TRUE; return TRUE;
} }
gboolean cb_slam(GtkWidget *w, GdkEvent *e) {
int pipefd[2];
pid_t cpid;
char buf;
int c, res;
char map[256];
if (pipe(pipefd) <0) {
fprintf(stderr,"pipe creation error: %s\n", strerror(errno));
return FALSE;
}
cpid = fork();
if (cpid == -1) {
fprintf(stderr,"fork error: %s\n", strerror(errno));
return FALSE;
}
if (cpid == 0) { // Child
close(pipefd[1]); // close unused write end
for(c=0; read(pipefd[0], &buf, 1) > 0; c++)
map[c] = buf;
close(pipefd[0]);
map[c] = 0;
execlp("tomb", "tomb", "slam", map, (char*)NULL);
_exit(1);
}
close(pipefd[0]); // close unused read end
write(pipefd[1], mapper, strlen(mapper));
close(pipefd[1]); // reader will see EOF
waitpid(cpid, &res, 0);
if(res==0) {
gtk_main_quit();
notify_uninit();
exit(0);
}
/* tomb-notify "Tomb '$tombname' is too busy." \
"Close all applications and file managers, then try again."
*/
return TRUE;
}
// callbacks right click // callbacks right click
gboolean right_click(GtkWidget *w, GdkEvent *e) { gboolean right_click(GtkWidget *w, GdkEvent *e) {
gtk_menu_popup(menu_right, NULL, NULL, gtk_menu_popup(menu_right, NULL, NULL,