Modifying the return value of cfg_set* functions, in order to make
[sip-router] / ut.c
1 /*
2  *$Id$
3  *
4  * various general purpose functions
5  *
6  * Copyright (C) 2001-2003 FhG Fokus
7  *
8  * This file is part of ser, a free SIP server.
9  *
10  * ser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * For a license to use the ser software under conditions
16  * other than those described here, or to purchase support for this
17  * software, please contact iptel.org by e-mail at the following addresses:
18  *    info@iptel.org
19  *
20  * ser is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License 
26  * along with this program; if not, write to the Free Software 
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  *
29  */
30
31
32 #include <string.h>
33 #include <sys/types.h>
34 #include <pwd.h>
35 #include <grp.h>
36 #include <stdlib.h>
37 #include <time.h>
38 #include <sys/utsname.h> /* uname() */
39
40
41 #include "ut.h"
42 #include "mem/mem.h"
43
44
45 /* converts a username into uid:gid,
46  * returns -1 on error & 0 on success */
47 int user2uid(int* uid, int* gid, char* user)
48 {
49         char* tmp;
50         struct passwd *pw_entry;
51         
52         if (user){
53                 *uid=strtol(user, &tmp, 10);
54                 if ((tmp==0) ||(*tmp)){
55                         /* maybe it's a string */
56                         pw_entry=getpwnam(user);
57                         if (pw_entry==0){
58                                 goto error;
59                         }
60                         *uid=pw_entry->pw_uid;
61                         if (gid) *gid=pw_entry->pw_gid;
62                 }
63                 return 0;
64         }
65 error:
66         return -1;
67 }
68
69
70
71 /* converts a group name into a gid
72  * returns -1 on error, 0 on success */
73 int group2gid(int* gid, char* group)
74 {
75         char* tmp;
76         struct group  *gr_entry;
77         
78         if (group){
79                 *gid=strtol(group, &tmp, 10);
80                 if ((tmp==0) ||(*tmp)){
81                         /* maybe it's a string */
82                         gr_entry=getgrnam(group);
83                         if (gr_entry==0){
84                                 goto error;
85                         }
86                         *gid=gr_entry->gr_gid;
87                 }
88                 return 0;
89         }
90 error:
91         return -1;
92 }
93
94
95 /*
96  * Replacement of timegm (does not exists on all platforms
97  * Taken from 
98  * http://lists.samba.org/archive/samba-technical/2002-November/025737.html
99  */
100 time_t _timegm(struct tm* t)
101 {
102         time_t tl, tb;
103         struct tm* tg;
104
105         t->tm_isdst = 0;
106         tl = mktime(t);
107         if (tl == -1) {
108                 t->tm_hour--;
109                 tl = mktime (t);
110                 if (tl == -1) {
111                         return -1; /* can't deal with output from strptime */
112                 }
113                 tl += 3600;
114         }
115         
116         tg = gmtime(&tl);
117         tg->tm_isdst = 0;
118         tb = mktime(tg);
119         if (tb == -1) {
120                 tg->tm_hour--;
121                 tb = mktime (tg);
122                 if (tb == -1) {
123                         return -1; /* can't deal with output from gmtime */
124                 }
125                 tb += 3600;
126         }
127         return (tl - (tb - tl));
128 }
129
130
131 /* Convert time_t value that is relative to local timezone to UTC */
132 time_t local2utc(time_t in)
133 {
134         struct tm* tt;
135         tt = gmtime(&in);
136         tt->tm_isdst = -1;
137         return mktime(tt);
138 }
139
140
141 /* Convert time_t value in UTC to to value relative to local time zone */
142 time_t utc2local(time_t in)
143 {
144         struct tm* tt;
145         tt = localtime(&in);
146 #ifdef HAVE_TIMEGM
147         return timegm(tt);
148 #else
149         return _timegm(tt);
150 #endif
151 }
152
153
154 /*
155  * Return str as zero terminated string allocated
156  * using pkg_malloc
157  */
158 char* as_asciiz(str* s)
159 {
160     char* r;
161
162     r = (char*)pkg_malloc(s->len + 1);
163     if (!r) {
164         ERR("Out of memory\n");
165         return 0;
166     }
167     memcpy(r, s->s, s->len);
168     r[s->len] = '\0';
169     return r;
170 }
171
172
173
174 /* return system version (major.minor.minor2) as
175  *  (major<<16)|(minor)<<8|(minor2)
176  * (if some of them are missing, they are set to 0)
177  * if the parameters are not null they are set to the coresp. part 
178  */
179 unsigned int get_sys_version(int* major, int* minor, int* minor2)
180 {
181         struct utsname un;
182         int m1;
183         int m2;
184         int m3;
185         char* p;
186         
187         memset (&un, 0, sizeof(un));
188         m1=m2=m3=0;
189         /* get sys version */
190         uname(&un);
191         m1=strtol(un.release, &p, 10);
192         if (*p=='.'){
193                 p++;
194                 m2=strtol(p, &p, 10);
195                 if (*p=='.'){
196                         p++;
197                         m3=strtol(p, &p, 10);
198                 }
199         }
200         if (major) *major=m1;
201         if (minor) *minor=m2;
202         if (minor2) *minor2=m3;
203         return ((m1<<16)|(m2<<8)|(m3));
204 }
205
206
207