MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id$
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "system.h"
-#include <sys/un.h>
#include <getopt.h>
#include "xalloc.h"
#include "protocol.h"
#include "control_common.h"
#include "rsagen.h"
+#include "utils.h"
/* The name this program was run with. */
char *program_name = NULL;
char *netname = NULL;
char *confbase = NULL;
+#ifdef HAVE_MINGW
+static struct WSAData wsa_state;
+#endif
+
static struct option const long_options[] = {
{"config", required_argument, NULL, 'c'},
{"net", required_argument, NULL, 'n'},
#ifdef HAVE_MINGW
if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\tinc", 0, KEY_READ, &key)) {
if(!RegQueryValueEx(key, NULL, 0, 0, installdir, &len)) {
- if(!logfilename)
- xasprintf(&logfilename, "%s/log/%s.log", identname);
if(!confbase) {
if(netname)
xasprintf(&confbase, "%s/%s", installdir, netname);
int rv, len = 0;
while(len < datalen) {
- rv = read(fd, data + len, datalen - len);
+ rv = recv(fd, data + len, datalen - len, 0);
if(rv == -1 && errno == EINTR)
continue;
else if(rv == -1)
return rv;
else if(rv == 0) {
+#ifdef HAVE_MINGW
+ errno = 0;
+#else
errno = ENODATA;
+#endif
return -1;
}
len += rv;
size_t *indatalen_p) {
tinc_ctl_request_t req;
int rv;
+ void *indata;
+
+ memset(&req, 0, sizeof req);
+ req.length = sizeof req + outdatalen;
+ req.type = type;
+ req.res_errno = 0;
+
+#ifdef HAVE_MINGW
+ if(send(fd, (void *)&req, sizeof req, 0) != sizeof req || send(fd, outdata, outdatalen, 0) != outdatalen)
+ return -1;
+#else
struct iovec vector[2] = {
{&req, sizeof req},
{(void*) outdata, outdatalen}
};
- void *indata;
if(res_errno_p == NULL)
return -1;
- memset(&req, 0, sizeof req);
- req.length = sizeof req + outdatalen;
- req.type = type;
- req.res_errno = 0;
-
while((rv = writev(fd, vector, 2)) == -1 && errno == EINTR) ;
if(rv != req.length)
return -1;
+#endif
if(fullread(fd, &req, sizeof req) == -1)
return -1;
}
int main(int argc, char *argv[], char *envp[]) {
- struct sockaddr_un addr;
tinc_ctl_greeting_t greeting;
int fd;
int result;
* ancestors are writable only by trusted users, which we don't verify.
*/
+#ifdef HAVE_MINGW
+ if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) {
+ fprintf(stderr, "System call `%s' failed: %s", "WSAStartup", winerror(GetLastError()));
+ return 1;
+ }
+
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof addr);
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = htonl(0x7f000001);
+ addr.sin_port = htons(55555);
+
+ fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if(fd < 0) {
+ fprintf(stderr, "Cannot create TCP socket: %s\n", sockstrerror(sockerrno));
+ return 1;
+ }
+
+ unsigned long arg = 0;
+
+ if(ioctlsocket(fd, FIONBIO, &arg) != 0) {
+ fprintf(stderr, "ioctlsocket failed: %s", sockstrerror(sockerrno));
+ }
+#else
+ struct sockaddr_un addr;
struct stat statbuf;
char *lastslash = strrchr(controlsocketname, '/');
if(lastslash != NULL) {
memset(&addr, 0, sizeof addr);
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, controlsocketname, sizeof addr.sun_path - 1);
+#endif
if(connect(fd, (struct sockaddr *)&addr, sizeof addr) < 0) {
- fprintf(stderr, "Cannot connect to %s: %s\n", controlsocketname, strerror(errno));
+
+ fprintf(stderr, "Cannot connect to %s: %s\n", controlsocketname, sockstrerror(sockerrno));
return 1;
}
if(fullread(fd, &greeting, sizeof greeting) == -1) {
fprintf(stderr, "Cannot read greeting from control socket: %s\n",
- strerror(errno));
+ sockstrerror(sockerrno));
return 1;
}