network.c

Go to the documentation of this file.
00001 // Copyright 2005-2006 Benedikt Böhm <hollow@gentoo.org>
00002 //
00003 // This program is free software; you can redistribute it and/or modify
00004 // it under the terms of the GNU General Public License as published by
00005 // the Free Software Foundation; either version 2 of the License, or
00006 // (at your option) any later version.
00007 //
00008 // This program is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011 // GNU General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this program; if not, write to the
00015 // Free Software Foundation, Inc.,
00016 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00017 
00018 #include <stdint.h>
00019 #include <errno.h>
00020 
00021 #include "linux/vserver/switch.h"
00022 #include "linux/vserver/cacct_cmd.h"
00023 #include "linux/vserver/network_cmd.h"
00024 
00025 #include "vserver.h"
00026 
00027 /* we don't want to use those from libc, but don't want lucid either */
00028 static inline
00029 int str_len(const char *str)
00030 {
00031         int i = 0;
00032 
00033         while (*str++)
00034                 i++;
00035 
00036         return i;
00037 }
00038 
00039 static inline
00040 void str_zero(void *str, int n)
00041 {
00042         char *p = str;
00043 
00044         while (n--)
00045                 *p++ = 0;
00046 }
00047 
00048 static inline
00049 int str_cpyn(void *dst, const void *src, int n)
00050 {
00051         char *d = dst;
00052         const char *s = src;
00053 
00054         while (n--)
00055                 *d++ = *s++;
00056 
00057         return d - (char *) dst;
00058 }
00059 
00060 int nx_create(nid_t nid, nx_flags_t *data)
00061 {
00062         struct vcmd_net_create kdata = {
00063                 .flagword = 0,
00064         };
00065 
00066         if (data)
00067                 kdata.flagword = data->flags;
00068 
00069         return vserver(VCMD_net_create, nid, &kdata);
00070 }
00071 
00072 int nx_migrate(nid_t nid)
00073 {
00074         return vserver(VCMD_net_migrate, nid, NULL);
00075 }
00076 
00077 int nx_task_nid(pid_t pid)
00078 {
00079         return vserver(VCMD_task_nid, pid, NULL);
00080 }
00081 
00082 int nx_info(nid_t nid, nx_info_t *data)
00083 {
00084         struct vcmd_nx_info_v0 kdata;
00085 
00086         int rc = vserver(VCMD_nx_info, nid, &kdata);
00087 
00088         if (rc == -1)
00089                 return rc;
00090 
00091         if (data)
00092                 data->nid = kdata.nid;
00093 
00094         return rc;
00095 }
00096 
00097 int nx_addr_add(nid_t nid, nx_addr_t *data)
00098 {
00099         struct vcmd_net_addr_v0 kdata;
00100 
00101         if (!data)
00102                 return errno = EINVAL, -1;
00103 
00104         kdata.type  = data->type;
00105         kdata.count = data->count;
00106 
00107         str_cpyn(kdata.ip,   data->ip,   sizeof(kdata.ip));
00108         str_cpyn(kdata.mask, data->mask, sizeof(kdata.mask));
00109 
00110         return vserver(VCMD_net_add, nid, &kdata);
00111 }
00112 
00113 int nx_addr_remove(nid_t nid, nx_addr_t *data)
00114 {
00115         struct vcmd_net_addr_v0 kdata;
00116 
00117         if (!data)
00118                 return errno = EINVAL, -1;
00119 
00120         kdata.type  = data->type;
00121         kdata.count = data->count;
00122 
00123         str_cpyn(kdata.ip,   data->ip,   sizeof(kdata.ip));
00124         str_cpyn(kdata.mask, data->mask, sizeof(kdata.mask));
00125 
00126         return vserver(VCMD_net_remove, nid, &kdata);
00127 }
00128 
00129 int nx_flags_set(nid_t nid, nx_flags_t *data)
00130 {
00131         struct vcmd_net_flags_v0 kdata;
00132 
00133         if (!data)
00134                 return errno = EINVAL, -1;
00135 
00136         kdata.flagword = data->flags;
00137         kdata.mask     = data->mask;
00138 
00139         return vserver(VCMD_set_nflags, nid, &kdata);
00140 }
00141 
00142 int nx_flags_get(nid_t nid, nx_flags_t *data)
00143 {
00144         struct vcmd_net_flags_v0 kdata;
00145 
00146         if (!data)
00147                 return errno = EINVAL, -1;
00148 
00149         int rc = vserver(VCMD_get_nflags, nid, &kdata);
00150 
00151         if (rc == -1)
00152                 return rc;
00153 
00154         data->flags = kdata.flagword;
00155         data->mask  = kdata.mask;
00156 
00157         return rc;
00158 }
00159 
00160 int nx_caps_set(nid_t nid, nx_flags_t *data)
00161 {
00162         struct vcmd_net_caps_v0 kdata;
00163 
00164         if (!data)
00165                 return errno = EINVAL, -1;
00166 
00167         kdata.ncaps = data->flags;
00168         kdata.cmask = data->mask;
00169 
00170         return vserver(VCMD_set_ncaps, nid, &kdata);
00171 }
00172 
00173 int nx_caps_get(nid_t nid, nx_flags_t *data)
00174 {
00175         struct vcmd_net_caps_v0 kdata;
00176 
00177         if (!data)
00178                 return errno = EINVAL, -1;
00179 
00180         int rc = vserver(VCMD_get_ncaps, nid, &kdata);
00181 
00182         if (rc == -1)
00183                 return rc;
00184 
00185         data->flags = kdata.ncaps;
00186         data->mask  = kdata.cmask;
00187 
00188         return rc;
00189 }
00190 
00191 int nx_sock_stat(nid_t nid, nx_sock_stat_t *data)
00192 {
00193         struct vcmd_sock_stat_v0 kdata;
00194 
00195         if (!data)
00196                 return errno = EINVAL, -1;
00197 
00198         kdata.field = data->id;
00199 
00200         int rc = vserver(VCMD_sock_stat, nid, &kdata);
00201 
00202         if (rc == -1)
00203                 return rc;
00204 
00205         data->count[0] = kdata.count[0];
00206         data->count[1] = kdata.count[1];
00207         data->count[2] = kdata.count[2];
00208 
00209         data->total[0] = kdata.total[0];
00210         data->total[1] = kdata.total[1];
00211         data->total[2] = kdata.total[2];
00212 
00213         return rc;
00214 }

Generated on Wed Jun 20 19:50:08 2007 for libvserver by  doxygen 1.5.2