On Tue, Aug 28, 2018 at 02:43:12PM -0500, Steve French wrote: > > > On Tue, Aug 28, 2018 at 1:12 PM Jeremy Allison <jra@xxxxxxxxx> wrote: > > > > You shouldn't need a read stream ioctl. You only need 3 I think. > > > > struct open_stream { > > const char *stream_name; > > int open_flags, > > int stream_fd; > > }; > > > > struct open_stream os = { > > "MyStreamName", > > O_CREAT, > > -1 > > }; > > > > 1). ioctl(file_or_dir_fd, FIO_OPEN_STREAM, &os); > > > > Now read/write the os->stream_fd for the created > > stream as desired. Use O_RDONLY|O_WRONLY|O_RDWR > > in the flags field as needed. > > > > 2). ioctl(file_or_dir_fd, FIO_ENUM_STREAMS_DIR, &new_fd); > > > > Now use readdir() to get the list. > > > > 3). ioctl(stream_fd, FIO_DELETE_STREAM, 0); > > > > Delete the stream opened on stream_fd. > > > > Doesn't that cover everything ? > > This would be trickier to code than you might think. > > In particular I think the reaadir to list streams is going to be > harder than the ioctl > I had coded for it. I also had code at one point to convert streams > to xattrs etc. Why is that ? You control any fd's you return, so you can vector any readdir call into an enum_streams request ? I wouldn't return streams as xattrs, as they are separately exposed and already have meaning in SMB1/2/3.