Revision: 76655
http://sourceforge.net/p/brlcad/code/76655
Author: starseeker
Date: 2020-08-03 21:17:01 +0000 (Mon, 03 Aug 2020)
Log Message:
-----------
r76624 broke rt command in Archer on Windows. Switch to using a semantic enum
to specifiy I/O channel in the API, rather than any sort of int.
Modified Paths:
--------------
brlcad/trunk/include/bu/process.h
brlcad/trunk/include/ged/defines.h
brlcad/trunk/include/tclcad.h
brlcad/trunk/src/libbu/process.c
brlcad/trunk/src/libtclcad/tclcad_obj.c
Modified: brlcad/trunk/include/bu/process.h
===================================================================
--- brlcad/trunk/include/bu/process.h 2020-08-03 18:16:00 UTC (rev 76654)
+++ brlcad/trunk/include/bu/process.h 2020-08-03 21:17:01 UTC (rev 76655)
@@ -48,11 +48,12 @@
/* Wrappers for using subprocess execution */
struct bu_process;
-#define BU_PROCESS_STDIN 0
-#define BU_PROCESS_STDOUT 1
-#define BU_PROCESS_STDERR 2
+typedef enum {
+ BU_PROCESS_STDIN,
+ BU_PROCESS_STDOUT,
+ BU_PROCESS_STDERR
+} bu_process_io_t;
-
/**
* Open and return a FILE pointer associated with the specified file
* descriptor for input (0), output (1), or error (2) respectively.
@@ -66,7 +67,7 @@
* FIXME: misnomer, this does not open a process. Probably doesn't
* need to exist; just call fdopen().
*/
-BU_EXPORT extern FILE *bu_process_open(struct bu_process *pinfo, int fd);
+BU_EXPORT extern FILE *bu_process_open(struct bu_process *pinfo,
bu_process_io_t d);
/**
@@ -75,19 +76,20 @@
* FIXME: misnomer, this does not close a process. Probably doesn't
* need to exist; just call fclose().
*/
-BU_EXPORT extern void bu_process_close(struct bu_process *pinfo, int fd);
+BU_EXPORT extern void bu_process_close(struct bu_process *pinfo,
bu_process_io_t d);
/**
- * Retrieve the pointer to the input (0), output (1), or error (2) file
- * descriptor associated with the process. To use this in calling code, the
- * caller must cast the supplied pointer to the file handle type of the
- * calling code's specific platform.
+ * Retrieve the pointer to the input (BU_PROCESS_STDIN), output
+ * (BU_PROCESS_STDOUT), or error (BU_PROCESS_STDERR) file descriptor associated
+ * with the process. To use this in calling code, the caller must cast the
+ * supplied pointer to the file handle type of the calling code's specific
+ * platform.
*
* FIXME: void pointer casting is bad. this function probably
* shouldn't exist.
*/
-BU_EXPORT void *bu_process_fd(struct bu_process *pinfo, int fd);
+BU_EXPORT void *bu_process_fd(struct bu_process *pinfo, bu_process_io_t d);
/**
@@ -127,7 +129,7 @@
* FIXME: arg ordering and input/output grouping is wrong. partially
* redundant with bu_process_fd() and/or bu_process_open().
*/
-BU_EXPORT extern int bu_process_read(char *buff, int *count, struct bu_process
*pinfo, int fd, int n);
+BU_EXPORT extern int bu_process_read(char *buff, int *count, struct bu_process
*pinfo, bu_process_io_t d, int n);
/**
Modified: brlcad/trunk/include/ged/defines.h
===================================================================
--- brlcad/trunk/include/ged/defines.h 2020-08-03 18:16:00 UTC (rev 76654)
+++ brlcad/trunk/include/ged/defines.h 2020-08-03 21:17:01 UTC (rev 76655)
@@ -268,8 +268,8 @@
* can't know about as it is application specific) lives. It should be
assigned in the
* applications gedp before any calls to ged_create_io_handler are made.
* */
- void (*ged_create_io_handler)(struct ged_subprocess *gp, int fd,
ged_io_func_t callback, void *data);
- void (*ged_delete_io_handler)(struct ged_subprocess *gp, int fd);
+ void (*ged_create_io_handler)(struct ged_subprocess *gp, bu_process_io_t
d, ged_io_func_t callback, void *data);
+ void (*ged_delete_io_handler)(struct ged_subprocess *gp, bu_process_io_t
fd);
void *ged_io_data; /**< brief caller supplied data */
// Other callbacks...
Modified: brlcad/trunk/include/tclcad.h
===================================================================
--- brlcad/trunk/include/tclcad.h 2020-08-03 18:16:00 UTC (rev 76654)
+++ brlcad/trunk/include/tclcad.h 2020-08-03 21:17:01 UTC (rev 76655)
@@ -34,6 +34,7 @@
#include "common.h"
#include "bu/cmd.h"
+#include "bu/process.h"
#include "tcl.h"
#include "dm.h"
#include "ged.h"
@@ -522,9 +523,9 @@
int io_mode;
};
TCLCAD_EXPORT void
-tclcad_create_io_handler(struct ged_subprocess *p, int fd, ged_io_func_t
callback, void *data);
+tclcad_create_io_handler(struct ged_subprocess *p, bu_process_io_t d,
ged_io_func_t callback, void *data);
TCLCAD_EXPORT void
-tclcad_delete_io_handler(struct ged_subprocess *p, int fd);
+tclcad_delete_io_handler(struct ged_subprocess *p, bu_process_io_t d);
/* dm_tcl.c */
Modified: brlcad/trunk/src/libbu/process.c
===================================================================
--- brlcad/trunk/src/libbu/process.c 2020-08-03 18:16:00 UTC (rev 76654)
+++ brlcad/trunk/src/libbu/process.c 2020-08-03 21:17:01 UTC (rev 76655)
@@ -76,12 +76,12 @@
void
-bu_process_close(struct bu_process *pinfo, int fd)
+bu_process_close(struct bu_process *pinfo, bu_process_io_t d)
{
if (!pinfo)
return;
- if (fd == fileno(stdin)) {
+ if (d == BU_PROCESS_STDIN) {
if (!pinfo->fp_in)
return;
(void)fclose(pinfo->fp_in);
@@ -88,7 +88,7 @@
pinfo->fp_in = NULL;
return;
}
- if (fd == fileno(stdout)) {
+ if (d == BU_PROCESS_STDOUT) {
if (!pinfo->fp_out)
return;
(void)fclose(pinfo->fp_out);
@@ -95,7 +95,7 @@
pinfo->fp_out = NULL;
return;
}
- if (fd == fileno(stderr)) {
+ if (d == BU_PROCESS_STDERR) {
if (!pinfo->fp_err)
return;
(void)fclose(pinfo->fp_err);
@@ -106,14 +106,14 @@
FILE *
-bu_process_open(struct bu_process *pinfo, int fd)
+bu_process_open(struct bu_process *pinfo, bu_process_io_t d)
{
if (!pinfo)
return NULL;
- bu_process_close(pinfo, fd);
+ bu_process_close(pinfo, d);
- if (fd == fileno(stdin)) {
+ if (d == BU_PROCESS_STDIN) {
#ifndef _WIN32
pinfo->fp_in = fdopen(pinfo->fd_in, "wb");
#else
@@ -121,7 +121,7 @@
#endif
return pinfo->fp_in;
}
- if (fd == fileno(stdout)) {
+ if (d == BU_PROCESS_STDOUT) {
#ifndef _WIN32
pinfo->fp_out = fdopen(pinfo->fd_out, "rb");
#else
@@ -129,7 +129,7 @@
#endif
return pinfo->fp_out;
}
- if (fd == fileno(stderr)) {
+ if (d == BU_PROCESS_STDERR) {
#ifndef _WIN32
pinfo->fp_err = fdopen(pinfo->fd_err, "rb");
#else
@@ -143,16 +143,16 @@
void *
-bu_process_fd(struct bu_process *pinfo, int fd)
+bu_process_fd(struct bu_process *pinfo, bu_process_io_t d)
{
- if (!pinfo || fd < 0)
+ if (!pinfo)
return NULL;
- if (fd == fileno(stdin))
+ if (d == BU_PROCESS_STDIN)
return (void *)(&(pinfo->fd_in));
- if (fd == fileno(stdout))
+ if (d == BU_PROCESS_STDOUT)
return (void *)(&(pinfo->fd_out));
- if (fd == fileno(stderr))
+ if (d == BU_PROCESS_STDERR)
return (void *)(&(pinfo->fd_err));
return NULL;
@@ -184,13 +184,13 @@
int
-bu_process_read(char *buff, int *count, struct bu_process *pinfo, int fd, int
n)
+bu_process_read(char *buff, int *count, struct bu_process *pinfo,
bu_process_io_t d, int n)
{
int ret = 1;
- if (!pinfo || !buff || !n || !count || fd < 1)
+ if (!pinfo || !buff || !n || !count)
return -1;
- if (fd == fileno(stdout)) {
+ if (d == BU_PROCESS_STDOUT) {
#ifndef _WIN32
(*count) = read((int)pinfo->fd_out, buff, n);
if ((*count) <= 0) {
@@ -205,7 +205,7 @@
(*count) = (int)dcount;
#endif
}
- if (fd == fileno(stderr)) {
+ if (d == BU_PROCESS_STDERR) {
#ifndef _WIN32
(*count) = read((int)pinfo->fd_err, buff, n);
if ((*count) <= 0) {
@@ -308,17 +308,17 @@
setpgid(0, 0);
/* Redirect stdin and stderr */
- (void)close(fileno(stdin));
+ (void)close(BU_PROCESS_STDIN);
pret = dup(pipe_in[0]);
if (pret < 0) {
perror("dup");
}
- (void)close(fileno(stdout));
+ (void)close(BU_PROCESS_STDOUT);
pret = dup(pipe_out[1]);
if (pret < 0) {
perror("dup");
}
- (void)close(fileno(stderr));
+ (void)close(BU_PROCESS_STDERR);
pret = dup(pipe_err[1]);
if (pret < 0) {
perror("dup");
@@ -522,8 +522,8 @@
}
/* Clean up */
- bu_process_close(pinfo, fileno(stdout));
- bu_process_close(pinfo, fileno(stderr));
+ bu_process_close(pinfo, BU_PROCESS_STDOUT);
+ bu_process_close(pinfo, BU_PROCESS_STDERR);
/* Free copy of exec args */
if (pinfo->cmd) {
Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_obj.c 2020-08-03 18:16:00 UTC (rev
76654)
+++ brlcad/trunk/src/libtclcad/tclcad_obj.c 2020-08-03 21:17:01 UTC (rev
76655)
@@ -1182,11 +1182,11 @@
/* Wrappers for setting up/tearing down IO handler */
#ifndef _WIN32
void
-tclcad_create_io_handler(struct ged_subprocess *p, int fd, ged_io_func_t
callback, void *data)
+tclcad_create_io_handler(struct ged_subprocess *p, bu_process_io_t d,
ged_io_func_t callback, void *data)
{
if (!p || !p->p || !p->gedp || !p->gedp->ged_io_data)
return;
- int *fdp = (int *)bu_process_fd(p->p, fd);
+ int *fdp = (int *)bu_process_fd(p->p, d);
if (fdp) {
struct tclcad_io_data *t_iod = (struct tclcad_io_data
*)p->gedp->ged_io_data;
Tcl_CreateFileHandler(*fdp, t_iod->io_mode, callback, (ClientData)data);
@@ -1194,10 +1194,10 @@
}
void
-tclcad_delete_io_handler(struct ged_subprocess *p, int fd)
+tclcad_delete_io_handler(struct ged_subprocess *p, bu_process_io_t d)
{
if (!p) return;
- int *fdp = (int *)bu_process_fd(p->p, fd);
+ int *fdp = (int *)bu_process_fd(p->p, d);
if (fdp) {
Tcl_DeleteFileHandler(*fdp);
close(*fdp);
@@ -1206,12 +1206,12 @@
#else
void
-tclcad_create_io_handler(struct ged_subprocess *p, int fd, ged_io_func_t
callback, void *data)
+tclcad_create_io_handler(struct ged_subprocess *p, bu_process_io_t d,
ged_io_func_t callback, void *data)
{
if (!p || !p->p || !p->gedp || !p->gedp->ged_io_data)
return;
struct tclcad_io_data *t_iod = (struct tclcad_io_data
*)p->gedp->ged_io_data;
- HANDLE *fdp = (HANDLE *)bu_process_fd(p->p, fd);
+ HANDLE *fdp = (HANDLE *)bu_process_fd(p->p, d);
if (fdp) {
t_iod->chan = Tcl_MakeFileChannel(*fdp, t_iod->io_mode);
Tcl_CreateChannelHandler(t_iod->chan, t_iod->io_mode, callback,
(ClientData)data);
@@ -1219,7 +1219,7 @@
}
void
-tclcad_delete_io_handler(struct ged_subprocess *p, int fd)
+tclcad_delete_io_handler(struct ged_subprocess *p, bu_process_io_t d)
{
if (!p || !p->p || !p->gedp || !p->gedp->ged_io_data)
return;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits