aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/cmd_line.c
blob: db6b36b32fb7505a76f8909dac766cddea2574f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Copyright (c) 2023 Egor Tensin <egor@tensin.name>
 * This file is part of the "cimple" project.
 * For details, see https://github.com/egor-tensin/cimple.
 * Distributed under the MIT License.
 */

#include "cmd_line.h"

#include "const.h"
#include "file.h"
#include "log.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char* get_current_binary_path(void) {
    return readlink_wrapper("/proc/self/exe");
}

static char* get_current_binary_name(void) {
    char* path = get_current_binary_path();
    if (!path)
        return NULL;

    char* name = basename(path);

    char* result = strdup(name);
    if (!result) {
        log_errno("strdup");
        goto free_path;
    }

free_path:
    free(path);

    return result;
}

void exit_with_usage(int ec) {
    FILE* dest = stdout;
    if (ec)
        dest = stderr;

    char* binary = get_current_binary_name();

    fprintf(dest, "usage: %s %s\n", binary ? binary : "prog", get_usage_string());
    free(binary);
    exit(ec);
}

void exit_with_usage_err(const char* msg) {
    if (msg)
        fprintf(stderr, "usage error: %s\n", msg);
    exit_with_usage(1);
}

void exit_with_version(void) {
    char* binary = get_current_binary_name();

    printf("%s v%s (%s)\n", binary ? binary : "prog", project_version, project_rev);
    free(binary);
    exit(0);
}