KInit
proctitle.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "proctitle.h"
00023 #include <config.h>
00024 #include <config-kdeinit.h>
00025
00026 #include <string.h>
00027 #include <stdio.h>
00028 #include <stdarg.h>
00029 #include <stdlib.h>
00030
00031 #define PF_ARGV_NONE 0
00032 #define PF_ARGV_NEW 1
00033 #define PF_ARGV_WRITEABLE 2
00034 #define PF_ARGV_PSTAT 3
00035 #define PF_ARGV_PSSTRINGS 4
00036
00037 #ifdef HAVE_SETPROCTITLE
00038 # define PF_ARGV_TYPE PF_ARGV_NONE
00039 # ifdef HAVE_SYS_TYPES_H
00040 # include <sys/types.h>
00041 # endif
00042 # ifdef HAVE_UNISTD_H
00043 # include <unistd.h>
00044 # endif
00045
00046 #else
00047 # ifdef __GNU_HURD__
00048 # define PF_ARGV_TYPE PF_ARGV_NEW
00049 # else
00050 # define PF_ARGV_TYPE PF_ARGV_WRITEABLE
00051
00052 # if defined(HAVE_SYS_PSTAT_H) && defined(HAVE_PSTAT)
00053 # include <sys/pstat.h>
00054 # undef PF_ARGV_TYPE
00055 # define PF_ARGV_TYPE PF_ARGV_PSTAT
00056 # endif
00057
00058 # ifdef HAVE_SYS_EXEC_H
00059 # include <sys/exec.h>
00060 # ifdef PS_STRINGS
00061 # include <machine/vmparam.h>
00062 # undef PF_ARGV_TYPE
00063 # define PF_ARGV_TYPE PF_ARGV_PSSTRINGS
00064 # endif
00065 # endif
00066
00067 # endif
00068
00069 #endif
00070
00071 #ifdef HAVE___PROGNAME
00072 extern char *__progname;
00073 #endif
00074 #ifdef HAVE___PROGNAME_FULL
00075 extern char *__progname_full;
00076 #endif
00077 extern char **environ;
00078
00079 static char **Argv = NULL;
00080
00081 #if PF_ARGV_TYPE == PF_ARGV_WRITEABLE
00082 static char *LastArgv = NULL;
00083 #endif
00084
00088 void proctitle_init(int argc, char *argv[], char *envp[]) {
00089 register int i, envpsize;
00090 char **p;
00091
00092
00093 for ( i = envpsize = 0; envp[i] != NULL; i++ ) {
00094 envpsize += strlen(envp[i]) + 1;
00095 }
00096
00097 if ((p = (char **) malloc((i + 1) * sizeof(char *))) != NULL) {
00098 environ = p;
00099
00100 for (i = 0; envp[i] != NULL; i++) {
00101 if ((environ[i] = static_cast<char *>(malloc(strlen(envp[i]) + 1))) != NULL) {
00102 strcpy(environ[i], envp[i]);
00103 }
00104 }
00105
00106 environ[i] = NULL;
00107 }
00108
00109 Argv = argv;
00110
00111 # if PF_ARGV_TYPE == PF_ARGV_WRITEABLE
00112 for (i = 0; i < argc; i++) {
00113 if (!i || (LastArgv + 1 == argv[i])) {
00114 LastArgv = argv[i] + strlen(argv[i]);
00115 }
00116 }
00117
00118 for (i = 0; envp[i] != NULL; i++) {
00119
00120 if (!strncmp(envp[i], "XDG_", 4))
00121 break;
00122 if ((LastArgv + 1) == envp[i]) {
00123 LastArgv = envp[i] + strlen(envp[i]);
00124 }
00125 }
00126 #endif
00127
00128 # ifdef HAVE___PROGNAME
00129
00130
00131
00132 __progname = strdup("kdeinit4");
00133 # endif
00134 # ifdef HAVE___PROGNAME_FULL
00135
00136 __progname_full = strdup(argv[0]);
00137 # endif
00138 }
00139
00140 void proctitle_set(const char *fmt, ...) {
00141 va_list msg;
00142 static char statbuf[BUFSIZ];
00143
00144 #ifndef HAVE_SETPROCTITLE
00145 # if PF_ARGV_TYPE == PF_ARGV_PSTAT
00146 union pstun pst;
00147 # endif
00148 char *p;
00149 int i;
00150 #endif
00151
00152 if ( !fmt ) {
00153 return;
00154 }
00155
00156 va_start(msg, fmt);
00157
00158 memset(statbuf, 0, sizeof(statbuf));
00159
00160 #ifdef HAVE_SETPROCTITLE
00161 # if __FreeBSD__ >= 4 && !defined(FREEBSD4_0) && !defined(FREEBSD4_1)
00162
00163 vsnprintf(statbuf, sizeof(statbuf), fmt, msg);
00164
00165 # else
00166
00167 snprintf(statbuf, sizeof(statbuf), "%s", "kdeinit4: ");
00168 vsnprintf(statbuf + strlen(statbuf),
00169 sizeof(statbuf) - strlen(statbuf),
00170 fmt,
00171 msg);
00172
00173 # endif
00174 setproctitle("%s", statbuf);
00175
00176 #else
00177
00178 snprintf(statbuf, sizeof(statbuf), "%s", "kdeinit4: ");
00179 vsnprintf(statbuf + strlen(statbuf),
00180 sizeof(statbuf) - strlen(statbuf),
00181 fmt,
00182 msg);
00183
00184 #endif
00185
00186 va_end(msg);
00187
00188 #ifdef HAVE_SETPROCTITLE
00189 return;
00190 #else
00191 i = strlen(statbuf);
00192
00193 # if PF_ARGV_TYPE == PF_ARGV_NEW
00194
00195 Argv[0] = statbuf;
00196 Argv[1] = NULL;
00197 # endif
00198
00199 # if PF_ARGV_TYPE == PF_ARGV_WRITEABLE
00200 const int maxlen = (LastArgv - Argv[0]) - 1;
00201
00202 snprintf(Argv[0], maxlen, "%s", statbuf);
00203 p = &Argv[0][i];
00204
00205
00206
00207
00208
00209
00210
00211
00212 if (p < LastArgv)
00213 *p = '\0';
00214
00215 Argv[1] = NULL;
00216 # endif
00217
00218 # if PF_ARGV_TYPE == PF_ARGV_PSTAT
00219 pst.pst_command = statbuf;
00220 pstat(PSTAT_SETCMD, pst, i, 0, 0);
00221 # endif
00222
00223 # if PF_ARGV_TYPE == PF_ARGV_PSSTRINGS
00224 PS_STRINGS->ps_nargvstr = 1;
00225 PS_STRINGS->ps_argvstr = statbuf;
00226 # endif
00227
00228 #endif
00229 }