Example #1
0
def write_names(path, codes):
    f = lambda c: c.value
    code_min = min(codes, key=f).value
    code_max = max(codes, key=f).value + 1

    d = {}
    for c in codes:
        d[c.value] = c.name

    with open(path, "w") as fp:
        p, print_newline = partial_print(fp)
        p("""\
#define\tCODE_MIN\t{code_min}
#define\tCODE_MAX\t{code_max}
#define\tCODE_NAMES\t{{ \\
""".format(**locals()))
        for value in range(code_min, code_max):
            try:
                name = d[value]
            except KeyError:
                name = "undefined"
            p("""\
\t\"{name}\", /* {value} */\\
""".format(**locals()))
        p("""\
}}
""".format(**locals()))
        print_vim_special_comment(p)
Example #2
0
def write_cases(path, syscalls, suffix):
    with open(path, "w") as fp:
        p, _ = partial_print(fp)
        for syscall in syscalls:
            if syscall.name not in SYSCALLS:
                continue
            cmd = make_cmd_name(syscall.name)
            p("""\
\tcase {cmd}_{suffix}:
""".format(**locals()))
        write_c_footer(p)
Example #3
0
def write_fslave(dirpath, syscalls):
    for syscall in [sc for sc in syscalls if sc.name in FSLAVE_SYSCALLS]:
        name = drop_prefix(syscall.name)
        path = join(dirpath, "fslave_{name}.c".format(**locals()))
        with open(path, "w") as fp:
            p, print_newline = partial_print(fp)
            print_fslave_head(p, syscall)
            print_fslave_call(p, print_newline, syscall)
            print_newline()
            if 0 < len(syscall.output_args):
                print_fslave_return(p, print_newline, syscall)
                print_newline()
            print_fslave_main(p, print_newline, syscall)
Example #4
0
def write_dispatch(dirpath, syscalls):
    with open(join(dirpath, "dispatch.inc"), "w") as fp:
        p, _ = partial_print(fp)
        for syscall in syscalls:
            if syscall.name not in SYSCALLS:
                continue
            cmd = make_cmd_name(syscall.name)
            name = drop_prefix(syscall.name)
            p("""\
\t\t\tcase {cmd}_CALL:
\t\t\t\tprocess_{name}(slave_thread);
\t\t\t\tbreak;
""".format(**locals()))
        write_c_footer(p)
Example #5
0
def write_syscall(dirpath, syscall):
    local_vars = []
    for datatype, name in (
            ("payload_size_t", "payload_size"),
            ("int", "error")):
        local_vars.append(Variable(datatype, name))
    if 0 < len(syscall.input_args):
        for datatyoe, name in (("int", "wfd"), ):
            local_vars.append(Variable(datatype, name))
    for a in syscall.args:
        if (a.datatype == "void *") or data_of_argument(syscall, a).out:
            continue
        if a.datatype == "char *":
            local_vars.extend(make_string_locals(a.name))
            continue
        if a.datatype == "struct iovec *":
            local_vars.append(Variable(a.datatype, a.name))
            local_vars.append(Variable("u_int", "i"))
            name = "{name}_payload_size".format(**vars(a))
            local_vars.append(Variable("payload_size_t", name))

            size = bufsize_of_datatype("size_t")
            datatype = "char (*)[{size}]".format(**locals())
            name = "{name}_iov_len_buf".format(name=a.name)
            local_vars.append(Variable(datatype, name))

            name = "{name}_iov_len_len".format(name=a.name)
            local_vars.append(Variable("int *", name))
            continue
        for datatype, fmt, size in (
                (a.datatype, "{name}", None),
                ("char", "{name}_buf", bufsize_of_datatype(a.datatype)),
                ("int", "{name}_len", None)):
            v = Variable(datatype, fmt.format(name=a.name), size)
            local_vars.append(v)

    name = syscall.name
    with open(join(dirpath, name) + ".c", "w") as fp:
        p, print_newline = partial_print(fp)
        print_head(syscall, p, name)
        print_locals(p, local_vars)
        print_newline()
        print_encoding(p, syscall)
        if 0 < len(syscall.args):
            print_newline()
        print_write(p, print_newline, syscall)
        print_newline()
        print_tail(p, print_newline, syscall)
Example #6
0
def write_proto(dirpath, syscalls):
    try:
        mkdir(dirpath)
    except OSError:
        pass
    with open(join(dirpath, "proto.h"), "w") as fp:
        p, print_newline = partial_print(fp)
        print_caution(p)
        p("""\
#if !defined(FSYSCALL_PRIVATE_FSLAVE_PROTO_H_INCLUDED)
#define FSYSCALL_PRIVATE_FSLAVE_PROTO_H_INCLUDED
""")
        print_newline()
        for syscall in syscalls:
            if syscall.name not in FSLAVE_SYSCALLS:
                continue
            p("""\
void process_{name}(struct slave_thread *);
""".format(name=drop_prefix(syscall.name)))
        print_newline()
        p("""\
#endif
""")