5cf716ab5e6f9898a03e22d48f5c35ba21be6dcb
[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 main(int argc, char **argv)
50 {
51     int c;
52     char cf[1024], pf[1024];
53     
54     while((c = getopt(argc, argv, "hV")) != -1) {
55         switch(c) {
56         case 'h':
57             printf("usage: dolcon-launch [-hV]\n");
58             printf("\t-h\tDisplay this help message\n");
59             printf("\t-V\tDisplay version info and exit\n");
60             printf("\n");
61             printf("\tIf $HOME/.doldacond.conf does not exist, dolcon-launch will run\n");
62             printf("\tdolconf. Otherwise, if $HOME/.doldacond.pid does not exist,\n");
63             printf("\tor does not contain a valid PID, dolcon-launch will run\n");
64             printf("\tdoldacond-shell. Otherwise, dolcon-launch will run dolcon. All\n");
65             printf("\tthese programs must be somewhere in $PATH for dolcon-launch to work.\n");
66             exit(0);
67         case 'V':
68             printf("%s", RELEASEINFO);
69             exit(0);
70         default:
71             fprintf(stderr, "usage: dolcon-launch [-h]\n");
72             exit(1);
73         }
74     }
75     if(getenv("HOME") != NULL)
76         snprintf(cf, sizeof(cf), "%s/.doldacond.conf", getenv("HOME"));
77     else
78         snprintf(cf, sizeof(cf), "%s/.doldacond.conf", getpwuid(getuid())->pw_dir);
79     if(getenv("HOME") != NULL)
80         snprintf(pf, sizeof(pf), "%s/.doldacond.pid", getenv("HOME"));
81     else
82         snprintf(pf, sizeof(pf), "%s/.doldacond.pid", getpwuid(getuid())->pw_dir);
83     if(access(cf, F_OK)) {
84         execlp("dolconf", "dolconf", "-a", NULL);
85         perror("dolconf");
86     } else if(access(pf, F_OK) || !running(pf)) {
87         execlp("doldacond-shell", "doldacond-shell", NULL);
88         perror("doldacond-shell");
89     } else {
90         execlp("dolcon", "dolcon", "-l", NULL);
91         perror("dolcon");
92     }
93     return(127);
94 }