Set DISPLAY environment variable if --display option
[pinentry-qt.git] / secmem-util.c
1 /* Quintuple Agent
2  * Copyright (C) 1999 Robert Bihlmeyer <robbe@orcus.priv.at>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #ifdef HAVE_CONFIG_H
20 #include <config.h>
21 #endif
22
23 #define _GNU_SOURCE 1
24
25 #ifndef HAVE_W32CE_SYSTEM
26 # include <errno.h>
27 # include <sys/types.h>
28 # ifndef HAVE_W32_SYSTEM
29 #  include <unistd.h>
30 # endif
31 #endif
32 #include <stdarg.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <assert.h>
37
38 #include "secmem-util.h"
39
40 #ifndef HAVE_DOSISH_SYSTEM
41 static int uid_set = 0;
42 static uid_t real_uid, file_uid;
43 #endif /*!HAVE_DOSISH_SYSTEM*/
44
45 /* Write DATA of size BYTES to FD, until all is written or an error
46    occurs.  */
47 ssize_t 
48 xwrite(int fd, const void *data, size_t bytes)
49 {
50 #ifdef HAVE_W32CE_SYSTEM
51   // FIXME: Disabled xwrite on WinCE
52   return 0;
53 #else
54   char *ptr;
55   size_t todo;
56   ssize_t written = 0;
57
58   for (ptr = (char *)data, todo = bytes; todo; ptr += written, todo -= written)
59     {
60       do
61         written = write (fd, ptr, todo);
62       while (
63 #ifdef HAVE_W32CE_SYSTEM
64              0
65 #else
66              written == -1 && errno == EINTR
67 #endif
68              );
69       if (written < 0)
70         break;
71     }
72   return written;
73 #endif
74 }
75
76 #if 0
77 extern int debug;
78
79 int 
80 debugmsg(const char *fmt, ...)
81 {
82   va_list va;
83   int ret;
84
85   if (debug) {
86     va_start(va, fmt);
87     fprintf(stderr, "\e[4m");
88     ret = vfprintf(stderr, fmt, va);
89     fprintf(stderr, "\e[24m");
90     va_end(va);
91     return ret;
92   } else
93     return 0;
94 }
95 #endif
96
97 /* initialize uid variables */
98 #ifndef HAVE_DOSISH_SYSTEM
99 static void 
100 init_uids(void)
101 {
102   real_uid = getuid();
103   file_uid = geteuid();
104   uid_set = 1;
105 }
106 #endif
107
108
109 #if 0 /* Not used. */
110 /* lower privileges to the real user's */
111 void 
112 lower_privs()
113 {
114   if (!uid_set)
115     init_uids();
116   if (real_uid != file_uid) {
117 #ifdef HAVE_SETEUID
118     if (seteuid(real_uid) < 0) {
119       perror("lowering privileges failed");
120       exit(EXIT_FAILURE);
121     }
122 #else
123     fprintf(stderr, _("Warning: running q-agent setuid on this system is dangerous\n"));
124 #endif /* HAVE_SETEUID */
125   }
126 }
127 #endif /* if 0 */
128
129 #if 0 /* Not used. */
130 /* raise privileges to the effective user's */
131 void 
132 raise_privs()
133 {
134   assert(real_uid >= 0);        /* lower_privs() must be called before this */
135 #ifdef HAVE_SETEUID
136   if (real_uid != file_uid && seteuid(file_uid) < 0) {
137    perror("Warning: raising privileges failed");
138   }
139 #endif /* HAVE_SETEUID */
140 }
141 #endif /* if 0 */
142
143 /* drop all additional privileges */
144 void 
145 drop_privs()
146 {
147 #ifndef HAVE_DOSISH_SYSTEM
148   if (!uid_set)
149     init_uids();
150   if (real_uid != file_uid) {
151     if (setuid(real_uid) < 0) {
152       perror("dropping privileges failed");
153       exit(EXIT_FAILURE);
154     }
155     file_uid = real_uid;
156   }
157 #endif
158 }