blob: 6ef2567627f4b3c1833d66eafcd23b1339bc96a2 [file]
/* Copyright (C) 2024-2025 maClara, LLC <info@maclara-llc.com>
This file is part of the JWT C Library
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <unistd.h>
static char *pipe_cmd;
static FILE *json_fp;
#ifdef _WIN32
#include <windows.h>
#else
#include <sys/wait.h>
#endif
static inline int write_json(const char *title, const char *str)
{
int exit_code = 0;
if (json_fp == NULL)
json_fp = stdout;
fprintf(json_fp, "\033[0;95m[%s]\033[0m\n", title);
#ifdef _WIN32
FILE *pipe_fp = NULL;
if (pipe_cmd) {
pipe_fp = _popen(pipe_cmd, "w");
if (!pipe_fp) {
perror("popen");
return -1;
}
}
if (pipe_fp) {
if (fwrite(str, 1, strlen(str), pipe_fp) < strlen(str)) {
perror("fwrite");
exit_code = -1;
}
_pclose(pipe_fp);
}
#else
int pipe_fd[2];
int myfd = 0;
pid_t pid;
int status;
if (pipe_cmd) {
char *argv[4] = { "/bin/sh", "-c", NULL, NULL };
if (pipe(pipe_fd)) {
perror(pipe_cmd);
exit(EXIT_FAILURE);
}
argv[2] = pipe_cmd;
pid = fork();
if (pid == 0) {
close(pipe_fd[1]);
if (json_fp == stderr)
dup2(STDERR_FILENO, STDOUT_FILENO);
dup2(pipe_fd[0], STDIN_FILENO);
close(pipe_fd[0]);
execvp(argv[0], argv);
perror("execvp");
exit(EXIT_FAILURE);
} else {
close(pipe_fd[0]);
myfd = pipe_fd[1];
}
}
if (myfd) {
if (write(myfd, str, strlen(str)) < 0) {
perror(pipe_cmd);
exit(EXIT_FAILURE);
}
}
#endif
else {
fprintf(json_fp, "\033[0;96m%s\033[0m\n", str);
}
#ifndef _WIN32
if (myfd) {
close(myfd);
waitpid(pid, &status, 0);
exit_code = WEXITSTATUS(status);
}
#endif
return exit_code;
}
static inline int __jwt_wcb(jwt_t *jwt, jwt_config_t *config)
{
jwt_value_t jval;
int ret = 0, result = 0;
if (config == NULL)
return 1;
jwt_set_GET_JSON(&jval, NULL);
jval.pretty = 1;
ret = jwt_header_get(jwt, &jval);
if (!ret) {
result |= write_json("HEADER", jval.json_val);
free(jval.json_val);
}
jwt_set_GET_JSON(&jval, NULL);
jval.pretty = 1;
ret = jwt_claim_get(jwt, &jval);
if (!ret) {
result |= write_json("PAYLOAD", jval.json_val);
free(jval.json_val);
}
return result;
}
#ifdef _WIN32
__declspec(dllimport) extern char **__argv;
static inline const char *get_progname(void)
{
return __argv[0];
}
#else
extern const char *__progname;
static inline const char *get_progname(void)
{
return __progname;
}
#endif