libfuncs is collection of code (list, queue, circular buffer, io, logging, etc.). https://georgi.unixsol.org/programs/libfuncs/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

server.c 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * Server functions
  3. * Copyright (C) 2006-2010 Unix Solutions Ltd.
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <netdb.h>
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <netinet/in.h>
  14. #include <arpa/inet.h>
  15. void daemonize(char *pidfile) {
  16. if (!pidfile)
  17. return;
  18. printf("Daemonizing.\n");
  19. pid_t pid = fork();
  20. if (pid > 0) {
  21. FILE *F = fopen(pidfile,"w");
  22. if (F) {
  23. fprintf(F,"%i\n",pid);
  24. fclose(F);
  25. }
  26. exit(0);
  27. }
  28. // Child process continues...
  29. setsid(); // request a new session (job control)
  30. freopen("/dev/null", "r", stdin);
  31. freopen("/dev/null", "w", stdout);
  32. freopen("/dev/null", "w", stderr);
  33. }
  34. void init_server_socket(char *bind_addr, int bind_port, struct sockaddr_in *server, int *server_socket) {
  35. char *binded;
  36. struct hostent *host_ptr;
  37. *server_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  38. if (*server_socket == -1) {
  39. perror("socket(server_socket)");
  40. exit(1);
  41. }
  42. int j = 1;
  43. if (setsockopt(*server_socket, SOL_SOCKET, SO_REUSEADDR,(const char *) &j, sizeof(j))<0) {
  44. perror("setsockopt(SO_REUSEADDR)");
  45. exit(1);
  46. }
  47. memset(server, 0, sizeof(struct sockaddr_in));
  48. if (!bind_addr) {
  49. binded = "*";
  50. server->sin_addr.s_addr = htonl(INADDR_ANY);
  51. } else {
  52. host_ptr = gethostbyname(bind_addr);
  53. if (!host_ptr) {
  54. fprintf(stderr,"Error can't resolve bind address: %s\n", bind_addr);
  55. exit(1);
  56. }
  57. memcpy(&server->sin_addr, host_ptr->h_addr, sizeof(server->sin_addr));
  58. binded = inet_ntoa(server->sin_addr);
  59. }
  60. /* Bind to server socket */
  61. fprintf(stderr, "Binding to %s:%i\t", binded, bind_port);
  62. if (strcmp(binded,"*")==0)
  63. fprintf(stderr,"\t");
  64. server->sin_family = AF_INET;
  65. server->sin_port = htons(bind_port);
  66. if (bind(*server_socket, (struct sockaddr *)server, sizeof(struct sockaddr_in)) < 0) {
  67. perror("bind(server_socket)");
  68. exit(1);
  69. }
  70. if (listen(*server_socket, 256) < 0) {
  71. perror("listen()");
  72. exit(1);
  73. }
  74. fputs("[OK]\n",stderr);
  75. }