【C 言語】【Zig】【PHP FFI】nghttp2 のバージョン番号を表示する

2024/04/17に公開

nghttp2 は HTTP/2 クライアントやサーバーを実装するために使われている。Debian では libnghttp2-dev という名前のパッケージが用意されている。

sudo apt install libnghttp2-dev

コードを書いてみる

test.c
#include <stdio.h>
#include <nghttp2/nghttp2.h>

int main() {
  nghttp2_info *info = nghttp2_version(0);
  printf("%s\n", info->version_str);

  return 0;
}

コンパイルしてみよう

clang -lnghttp2 test.c -o test

続いて Zig のコードを書く

const std = @import("std");
const print = std.debug.print;
const nghttp2 = @cImport({
    @cInclude("nghttp2/nghttp2.h");
});

pub fn main() !void {
  const info = nghttp2.nghttp2_version(0);
  print("{s}\n", .{info.*.version_str});
}

ビルドは次の通り

zig run test.zig -lc -lnghttp2

最後に PHP FFI の例を記載する

// https://github.com/nghttp2/nghttp2/blob/master/lib/includes/nghttp2/nghttp2.h
// https://github.com/nghttp2/nghttp2/blob/master/lib/nghttp2_version.c

$ffi = FFI::cdef("
  typedef struct {
    int age;
    int version_num;
    const char *version_str;
    const char *proto_str;
  } nghttp2_info;
  nghttp2_info *nghttp2_version(int least_version);
");


$info = $ffi->nghttp2_version(0);

var_dump(
  $info->version_str
);

Discussion