struct tlv_packet *sys_config_getenv(struct tlv_handler_ctx *ctx) { struct tlv_packet *p = tlv_packet_response_result(ctx, TLV_RESULT_SUCCESS); struct tlv_iterator i = { .packet = ctx->req, .value_type = TLV_TYPE_ENV_VARIABLE, }; char *env_var; while ((env_var = tlv_packet_iterate_str(&i))) { char *env_val = getenv(normalize_env_var(env_var)); if (env_val) { struct tlv_packet *env = tlv_packet_new(TLV_TYPE_ENV_GROUP, 0); env = tlv_packet_add_str(env, TLV_TYPE_ENV_VARIABLE, env_var); env = tlv_packet_add_str(env, TLV_TYPE_ENV_VALUE, env_val); p = tlv_packet_add_child(p, env); } } return p; } struct tlv_packet *sys_config_getuid(struct tlv_handler_ctx *ctx) { struct tlv_packet *p = tlv_packet_response_result(ctx, TLV_RESULT_SUCCESS); return tlv_packet_add_fmt(p, TLV_TYPE_USER_NAME, "uid=%d, gid=%d, euid=%d, egid=%d", getuid(), geteuid(), getgid(), getegid()); } struct tlv_packet *sys_config_sysinfo(struct tlv_handler_ctx *ctx) { struct mettle *m = ctx->arg; sigar_sys_info_t sys_info; if (sigar_sys_info_get(mettle_get_sigar(m), &sys_info) == -1) { return tlv_packet_response_result(ctx, errno); } struct tlv_packet *p = tlv_packet_response_result(ctx, TLV_RESULT_SUCCESS); p = tlv_packet_add_str(p, TLV_TYPE_COMPUTER_NAME, mettle_get_fqdn(m)); p = tlv_packet_add_fmt(p, TLV_TYPE_OS_NAME, "%s (%s %s)", sys_info.description, sys_info.name, sys_info.version); p = tlv_packet_add_str(p, TLV_TYPE_ARCHITECTURE, sys_info.arch); return p; }
struct tlv_packet *webcam_list(struct tlv_handler_ctx *ctx) { struct tlv_packet *p = tlv_packet_response_result(ctx, TLV_RESULT_SUCCESS); for (int i=0;i<10;i++) { int fd = camera_open(i); if (fd == -1) { continue; } struct v4l2_capability cap; int result = xioctl(fd, VIDIOC_QUERYCAP, &cap); if (result == -1) { if (errno == EINVAL) { break; } else { continue; } } if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { continue; } if (!(cap.capabilities & V4L2_CAP_STREAMING)) { continue; } p = tlv_packet_add_str(p, TLV_TYPE_WEBCAM_NAME, (const char*)cap.card); } return p; }
// Read all lines in `/proc/asound/pcm` if one has the `capture` mode enabled, send it struct tlv_packet *audio_mic_list(struct tlv_handler_ctx *ctx) { struct tlv_packet *p = tlv_packet_response_result(ctx, TLV_RESULT_SUCCESS); char *sound_device = NULL; size_t len = 0; ssize_t read = 0; FILE *proc_asound_pcm = fopen("/proc/asound/pcm", "r"); if (proc_asound_pcm == NULL) { return tlv_packet_response_result(ctx, TLV_RESULT_FAILURE); } while ((read = getline(&sound_device, &len, proc_asound_pcm)) != -1) { if (strstr(sound_device, "capture") != NULL) { p = tlv_packet_add_str(p, TLV_TYPE_AUDIO_INTERFACE_NAME, sound_device); } } return p; }
static void add_method(const char *method, void *arg) { struct tlv_packet **p = arg; *p = tlv_packet_add_str(*p, TLV_TYPE_STRING, method); }