chiark / gitweb /
tripectl: Quotify the arguments rather than hoping for the best.
[tripe] / common / util.c
1 /* -*-c-*-
2  *
3  * $Id: util.c,v 1.3 2004/04/08 01:36:17 mdw Exp $
4  *
5  * Utilities for the client and the server
6  *
7  * (c) 2001 Straylight/Edgeware
8  */
9
10 /*----- Licensing notice --------------------------------------------------* 
11  *
12  * This file is part of Trivial IP Encryption (TrIPE).
13  *
14  * TrIPE is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  * 
19  * TrIPE is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  * 
24  * You should have received a copy of the GNU General Public License
25  * along with TrIPE; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27  */
28
29 /*----- Header files ------------------------------------------------------*/
30
31 #include <errno.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35
36 #include <sys/types.h>
37 #include <unistd.h>
38 #include <fcntl.h>
39
40 #include <mLib/dstr.h>
41
42 #include "util.h"
43
44 #include <sys/ioctl.h>
45
46 /*----- Main code ---------------------------------------------------------*/
47
48 /* --- @u_quotify@ --- *
49  *
50  * Arguments:   @dstr *d@ = where to write the answer
51  *              @const char *p@ = string to quotify
52  *
53  * Returns:     ---
54  *
55  * Use:         Quotes the given string if necessary, according to our
56  *              quoting rules.
57  */
58
59 void u_quotify(dstr *d, const char *p)
60 {
61   if (d->len)
62     dstr_putc(d, ' ');
63   if (*p && !p[strcspn(p, "\"' \t\n\v")])
64     dstr_puts(d, p);
65   else {
66     dstr_putc(d, '\"');
67     while (*p) {
68       if (*p == '\\' || *p == '\"')
69         dstr_putc(d, '\\');
70       dstr_putc(d, *p++);
71     }
72     dstr_putc(d, '\"');
73   }
74 }
75
76 /* --- @u_detach@ --- *
77  *
78  * Arguments:   ---
79  *
80  * Returns:     ---
81  *
82  * Use:         Detaches from the current terminal and ensures it can never
83  *              acquire a new one.  Calls @fork@.
84  */
85
86 void u_detach(void)
87 {
88 #ifdef TIOCNOTTY
89   {
90     int fd;
91     if ((fd = open("/dev/tty", O_RDONLY)) >= 0) {
92       ioctl(fd, TIOCNOTTY);
93       close(fd);
94     }
95   }
96 #endif
97   setsid();
98   if (fork() > 0)
99     _exit(0);
100 }
101
102 /* --- @u_daemon@ --- *
103  *
104  * Arguments:   ---
105  *
106  * Returns:     Zero if OK, nonzero on failure.
107  *
108  * Use:         Becomes a daemon.
109  */
110
111 int u_daemon(void)
112 {
113   pid_t kid;
114
115   if ((kid = fork()) < 0)
116     return (-1);
117   if (kid)
118     _exit(0);
119   u_detach();
120   return (0);
121 }
122
123 /*----- That's all, folks -------------------------------------------------*/