|
7 | 7 |
|
8 | 8 | #define handle_error(errstr) do { perror(errstr); exit(EXIT_FAILURE); } while (0) |
9 | 9 |
|
| 10 | +#define DEFAULT_SOCKET "/var/run/libcare.sock" |
| 11 | + |
10 | 12 | int main(int argc, char **argv) |
11 | 13 | { |
12 | 14 | int sock, rv, buflen, i; |
13 | 15 | struct sockaddr_un sockaddr; |
14 | | - char *buffer = NULL, *p; |
| 16 | + char *buffer = NULL, *p, *sockpath = DEFAULT_SOCKET; |
15 | 17 |
|
16 | | - if (argc < 3) { |
17 | | - printf("%s: SOCKET ARG0 [ARG1] [ARG2]\n", argv[0]); |
| 18 | + if (argc < 2 || (argv[1][0] == '/' && argc < 3)) { |
| 19 | + printf("%s: [/SOCKET] ARG0 [ARG1] [ARG2]\n", argv[0]); |
18 | 20 | exit(EXIT_FAILURE); |
19 | 21 | } |
20 | 22 |
|
| 23 | + argv++; |
| 24 | + argc--; |
| 25 | + |
21 | 26 | sock = socket(AF_UNIX, SOCK_STREAM, 0); |
22 | 27 | if (sock == -1) |
23 | 28 | handle_error("socket(AF_UNIX)"); |
24 | 29 |
|
25 | 30 | sockaddr.sun_family = AF_UNIX; |
26 | | - strncpy(sockaddr.sun_path, argv[1], sizeof(sockaddr.sun_path)); |
| 31 | + |
| 32 | + if (argv[0][0] == '/') { |
| 33 | + sockpath = argv[0]; |
| 34 | + argv++; |
| 35 | + argc--; |
| 36 | + } |
| 37 | + strncpy(sockaddr.sun_path, sockpath, sizeof(sockaddr.sun_path)); |
27 | 38 |
|
28 | 39 | rv = connect(sock, (const struct sockaddr *)&sockaddr, sizeof(sockaddr)); |
29 | 40 | if (rv == -1) |
30 | 41 | handle_error("connect"); |
31 | 42 |
|
32 | 43 | buflen = 0; |
33 | | - for (i = 2; i < argc; i++) { |
| 44 | + for (i = 0; i < argc; i++) { |
34 | 45 | buflen += strlen(argv[i]) + 1; |
35 | 46 | } |
36 | 47 | buflen++; |
37 | 48 |
|
38 | 49 | p = buffer = malloc(buflen); |
39 | 50 | if (buffer == NULL) |
40 | 51 | handle_error("malloc"); |
41 | | - for (i = 2; i < argc; i++) { |
| 52 | + for (i = 0; i < argc; i++) { |
42 | 53 | p = stpcpy(p, argv[i]); |
43 | 54 | p++; |
44 | 55 | } |
|
0 commit comments