r10509: Some more sconscript fixes. Now getting to link stage for smbclient
[bbaumbach/samba-autobuild/.git] / source4 / lib / system.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Samba system utilities
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Jeremy Allison 1998-2002
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23 #include "system/network.h"
24 #include "system/wait.h"
25 #include "system/filesys.h"
26
27 /*
28    The idea is that this file will eventually have wrappers around all
29    important system calls in samba. The aims are:
30
31    - to enable easier porting by putting OS dependent stuff in here
32
33    - to allow for hooks into other "pseudo-filesystems"
34
35    - to allow easier integration of things like the japanese extensions
36
37    - to support the philosophy of Samba to expose the features of
38      the OS within the SMB model. In general whatever file/printer/variable
39      expansions/etc make sense to the OS should be acceptable to Samba.
40 */
41
42
43
44 /*******************************************************************
45  A wrapper for usleep in case we don't have one.
46 ********************************************************************/
47
48 int sys_usleep(long usecs)
49 {
50 #ifndef HAVE_USLEEP
51         struct timeval tval;
52 #endif
53
54         /*
55          * We need this braindamage as the glibc usleep
56          * is not SPEC1170 complient... grumble... JRA.
57          */
58
59         if(usecs < 0 || usecs > 1000000) {
60                 errno = EINVAL;
61                 return -1;
62         }
63
64 #if HAVE_USLEEP
65         usleep(usecs);
66         return 0;
67 #else /* HAVE_USLEEP */
68         /*
69          * Fake it with select...
70          */
71         tval.tv_sec = 0;
72         tval.tv_usec = usecs/1000;
73         select(0,NULL,NULL,NULL,&tval);
74         return 0;
75 #endif /* HAVE_USLEEP */
76 }
77
78
79 /*******************************************************************
80 A read wrapper that will deal with EINTR.
81 ********************************************************************/
82
83 ssize_t sys_read(int fd, void *buf, size_t count)
84 {
85         ssize_t ret;
86
87         do {
88                 ret = read(fd, buf, count);
89         } while (ret == -1 && errno == EINTR);
90         return ret;
91 }
92
93 /*******************************************************************
94 A write wrapper that will deal with EINTR.
95 ********************************************************************/
96
97 ssize_t sys_write(int fd, const void *buf, size_t count)
98 {
99         ssize_t ret;
100
101         do {
102                 ret = write(fd, buf, count);
103         } while (ret == -1 && errno == EINTR);
104         return ret;
105 }
106
107
108
109 /**************************************************************************
110 A wrapper for gethostbyname() that tries avoids looking up hostnames 
111 in the root domain, which can cause dial-on-demand links to come up for no
112 apparent reason.
113 ****************************************************************************/
114
115 struct hostent *sys_gethostbyname(const char *name)
116 {
117 #ifdef REDUCE_ROOT_DNS_LOOKUPS
118         char query[256], hostname[256];
119         char *domain;
120
121         /* Does this name have any dots in it? If so, make no change */
122
123         if (strchr_m(name, '.'))
124                 return(gethostbyname(name));
125
126         /* Get my hostname, which should have domain name 
127                 attached. If not, just do the gethostname on the
128                 original string. 
129         */
130
131         gethostname(hostname, sizeof(hostname) - 1);
132         hostname[sizeof(hostname) - 1] = 0;
133         if ((domain = strchr_m(hostname, '.')) == NULL)
134                 return(gethostbyname(name));
135
136         /* Attach domain name to query and do modified query.
137                 If names too large, just do gethostname on the
138                 original string.
139         */
140
141         if((strlen(name) + strlen(domain)) >= sizeof(query))
142                 return(gethostbyname(name));
143
144         slprintf(query, sizeof(query)-1, "%s%s", name, domain);
145         return(gethostbyname(query));
146 #else /* REDUCE_ROOT_DNS_LOOKUPS */
147         return(gethostbyname(name));
148 #endif /* REDUCE_ROOT_DNS_LOOKUPS */
149 }
150
151 const char *sys_inet_ntoa(struct ipv4_addr in)
152 {
153         struct in_addr in2;
154         in2.s_addr = in.addr;
155         return inet_ntoa(in2);
156 }
157
158 struct ipv4_addr sys_inet_makeaddr(int net, int host)
159 {
160         struct in_addr in;
161         struct ipv4_addr in2;
162         in = inet_makeaddr(net, host);
163         in2.addr = in.s_addr;
164         return in2;
165 }
166