|
Re: Small example for rshd ?: msg#00012gnu.cegcc.devel
Danny Backx wrote: - Error handling at the CreatePipe call. Read the comment, it would be I was going though the code, and since it was easy I ended up doing this change. See attached. Many thanks for reporting it. It's a nice addition. Cheers, Pedro Alves 2007-07-02 Pedro Alves <pedro_alves-BwYwT0D5Mwdz4s462UR3lw@xxxxxxxxxxxxxxxx> Danny Backx <dannybackx-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx> * rshd.c (create_child): Pass struct client_data_t* as parameter, instead of the pipe array pointers. Report CreatePipe and CreateProcess failures to the host. (handle_connection): Pass client_data to create_child. Don't report create_child failures here. Index: rshd.c =================================================================== --- rshd.c (revision 1035) +++ rshd.c (working copy) @@ -493,7 +493,9 @@ to_back_slashes (char *path) /* Start a new process. Returns the new process' handle on success, NULL on failure. */ static HANDLE -create_child (char *program, HANDLE *readh, HANDLE *writeh, PROCESS_INFORMATION *pi) +create_child (char *program, + struct client_data_t* child, + PROCESS_INFORMATION *pi) { BOOL ret; char *args; @@ -536,13 +538,31 @@ create_child (char *program, HANDLE *rea for (i = 0; i < 3; i++) { wchar_t devname[MAX_PATH]; - if (!CreatePipe (&readh[i], &writeh[i], NULL, 0)) - return NULL; + if (!CreatePipe (&child->readh[i], &child->writeh[i], NULL, 0)) + { + char buf[1024]; + DWORD err = GetLastError (); + if (err == ERROR_FILE_NOT_FOUND) + { + sprintf (buf, + "Error creating pipe. " + "Copy PipeDev.dll to the device.\n"); + logprintf ("%s", buf); + } + else + { + sprintf (buf, "Error creating pipe\n" + "%s (%lu)\n", strwinerror (err), err); + logprintf ("%s", buf); + } + send (child->sockfd, buf, strlen (buf), 0); + return NULL; + } wsprintf (devname, L"dev%d", i); - SetPipeTag (readh[i], devname); + SetPipeTag (child->readh[i], devname); - GetPipeName (readh[i], devname); + GetPipeName (child->readh[i], devname); DWORD dwLen = MAX_PATH; GetStdioPathW (i, prev_path[i], &dwLen); SetStdioPathW (i, devname); @@ -567,13 +587,19 @@ create_child (char *program, HANDLE *rea if (!ret) { DWORD err = GetLastError (); - fprintf (stderr, "Error creating process \"%s %s\", (error %d): %s\n", - program, args, (int) err, strwinerror (err)); + char buf[1024]; + + sprintf (buf, + "Error creating process \"%s\"\n" + "%s (error %lu)\n", + program, strwinerror (err), err); + logprintf ("%s", buf); + send (child->sockfd, buf, strlen (buf), 0); for (i = 0; i < 3; i++) { - SafeCloseHandle (&readh[i]); - SafeCloseHandle (&writeh[i]); + SafeCloseHandle (&child->readh[i]); + SafeCloseHandle (&child->writeh[i]); } return NULL; } @@ -827,17 +853,10 @@ handle_connection (void *arg) client_data->stderrsockfd = stderrsockfd; logprintf ("handle_connection: starting command... \n"); - hndproc = create_child (command, client_data->readh, client_data->writeh, &pi); + hndproc = create_child (command, client_data, &pi); if (!hndproc) - { - static char buf[1024]; - DWORD err = GetLastError (); - logprintf ("handle_connection: ERROR can't create child process, " - "winerr %lu\n", err); - sprintf (buf, "can't create process\n%s\n", strwinerror (err)); - send (s2, buf, strlen (buf), 0); - goto shutdown; - } + /* create_child already reports the errors to the host. */ + goto shutdown; thread[0] = CreateThread (NULL, 0, stdin_thread, client_data, 0, NULL); thread[1] = CreateThread (NULL, 0, stdout_thread, client_data, 0, NULL); ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/_______________________________________________ Cegcc-devel mailing list Cegcc-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/cegcc-devel |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Re: Small example for rshd ?: 00012, Pedro Alves |
|---|---|
| Next by Date: | Re: C++ exceptions: 00012, Danny Backx |
| Previous by Thread: | Re: Small example for rshd ?i: 00012, Pedro Alves |
| Next by Thread: | Rshd - blanks in path names: 00012, Danny Backx |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |