ok, I made this two ways. I've not too much data on follow, then I use just variables, instead of shared memory. Could you suggest to me something related architect this code.
Code:
=first=============
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pwd.h>
uid_t pw_uid
void
loop()
{
int s;
if (!capable(CAP_NET_ADMIN))
return 0;
s = socket(PF_INET, SOCK_DGRAM, 17);
// do everything from user
}
int
getusr()
{
struct passwd *ptr;
if ((ptr = getpwnam("user")) == NULL)
printf("getpwnam error\n");
return(ptr->pw_uid);
}
int
main(void)
{
getusr();
printf("before fork\n");
if ((pid = fork()) < 0){
printf("fork error\n");
return 0;
}else if (pid == 0) { /* child */
loop();
} else {
/* parent */
}
exit(0);
}
=second=============
--head.h
struct settings {
uint32_t ip;
};
--src1.c
int
getusr()
{
struct passwd *ptr;
if ((ptr = getpwnam("user")) == NULL)
printf("getpwnam error\n");
return(ptr->pw_uid);
}
int
main(void)
{
int fd, i, counter;
pid_t pid;
void *area;
int s;
struct settings *sx = 0;
struct sockaddr_in *sa;
// if ((fd = open("/dev/zero", O_RDWR)) < 0)
// err_sys("open error");
// if ((area = mmap(0, sizeof(long), PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0)) == MAP_FAILED)
// err_sys("mmap error");
// close(fd);
TELL_WAIT();
getusr();
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid > 0) { /* parent */
if(sx){
addr = sx->ip;
close(s);
}else{
s = socket(PF_INET, SOCK_DGRAM, 17);
addr = sa->sin_addr.s_addr;
}
if (bind_socket(s, addr) == -1) {
printf("bind_socket errot\n");
close(s);
return -1;
}
TELL_CHILD(pid);
WAIT_CHILD();
}
} else { /* child */
WAIT_PARENT();
loop();
}
exit(0);
}
--src2.c
extern struct settings *sx;
struct sockaddr_in *sa;
void loop(){
//todo smth.
if(sa->sin_addr.s_addr != &sx->ip)
TELL_PARENT(getppid()); // if I've got another ip-addres in settings struct and call parent.
}