Portál AbcLinuxu, 7. prosince 2025 17:06
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#define UNIX_PATH_MAX 108
extern int optind;
extern int errno;
void print_usage(char *basename)
{
printf("Usage: %s [-m mode] sock1 ...\n\t-m\toctal permissions\n",basename);
}
int main(int argc, char **argv)
{
int fd, mode, i, res;
char option;
char *endptr;
struct sockaddr_un sa;
while ( (option=getopt(argc, argv, "m:")) != -1 ) {
switch (option) {
case 'm':
if (! optarg) {
print_usage(argv[0]);
exit(1);
}
mode = strtol(optarg, &endptr, 8);
if (*endptr != '\0') {
printf("%s is not valid mode.\n", optarg);
print_usage(argv[0]);
exit(1);
}
break;
default:
print_usage(argv[0]);
exit(1);
}
}
if (argc <= optind) {
printf("Too few arguments.\n");
print_usage(argv[0]);
exit(1);
}
res = 0;
i = optind;
while (i < argc) {
if ( (fd=socket(PF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("Cannot create socket");
exit(1);
}
sa.sun_family = AF_UNIX;
strncpy(sa.sun_path, argv[i], UNIX_PATH_MAX-1);
sa.sun_path[UNIX_PATH_MAX-1] = '\0';
if (bind(fd, (struct sockaddr *) &sa, sizeof(struct sockaddr)) == -1) {
fprintf(stderr, "Cannot create name `%s' in filesystem: %s\n", argv[i], strerror(errno));
res = 2;
}
if (chmod(argv[i], mode) == -1) {
perror("Cannot set permissions");
res = 2;
}
i++;
}
return res;
}
TYPE may be:
b create a block (buffered) special file
c, u create a character (unbuffered) special file
p create a FIFO
Praktické experimenty to potvrzují.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.