On Tuesday, 29 November 2016 at 15:30:33 UTC, Anders S wrote:
Hi guys,

I want to write into a fifo pipe using write( ...)
Now a gather my data into my own struct IOREQ so in order to write I have to cast into an char buffer.

My problem in dlang is that it doesn't accept the casting (IOREQ *) I get: Error: Cannot implicitly convert expression (&sbuf) of type char [1024] to IOREQ*

define FC_GETSTATUS 501;
typedef struct {
        SHORT   fc;                     /* function code */
        SHORT   rs;                     /* return code */
        INT     size;                          /* size of this request, 
including header */
        SHORT   src;                    /* source */
        ....
        INT     argv[1];                /* list of arguments */
} IOREQ;

int WritePipe(int fd, int mess, int argc)
{
  struct IOREQ * io; // my array of data
  char sbuf[1024];
  io = (IOREQ *)buf;      // Not accepted in dlang
  io.fc = FC_GETSTATUS;
  io.src = getpid();        // works

..... // add more data

  st = write(fd, sbuf, 1024);  //
  return st;
}

First, instead of:

 typedef struct {
        SHORT   fc;                     /* function code */
        SHORT   rs;                     /* return code */
        INT     size;                   /* size of this request, including */
        SHORT   src;                    /* source */
        ....
        INT     argv[1];                /* list of arguments */
 } IOREQ;

just

 struct IOREQ {
        SHORT   fc;                     /* function code */
        SHORT   rs;                     /* return code */
        INT     size;                   /* size of this request, including */
        SHORT   src;                    /* source */
        ....
        INT     argv[1];                /* list of arguments */
 } IOREQ;

Then, `write` has the following definition:

https://github.com/dlang/druntime/blob/master/src/core/sys/posix/unistd.d#L100

`ssize_t write(int, in void*, size_t);`

so, it accepts pointer to anything, no need to mess with `char[]`:

    IOREQ mystruct;
    mystruct.src = getpid();
    // etc...

    // write it out
write(fd, &mystruct, mystruct.sizeof); // todo: Don't forget to check for // the return value, etc.

Reply via email to