[[!meta copyright="Copyright © 2011, 2013 Free Software Foundation, Inc."]] [[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable id="license" text="Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled [[GNU Free Documentation License|/fdl]]."]]"""]] [[!tag open_issue_mig]] # IRC, freenode, #hurd, 2011-11-14 also, what's the best way to deal with types such as type cache_info_t = struct[23] of integer_t; whereas cache_info_t contains longs, which are obviously not integer-wide on 64-bits processors ? you mean, to port mach to 64bit? no, to make the RPC declaration portable just in case :) refine integer_t into something more precise such as size_t, off_t, etc. i can't use a single line then struct cache_info contains ints, vm_size_t, longs should i just use the maximum size it can get ? or declare two sizes depending on the word size ? well, I'd say three youpi: three ? the ints, the vm_size_ts, and the longs youpi: i don't get it youpi: how would i write it in mig language ? I don't know the mig language me neither :) but I'd say don't lie i just see struct[23] of smething the original zone_info struct includes both integer_t and vm_size_t, and declares it as type zone_info_t = struct[9] of integer_t; in its mig defs file i don't have a good example to reuse which is lying yes which is why i was wondering if mach architects themselves actually solved that problem :) "There is no way to specify the fields of a C structure to MIG. The size and type-desc are just used to give the size of the structure. " well, this sucks :/ well, i'll do what the rest of the code seems to do, and let it rot until a viable solution is available braunr: we discussed the problem of expressing structs with MIG in the libburn thread (which I still need to follow up on... [sigh]) # IRC, freenode, #hurd, 2013-06-25 is there a nice way to get structured data through mig that I haven't found yet? say an array of string triples no :/ but you shouldn't need that my use case is getting info about fs translators from init to procfs [[hurd/translator/mtab]], [[hurd/translator/mtab/discussion]]. should I go for an iterator like interface instead? depends how many do you need ? you could go for a variable sized array too have a look at what already exists records, maybe 10-15, depends on many fs translators are running a variable sized array is ok if the size isn't too big (and when i say too big, i mean hundreds of MiB) an iterator is ok too if there aren't too many items you may want to combine both (i think that's what proc does) be aware that the maximum size of a message is limited to 512 MiB yeah I saw the array[] of stuff stuff, but array[] of string_t does not work, I guess b/c string_t is also an array how would I send an array of variable length strings? i'm not sure you can or maybe out of line somehow I expected mig to serialize arbitrary data structures, maybe it's to old for that? yeah, I read about uot of line, but that seems overkill it is old yes and not very user friendly in the end let me check we could stuff json into mig... see proc_getallpids for example we could get rid of low level serialization altogether :p hah, exactly what I was looking at (which is what i'll do in x15) type pidarray_t = array[] of pid_t; but that is trivial b/c its array[] of pid_t and always have the server writing guide near you yes well, make one big string and an array of lengths :p thought about that and said to myself, there must be a better way that I haven't found yet or one big string filled with real null-terminated c strings that you keep parsing until you ate all input bytes i'm almost certain there isn't type string_t = c_string[1024]; /* XXX */ yes even that isn't really variable sized you think anyone would object to me putting a json encoder in /hurd/init? it is probably better than me at serializing stuff... try with mig anyway the less dependencies we have for core stuff, the simpler it is but i agree, mig is painful would it be too hacky if I abused the argz functions? they do exactly what I'd need ## IRC, freenode, #hurd, 2013-06-26 there is https://code.google.com/p/protobuf-c/ and it has a rpc mechanism and I believe one could plug arbitrary transports easily please don't think about it we really don't want to add another layer of serialization it's better to completely redesign mach ipc anyway and there is a project for that :p ive seen x15 just food for thought i've studied google protocol buffers and fyi, no, it wouldn't be easy to plug arbitrary transports on top of mach there is a lot of knowledge about mach ports in mig [[hurd/translator/mtab]], [[hurd/translator/mtab/discussion]]. but again I face the challenge of serializing a arbitrary sized list of arbitrary sized strings yes list of ports is easier ;) but I think its worthwile so what about abusing argz* for this? you think it's too bad a hack? no since it's in glibc awesome :) but i don't remember the details well and i'm not sure the way you use it is safe yeah, I might have got the details wrong, I hadn't had the chance to test it ;) about this dynamic size problem a "simple" varying size array should do you can easily put all your strings in there seperated by 0? yes that's exactly what the argz stuff does you'll get the size of the array anyway, and consume it until there is no byte left good but be careful with this too since translators can be run by users, they somtimes can't be trusted and even a translator running as root may behave badly so careful with parsing noted