1 /* tools.c - TransparentIRC 0.1
2 * Copyright (C) 2011-2012 Philipp Kreil (pk910)
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 3 of the License, or
7 * (at your option) any later version.
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.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 int stricmp(const char *s1, const char *s2) {
20 if (s1 == NULL) return s2 == NULL ? 0 : -(*s2);
21 if (s2 == NULL) return *s1;
23 while ((c1 = tolower (*s1)) == (c2 = tolower (*s2))) {
24 if (*s1 == '\0') break;
30 int stricmplen(const char *s1, const char *s2, int len) {
31 if (s1 == NULL) return s2 == NULL ? 0 : -(*s2);
32 if (s2 == NULL) return *s1;
35 while ((c1 = tolower (*s1)) == (c2 = tolower (*s2))) {
37 if (*s1 == '\0') break;
44 int parse_line(char *line, char **argv, int irc_raw) {
56 if (*line == ':' && irc_raw) {
57 //the rest is a single parameter
58 argv[argc++] = line + 1;
62 if (argc >= MAXNUMPARAMS)
64 while (*line != ' ' && *line)
70 void build_var_string(char *buffer, char *format, struct variable_replace_map *map) {
78 goto build_var_string_addchar;
88 if(!map[i].character) {
92 if(map[i].character == *p) {
99 goto build_var_string_addchar;
101 for(i = 0; tmp[i] && bufferpos < CMDLEN; i++) {
102 buffer[bufferpos++] = tmp[i];
105 build_var_string_addchar:
106 buffer[bufferpos++] = *p;
107 if(bufferpos == CMDLEN)
112 buffer[bufferpos++] = '\0';
115 int run_external_process(char *command, char **parameters) { //win32 incompatible
116 int sockets[2], child;
117 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0)
119 if ((child = fork()) == -1) {
124 else if (child) { // This is the parent.
128 } else { // This is the child.
130 child = fork(); //double fork to prevent zombies
131 if(child < 0) exit(EXIT_FAILURE);
132 if(child != 0) exit(EXIT_SUCCESS);
133 if(dup2(sockets[0], 1) != -1) {
134 execvp(command, parameters);