💾 Archived View for gemini.rmf-dev.com › repo › Vaati › cwm › files › 904a54ceec0a732ed2ffdfda267a28… captured on 2023-03-20 at 18:15:42. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-01-29)

🚧 View Differences

-=-=-=-=-=-=-

0 /*

1 * calmwm - the calm window manager

2 *

3 * Copyright (c) 2004 Marius Aamodt Eriksen <marius@monkey.org>

4 *

5 * Permission to use, copy, modify, and distribute this software for any

6 * purpose with or without fee is hereby granted, provided that the above

7 * copyright notice and this permission notice appear in all copies.

8 *

9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF

11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR

12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES

13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN

14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF

15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

16 *

17 * $OpenBSD$

18 */

19

20 #include <sys/types.h>

21 #include <sys/queue.h>

22

23 #include <err.h>

24 #include <errno.h>

25 #include <limits.h>

26 #include <stdarg.h>

27 #include <stdio.h>

28 #include <stdlib.h>

29 #include <string.h>

30 #include <unistd.h>

31

32 #include "calmwm.h"

33

34 static void log_msg(const char *, va_list);

35

36 void

37 u_spawn(char *argstr)

38 {

39 switch (fork()) {

40 case 0:

41 u_exec(argstr);

42 exit(1);

43 case -1:

44 warn("fork");

45 default:

46 break;

47 }

48 }

49

50 void

51 u_exec(char *argstr)

52 {

53 #define MAXARGLEN 20

54 char *args[MAXARGLEN], **ap = args;

55 char **end = &args[MAXARGLEN - 2], *tmp;

56 char *s = argstr;

57

58 while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) {

59 if (**ap == '\0')

60 continue;

61 ap++;

62 if (argstr != NULL) {

63 /* deal with quoted strings */

64 switch(argstr[0]) {

65 case '"':

66 case '\'':

67 if ((tmp = strchr(argstr + 1, argstr[0]))

68 != NULL) {

69 *(tmp++) = '\0';

70 *(ap++) = ++argstr;

71 argstr = tmp;

72 }

73 break;

74 default:

75 break;

76 }

77 }

78 }

79 *ap = NULL;

80

81 (void)setsid();

82 (void)execvp(args[0], args);

83 warn("%s", s);

84 }

85

86 char *

87 u_argv(char * const *argv)

88 {

89 size_t siz = 0;

90 int i;

91 char *p;

92

93 if (argv == 0)

94 return NULL;

95

96 for (i = 0; argv[i]; i++)

97 siz += strlen(argv[i]) + 1;

98 if (siz == 0)

99 return NULL;

100

101 p = xmalloc(siz);

102 strlcpy(p, argv[0], siz);

103 for (i = 1; argv[i]; i++) {

104 strlcat(p, " ", siz);

105 strlcat(p, argv[i], siz);

106 }

107 return p;

108 }

109

110 static void

111 log_msg(const char *msg, va_list ap)

112 {

113 char *fmt;

114

115 if (asprintf(&fmt, "%s\n", msg) == -1) {

116 vfprintf(stderr, msg, ap);

117 fprintf(stderr, "\n");

118 } else {

119 vfprintf(stderr, fmt, ap);

120 free(fmt);

121 }

122 fflush(stderr);

123 }

124

125 void

126 log_debug(int level, const char *func, const char *msg, ...)

127 {

128 char *fmt;

129 va_list ap;

130

131 if (Conf.debug < level)

132 return;

133

134 va_start(ap, msg);

135 xasprintf(&fmt, "debug%d: %s: %s", level, func, msg);

136 log_msg(fmt, ap);

137 free(fmt);

138 va_end(ap);

139 }

140