Merge branch 'master' of git.dolda2000.com:/srv/git/r/doldaconnect
[doldaconnect.git] / clients / gui-shell / launch.c
1 /*
2  *  Dolda Connect - Modular multiuser Direct Connect-style client
3  *  Copyright (C) 2007 Fredrik Tolf <fredrik@dolda2000.com>
4  *  
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *  
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *  
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include <pwd.h>
25 #include <libintl.h>
26 #include <signal.h>
27
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31
32 int running(char *pf)
33 {
34     FILE *pfs;
35     char buf[1024];
36     int pid;
37     
38     if((pfs = fopen(pf, "r")) == NULL) {
39         perror(pf);
40         return(0);
41     }
42     fgets(buf, sizeof(buf), pfs);
43     fclose(pfs);
44     if((pid = atoi(buf)) == 0)
45         return(0);
46     return(!kill(pid, 0));
47 }
48
49 int haveprogram(char *name)
50 {
51     char buf[1024];
52     char *p, *p2;
53     
54     p = getenv("PATH");
55     while(p != NULL) {
56         if((p2 = strchr(p, ':')) != NULL) {
57             memcpy(buf, p, p2 - p);
58             buf[p2 - p] = 0;
59             p = p2 + 1;
60         } else {
61             strcpy(buf, p);
62             p = NULL;
63         }
64         strcat(buf, "/");
65         strcat(buf, name);
66         if(!access(buf, X_OK))
67             return(1);
68     }
69     return(0);
70 }
71
72 int main(int argc, char **argv)
73 {
74     int c;
75     char cf[1024], pf[1024];
76     
77     while((c = getopt(argc, argv, "hV")) != -1) {
78         switch(c) {
79         case 'h':
80             printf("usage: dolcon-launch [-hV]\n");
81             printf("\t-h\tDisplay this help message\n");
82             printf("\t-V\tDisplay version info and exit\n");
83             printf("\n");
84             printf("\tIf $HOME/.doldacond.conf does not exist, dolcon-launch will run\n");
85             printf("\tdolconf. Otherwise, if $HOME/.doldacond.pid does not exist,\n");
86             printf("\tor does not contain a valid PID, dolcon-launch will run\n");
87             printf("\tdoldacond-shell. Otherwise, dolcon-launch will run dolcon. All\n");
88             printf("\tthese programs must be somewhere in $PATH for dolcon-launch to work.\n");
89             printf("\n");
90             printf("\tIf doldacond is not in $PATH, only running dolcon is attempted.\n");
91             exit(0);
92         case 'V':
93             printf("%s", RELEASEINFO);
94             exit(0);
95         default:
96             fprintf(stderr, "usage: dolcon-launch [-h]\n");
97             exit(1);
98         }
99     }
100     if(haveprogram("doldacond")) {
101         if(getenv("HOME") != NULL)
102             snprintf(cf, sizeof(cf), "%s/.doldacond.conf", getenv("HOME"));
103         else
104             snprintf(cf, sizeof(cf), "%s/.doldacond.conf", getpwuid(getuid())->pw_dir);
105         if(getenv("HOME") != NULL)
106             snprintf(pf, sizeof(pf), "%s/.doldacond.pid", getenv("HOME"));
107         else
108             snprintf(pf, sizeof(pf), "%s/.doldacond.pid", getpwuid(getuid())->pw_dir);
109         if(access(cf, F_OK)) {
110             execlp("dolconf", "dolconf", "-a", NULL);
111             perror("dolconf");
112         } else if(access(pf, F_OK) || !running(pf)) {
113             execlp("doldacond-shell", "doldacond-shell", NULL);
114             perror("doldacond-shell");
115         } else {
116             execlp("dolcon", "dolcon", "-l", NULL);
117             perror("dolcon");
118         }
119     } else {
120         execlp("dolcon", "dolcon", NULL);
121         perror("dolcon");
122     }
123     return(127);
124 }