Show More
@@ -1268,6 +1268,84 b' bail:' | |||
|
1268 | 1268 | PyMem_Free(name); |
|
1269 | 1269 | return file_obj; |
|
1270 | 1270 | } |
|
1271 | ||
|
1272 | static PyObject *getfstype(PyObject *self, PyObject *args) | |
|
1273 | /* given a directory path, return filesystem type name (best-effort) */ | |
|
1274 | { | |
|
1275 | const char *path = NULL; | |
|
1276 | char *fullpath = NULL; | |
|
1277 | char *volume = NULL; | |
|
1278 | DWORD size = 0; | |
|
1279 | char fstype[MAX_PATH + 1]; | |
|
1280 | ||
|
1281 | if (!PyArg_ParseTuple(args, "s", &path)) | |
|
1282 | return NULL; | |
|
1283 | ||
|
1284 | size = GetFullPathName(path, 0, NULL, NULL); | |
|
1285 | ||
|
1286 | if (size == 0) { | |
|
1287 | PyErr_SetFromWindowsErrWithFilename(GetLastError(), path); | |
|
1288 | return NULL; | |
|
1289 | } | |
|
1290 | ||
|
1291 | fullpath = calloc(size, sizeof(fullpath[0])); | |
|
1292 | volume = calloc(size, sizeof(volume[0])); | |
|
1293 | ||
|
1294 | if (!fullpath || !volume) { | |
|
1295 | PyErr_SetString(PyExc_MemoryError, "out of memory"); | |
|
1296 | goto bail; | |
|
1297 | } | |
|
1298 | ||
|
1299 | if (!GetFullPathName(path, size, fullpath, NULL)) { | |
|
1300 | PyErr_SetFromWindowsErrWithFilename(GetLastError(), path); | |
|
1301 | goto bail; | |
|
1302 | } | |
|
1303 | ||
|
1304 | if (!GetVolumePathName(fullpath, volume, size)) { | |
|
1305 | PyErr_SetFromWindowsErrWithFilename(GetLastError(), path); | |
|
1306 | goto bail; | |
|
1307 | } | |
|
1308 | ||
|
1309 | /* Even though the documentation says SMB doesn't support volume management | |
|
1310 | * functions, passing an SMB path to GetVolumeInformation() returns 'NTFS'. | |
|
1311 | * So bail unless this is known to _not_ be a network drive. */ | |
|
1312 | switch (GetDriveType(volume)) { | |
|
1313 | case DRIVE_FIXED: | |
|
1314 | case DRIVE_REMOVABLE: | |
|
1315 | case DRIVE_CDROM: | |
|
1316 | case DRIVE_RAMDISK: | |
|
1317 | break; | |
|
1318 | ||
|
1319 | case DRIVE_REMOTE: | |
|
1320 | free(fullpath); | |
|
1321 | free(volume); | |
|
1322 | return Py_BuildValue("s", "cifs"); | |
|
1323 | ||
|
1324 | case DRIVE_UNKNOWN: | |
|
1325 | case DRIVE_NO_ROOT_DIR: | |
|
1326 | default: | |
|
1327 | free(fullpath); | |
|
1328 | free(volume); | |
|
1329 | Py_RETURN_NONE; | |
|
1330 | } | |
|
1331 | ||
|
1332 | if (!GetVolumeInformation(volume, NULL, 0, NULL, NULL, NULL, fstype, | |
|
1333 | sizeof(fstype))) { | |
|
1334 | PyErr_SetFromWindowsErrWithFilename(GetLastError(), volume); | |
|
1335 | goto bail; | |
|
1336 | } | |
|
1337 | ||
|
1338 | free(fullpath); | |
|
1339 | free(volume); | |
|
1340 | return Py_BuildValue("s", fstype); | |
|
1341 | ||
|
1342 | bail: | |
|
1343 | if (fullpath) | |
|
1344 | free(fullpath); | |
|
1345 | if (volume) | |
|
1346 | free(volume); | |
|
1347 | return NULL; | |
|
1348 | } | |
|
1271 | 1349 | #endif |
|
1272 | 1350 | |
|
1273 | 1351 | #ifdef __APPLE__ |
@@ -1307,13 +1385,13 b' static PyMethodDef methods[] = {' | |||
|
1307 | 1385 | {"setprocname", (PyCFunction)setprocname, METH_VARARGS, |
|
1308 | 1386 | "set process title (best-effort)\n"}, |
|
1309 | 1387 | #endif |
|
1310 | #if defined(HAVE_BSD_STATFS) || defined(HAVE_LINUX_STATFS) | |
|
1388 | {"unblocksignal", (PyCFunction)unblocksignal, METH_VARARGS, | |
|
1389 | "change signal mask to unblock a given signal\n"}, | |
|
1390 | #endif /* ndef _WIN32 */ | |
|
1391 | #if defined(HAVE_BSD_STATFS) || defined(HAVE_LINUX_STATFS) || defined(_WIN32) | |
|
1311 | 1392 | {"getfstype", (PyCFunction)getfstype, METH_VARARGS, |
|
1312 | 1393 | "get filesystem type (best-effort)\n"}, |
|
1313 | 1394 | #endif |
|
1314 | {"unblocksignal", (PyCFunction)unblocksignal, METH_VARARGS, | |
|
1315 | "change signal mask to unblock a given signal\n"}, | |
|
1316 | #endif /* ndef _WIN32 */ | |
|
1317 | 1395 | #ifdef __APPLE__ |
|
1318 | 1396 | { |
|
1319 | 1397 | "isgui", (PyCFunction)isgui, METH_NOARGS, |
@@ -1323,7 +1401,7 b' static PyMethodDef methods[] = {' | |||
|
1323 | 1401 | {NULL, NULL} |
|
1324 | 1402 | }; |
|
1325 | 1403 | |
|
1326 |
static const int version = |
|
|
1404 | static const int version = 3; | |
|
1327 | 1405 | |
|
1328 | 1406 | #ifdef IS_PY3K |
|
1329 | 1407 | static struct PyModuleDef osutil_module = { |
General Comments 0
You need to be logged in to leave comments.
Login now