00001 #include <sysdep.h>
00002 #include "include/libjwgc.h"
00003
00004
00005
00006 int
00007 JSetupComm()
00008 {
00009 mode_t prevmode;
00010 int sock;
00011 struct sockaddr_un sockaddr;
00012 char file[MAXNAMLEN];
00013 struct linger li;
00014 char *envptr;
00015
00016 li.l_onoff = 1;
00017 li.l_linger = 900;
00018
00019 prevmode = umask(S_IRWXO|S_IRWXG);
00020 sock = socket(AF_UNIX, SOCK_STREAM, 0);
00021 if (sock < 0) {
00022 return -1;
00023 }
00024 envptr = getenv("JWGCSCK");
00025 if (!envptr) {
00026 (void) sprintf(file, "/tmp/jwgcsck.%d", getuid());
00027 envptr = file;
00028 }
00029 unlink(envptr);
00030
00031 sockaddr.sun_family = AF_UNIX;
00032 strcpy(sockaddr.sun_path, envptr);
00033 if (bind(sock, (struct sockaddr *)&sockaddr,
00034 strlen(sockaddr.sun_path)+1 + sizeof(sockaddr.sun_family))
00035 < 0) {
00036 return -1;
00037 }
00038 if (listen(sock, 10) < 0) {
00039 return -1;
00040 }
00041
00042 if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&li, sizeof(li))
00043 == -1) {
00044 return -1;
00045 }
00046
00047
00048 umask(prevmode);
00049
00050 return sock;
00051 }
00052
00053 int
00054 JConnect()
00055 {
00056 int sock;
00057 struct sockaddr_un sockaddr;
00058 char file[MAXNAMLEN];
00059 struct linger li;
00060 char *envptr;
00061
00062 li.l_onoff = 1;
00063 li.l_linger = 900;
00064
00065 sock = socket(AF_UNIX, SOCK_STREAM, 0);
00066 if (sock < 0) {
00067 return -1;
00068 }
00069 envptr = getenv("JWGCSCK");
00070 if (!envptr) {
00071 (void) sprintf(file, "/tmp/jwgcsck.%d", getuid());
00072 envptr = file;
00073 }
00074 sockaddr.sun_family = AF_UNIX;
00075
00076 strcpy(sockaddr.sun_path, envptr);
00077 if (connect(sock, (struct sockaddr *)&sockaddr,
00078 strlen(sockaddr.sun_path)+1 + sizeof(sockaddr.sun_family))
00079 < 0) {
00080 return -1;
00081 }
00082
00083 if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&li, sizeof(li))
00084 == -1) {
00085 return -1;
00086 }
00087
00088
00089 return sock;
00090 }
00091
00092 void
00093 JCleanupSocket()
00094 {
00095 char savefile[MAXNAMLEN];
00096 FILE *savefd;
00097 char *envptr;
00098
00099 envptr = getenv("JWGCSCK");
00100 if (!envptr) {
00101 (void) sprintf(savefile, "/tmp/jwgcsck.%d", getuid());
00102 envptr = savefile;
00103 }
00104 unlink(envptr);
00105 }