This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Spawning Java from C


I have code that launches Java from C to run a jar file, and creates a
socket to communicate between the calling program and the jar file. It
works in OS X, Linux, and MinGW on Windows, but not on Cygwin.

My first question is that when I run
$  cygcheck -s -v -r > cygcheck.out
/usr/bin/cygrunsrv: warning: OpenService failed for 'DcomLaunch': Win32
error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'ose': Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'ose64': Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'osppsvc': Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'pla': Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'QWAVE': Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'RpcEptMapper':
Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for 'RpcSs': Win32 error 5
Access is denied.
/usr/bin/cygrunsrv: warning: OpenService failed for
'WPFFontCache_v0400': Win32 error 5
Access is denied.

Some things do not work, so is Cygwin installed properly?
-----------------------------------
What happens when I run the code is that the spawned Java cannot find
the jar file, even with its full path ( headed by either /cygdrive/c/...
and \\C:\\....).
$ ./tkfpush.exe 4560 Bar.tkf t
Client: WSAStartup() is OK.
jar location="/cygdrive/c/Users/jar/Tekdraw2/tekPlot/dist/tekPlot.jar"
Client: WSAStartup() is OK.
Client: socket() is OK.
Unable to access jarfile
"/cygdrive/c/Users/jar/Tekdraw2/tekPlot/dist/tekPlot.jar"
socket connect failed: No error
Client: connect() - Failed to connect.

The file is there:
jar@jari7 ~
$ ls /cygdrive/c/Users/jar/Tekdraw2/tekPlot/dist/
README.TXT  lib  tekPlot.jar
------------------------
The relevant code is:

#define TP_LOCATION =
"/cygdrive/c/Users/jar/Tekdraw2/tekPlot/dist/tekPlot.jar"
#define JAVA_LOCATION ="/cygdrive/c/Windows/system32/java"
#define MIN_PORT 49158
#define MAX_PORT 65535
#define BUFFLEN 4096

#define GPC_CYGWIN
#ifdef GPC_CYGWIN
// this stops the FD definitions in types.h
#define __USE_W32_SOCKETS
#endif

#include <stdio.h>      // includes sys/types.h for cygwin
#include <errno.h>
#include "GPCdefs.h"    // must be before sys/types
//#include <sys/types.h>
#define __USE_W32_SOCKETS
#include <dirent.h>   // This includes sys/types.h
#ifdef GPC_WIN
#define __USE_W32_SOCKETS
#include <windows.h>
#include <process.h>
#include <time.h>
#ifdef GPC_CYGWIN
//#include <w32api/winsock2.h>  // included by windows.h
#include <w32api/winbase.h>
#include <string.h>
#endif
#ifdef GPC_MINGW
#include <winsock2.h>
#include <winbase.h>
#include <string.h>
#endif
#endif

int
main(int argc, char** argv) {
    int i;
    char portstr[10];
    int port;
    char *my_env[5];
    char * filename;
    int launch_java = 1;
    char *tp_loc  TP_LOCATION;
    char *java_loc JAVA_LOCATION;
    if (argc <= 3) {
        printf("Usage: tkfPush port tkf_file_name_path launch_java(t/f)");
    } else {
        strncpy(portstr,  argv[1], 10);
        if (argc > 3) {
            launch_java = *argv[3] == 't' ? 1 : 0;
        }
        port = atoi(argv[1]);
        filename = argv[2];
        // Get the environment
        my_env[0] = getenv("PATH");
               
        port = 5556;
        if (port == 0) { // Failure
            fprintf(stderr, "Failed to find an open port in C");
            exit(-1);
        }
        sprintf(portstr, "%d", port);
        fprintf(stdout, "jar location=%s\n", tp_loc);
        // start Java
        if (spawnlp(_P_NOWAIT, "java",
                java_loc,
                 "-jar", tp_loc,
                portstr, NULL) < 0) {
            perror("spawnlp failed");
            exit(EXIT_FAILURE);
        }

        // Initialize Winsock.
        WSADATA wsaData;
        int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

        if (iResult != NO_ERROR)
            printf("Client: Error at WSAStartup().\n");
        else
            printf("Client: WSAStartup() is OK.\n");

        // Create a socket.
        SOCKET m_socket;
        m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        if (m_socket == INVALID_SOCKET) {
            printf("Client: socket() - Error at socket(): %ld\n",
WSAGetLastError());
            WSACleanup();
            return 0;
        } else
            printf("Client: socket() is OK.\n");

        // Connect to a server.
        struct sockaddr_in clientService;

        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
        clientService.sin_port = htons(port);

        /* Must loop to give the Java process time to start */
        time_t now = time(NULL);
        time_t test;
        for (i = 0; i < 10; i++) {
            while (time(NULL) < now + 2l); // wait a bit
            if (connect(m_socket,
                    (SOCKADDR*) & clientService,
                    sizeof (clientService))
                    != SOCKET_ERROR)
                break; /* Successful */
            now = time(NULL);
            if (i == 9) {
                perror("socket connect failed");
                printf("Client: connect() - Failed to connect.\n");
                WSACleanup();
                return 0;
            }
        }

        // Send and receive data.
        int bytesSent;
        /* Now send the file name over the pipe */
        bytesSent = send(m_socket, "#f", 2, 0);
        bytesSent = send(m_socket, filename, strlen(filename), 0);
        printf("Client: send() - Bytes Sent: %ld\n", bytesSent);
        bytesSent = send(m_socket, "#", 1, 0);
    } // End else
    return (EXIT_SUCCESS);
}

So, what am I doing wrong?

Thanks for the help,
Jim

Attachment: cygcheck.out
Description: Text document

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]