networkbrowser: showmount: fix warnings
[enigma2-plugins.git] / networkbrowser / src / lib / showmount.c
1 /*###########################################################################
2 #
3 # Copyright (C) 1993 by Rick Sladkey <jrs@world.std.com>
4 # Copyright (C) 2008 by nixkoenner <nixkoenner@newnigma2.to>
5
6 # License: GPL
7 #
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #
22 ###########################################################################*/
23
24 #include <stdio.h>
25 #include <rpc/rpc.h>
26 #include <sys/socket.h>
27 #include <netinet/in.h>
28 #include <sys/time.h>
29 #include <string.h>
30 #include <sys/types.h>
31 #include <unistd.h>
32 #include <memory.h>
33 #include <stdlib.h>
34
35 #include <netdb.h>
36 #include <arpa/inet.h>
37 #include <errno.h>
38 #include <getopt.h>
39 #include <unistd.h>
40
41 #include "showmount.h"
42
43 #define MOUNTPROG 100005
44 #define MOUNTVERS 1
45 #define MOUNTPROC_EXPORT 5
46 #define MOUNTPROC_DUMP 2
47 #define MNTPATHLEN 1024
48 #define MNTNAMLEN 255
49
50 typedef char *dirpath;
51 typedef char *name;
52
53 typedef struct mountbody *mountlist;
54 struct mountbody {
55         name ml_hostname;
56         dirpath ml_directory;
57         mountlist ml_next;
58 };
59 typedef struct mountbody mountbody;
60
61 typedef struct groupnode *groups;
62 struct groupnode {
63         name gr_name;
64         groups gr_next;
65 };
66 typedef struct groupnode groupnode;
67
68 typedef struct exportnode *exports;
69 struct exportnode {
70         dirpath ex_dir;
71         groups ex_groups;
72         exports ex_next;
73 };
74 typedef struct exportnode exportnode;
75 /****************************************************************************
76 lokal prototype
77 ****************************************************************************/
78 bool_t xdr_mountbody (XDR *xdrs, mountbody *objp);
79 bool_t xdr_mountlist (XDR *xdrs, mountlist *objp);
80 bool_t xdr_exports (XDR *xdrs, exports *objp);
81 bool_t xdr_exportnode (XDR *xdrs, exportnode *objp);
82 bool_t xdr_name (XDR *xdrs, name *objp);
83 bool_t xdr_dirpath (XDR *xdrs, dirpath *objp);
84 bool_t xdr_groups (XDR *xdrs, groups *objp);
85 bool_t xdr_groupnode (XDR *xdrs, groupnode *objp);
86 int dump_cmp(char **p, char **q);
87
88 #define MAXHOSTLEN 256
89
90 int dump_cmp(char **p, char **q)
91 {
92         return strcmp(*p, *q);
93 }
94
95
96 bool_t xdr_mountlist (XDR *xdrs, mountlist *objp)
97 {
98          if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct mountbody), (xdrproc_t) xdr_mountbody))
99                  return FALSE;
100         return TRUE;
101 }
102
103 bool_t xdr_mountbody (XDR *xdrs, mountbody *objp)
104 {
105          if (!xdr_name (xdrs, &objp->ml_hostname))
106                  return FALSE;
107          if (!xdr_dirpath (xdrs, &objp->ml_directory))
108                  return FALSE;
109          if (!xdr_mountlist (xdrs, &objp->ml_next))
110                  return FALSE;
111         return TRUE;
112 }
113
114 bool_t xdr_exports (XDR *xdrs, exports *objp)
115 {
116          if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct exportnode), (xdrproc_t) xdr_exportnode))
117                  return FALSE;
118         return TRUE;
119 }
120
121 bool_t xdr_exportnode (XDR *xdrs, exportnode *objp)
122 {
123          if (!xdr_dirpath (xdrs, &objp->ex_dir))
124                  return FALSE;
125          if (!xdr_groups (xdrs, &objp->ex_groups))
126                  return FALSE;
127          if (!xdr_exports (xdrs, &objp->ex_next))
128                  return FALSE;
129         return TRUE;
130 }
131
132 bool_t xdr_dirpath (XDR *xdrs, dirpath *objp)
133 {
134          if (!xdr_string (xdrs, objp, MNTPATHLEN))
135                  return FALSE;
136         return TRUE;
137 }
138
139 bool_t xdr_name (XDR *xdrs, name *objp)
140 {
141          if (!xdr_string (xdrs, objp, MNTNAMLEN))
142                  return FALSE;
143         return TRUE;
144 }
145
146 bool_t xdr_groups (XDR *xdrs, groups *objp)
147 {
148          if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct groupnode), (xdrproc_t) xdr_groupnode))
149                  return FALSE;
150         return TRUE;
151 }
152
153 bool_t xdr_groupnode (XDR *xdrs, groupnode *objp)
154 {
155          if (!xdr_name (xdrs, &objp->gr_name))
156                  return FALSE;
157          if (!xdr_groups (xdrs, &objp->gr_next))
158                  return FALSE;
159         return TRUE;
160 }
161
162 nfsinfo * newNfsInfo()
163 {
164         nfsinfo *nfsInfo = malloc(sizeof(nfsinfo)*255);
165         if(!nfsInfo)
166                 exit(0); // TODO: besser machen
167                 memset(nfsInfo,0,sizeof(nfsinfo)*255);
168         return nfsInfo;
169 }
170
171 void freeNfsInfo(nfsinfo *nfsInfo)
172 {
173         free(nfsInfo);
174 }
175
176 int showNfsShare(char *pythonIp, nfsinfo *nfsInfo) 
177 {
178         char *hostname;
179         enum clnt_stat clnt_stat;
180         struct hostent *hp;
181         struct sockaddr_in server_addr;
182         int msock;
183         struct timeval total_timeout;
184         struct timeval pertry_timeout;
185         CLIENT *mclient;
186         groups grouplist;
187         exports exportlist;
188         int pos = 0;
189
190         if (pythonIp != NULL)
191         {
192                 hostname = pythonIp;
193         }
194         else
195         {
196                 printf ("falscher aufruf showm ip, ergebnis ist showm 127.0.0.1\n");
197                 hostname = "127.0.0.1";
198         }
199         if (hostname[0] >= '0' && hostname[0] <= '9') {
200                 server_addr.sin_family = AF_INET;
201                 server_addr.sin_addr.s_addr = inet_addr(hostname);
202         }
203         else {
204                 if ((hp = gethostbyname(hostname)) == NULL) {
205                         exit(1);
206                 }
207                 server_addr.sin_family = AF_INET;
208                 memcpy(&server_addr.sin_addr, hp->h_addr, hp->h_length);
209         }
210
211         /* create mount deamon client */
212
213         server_addr.sin_port = 0;
214         msock = RPC_ANYSOCK;
215         if ((mclient = clnttcp_create(&server_addr,
216             MOUNTPROG, MOUNTVERS, &msock, 0, 0)) == NULL) {
217                 server_addr.sin_port = 0;
218                 msock = RPC_ANYSOCK;
219                 pertry_timeout.tv_sec = 3;
220                 pertry_timeout.tv_usec = 0;
221                 if ((mclient = clntudp_create(&server_addr,
222                     MOUNTPROG, MOUNTVERS, pertry_timeout, &msock)) == NULL) {
223                         //clnt_pcreateerror("mount clntudp_create");
224                         strcpy(nfsInfo[0].share, "ERROR: mount clntudp_create");
225                         return(1);
226                 }
227         }
228         mclient->cl_auth = authunix_create_default();
229         total_timeout.tv_sec = 20;
230         total_timeout.tv_usec = 0;
231
232                 memset(&exportlist, '\0', sizeof(exportlist));
233                 clnt_stat = clnt_call(mclient, MOUNTPROC_EXPORT,
234                         (xdrproc_t) xdr_void, NULL,
235                         (xdrproc_t) xdr_exports, (caddr_t) &exportlist,
236                         total_timeout);
237                 if (clnt_stat != RPC_SUCCESS) {
238                         //clnt_perror(mclient, "rpc mount export");
239                         strcpy(nfsInfo[0].share, "ERROR: mount clntudp_create");
240                         return(1);
241                 }
242                 pos = 0;
243                 while (exportlist) {
244                         strcpy(nfsInfo[pos].share, exportlist->ex_dir);
245                         grouplist = exportlist->ex_groups;
246                         //printf ("blubb ex %s, group %s\n", exportlist->ex_dir,grouplist->gr_name);
247                         if (grouplist)
248                                 strcpy(nfsInfo[pos].ip, grouplist->gr_name);
249                         else
250                                 strcpy(nfsInfo[pos].ip, "world");
251                         pos ++;
252                         exportlist = exportlist->ex_next;
253                 }
254         return 0;
255
256 }